2013-04-24 16 views
5

Tôi đang đọc dữ liệu từ cơ sở dữ liệu Cassandra bằng ứng dụng Astyanax.Kết nối tối đa của máy khách Astyanax trên mỗi nút?

Tôi có khoảng một triệu hàng duy nhất trong cơ sở dữ liệu Cassandra. Tôi có một cụm chéo colocation centre với bốn nút.

Đây là bốn nút của tôi:

node1:9160 
    node2:9160 
    node3:9160 
    node4:9160 

tôi đã kích hoạt KeyCaching và chiến lược SizeTieredCompaction được kích hoạt là tốt.

Tôi có một chương trình máy khách đa luồng sẽ đọc dữ liệu từ cơ sở dữ liệu Cassandra bằng ứng dụng Astyanax và tôi đang chạy với 20 luồng. Nếu tôi đang chạy chương trình máy khách của tôi với 20 luồng, thì hiệu năng đọc dữ liệu từ cơ sở dữ liệu Cassandra sẽ giảm đi. Vì vậy, điều đầu tiên nhảy vào tâm trí của tôi là có thể có tranh chấp về kết nối với Cassandra (họ có sử dụng một hồ bơi, nếu như vậy có bao nhiêu kết nối đang được duy trì) không? Không. Tôi đang sử dụng mã dưới đây để tạo kết nối bằng ứng dụng Astyanax.

private CassandraAstyanaxConnection() { 
    context = new AstyanaxContext.Builder() 
    .forCluster(ModelConstants.CLUSTER) 
    .forKeyspace(ModelConstants.KEYSPACE) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) 
    ) 
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") 
     .setPort(9160) 
     .setMaxConnsPerHost(1) 
     .setSeeds("nod1:9160,node2:9160,node3:9160,node4:9160") 
    ) 
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() 
     .setCqlVersion("3.0.0") 
     .setTargetCassandraVersion("1.2")) 
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) 
    .buildKeyspace(ThriftFamilyFactory.getInstance()); 

    context.start(); 
    keyspace = context.getEntity(); 

    emp_cf = ColumnFamily.newColumnFamily(
     ModelConstants.COLUMN_FAMILY, 
     StringSerializer.get(), 
     StringSerializer.get()); 
} 

Tôi có cần thực hiện bất kỳ thay đổi nào trong mã trên để cải thiện hiệu suất không?

Phương pháp này làm gì?

setMaxConnsPerHost(1) 

Tôi có cần tăng điều đó để cải thiện hiệu suất không? Tôi có bốn nút, vì vậy tôi nên thay đổi nó thành 4?

Và sẽ gọi phương thức setMaxConns (20)? Tôi có cần thêm điều đó để cải thiện hiệu suất không? Vì tôi sẽ chạy chương trình của tôi với nhiều luồng.

Trả lời

9

Để biết chi tiết về maxConnsPerHost/maxConns Bạn có thể kiểm tra câu trả lời này: setMaxConns and setMaxConnsPerHost in Astyanax client

Và vâng, maxConnsPerHost cần được tăng lên để đạt được hiệu suất tốt. Giá trị tối ưu tùy thuộc vào cấu trúc liên kết mạng, yêu cầu hệ số sao lưu, cấu hình lưu trữ, bộ nhớ đệm, tỷ lệ đọc/ghi, v.v.

Tôi không thể đạt được hiệu suất tối ưu cho cụm được tải nặng mà không cần thử nghiệm và mô phỏng.

Đối với nhiệm vụ có tải trọng vừa phải trên Cassandra Tôi thường sử dụng một quy tắc của ngón tay cái:

maxConnsPerHost ~= <Number of cores per host>/<Replication factor> + 1 

Đó là, đối với một tập hợp các hộp 8-core với yếu tố sao chép 3, maxConnsPerHost nên xung quanh 4. Giá trị này cũng là một điểm khởi đầu tốt cho các thí nghiệm trong các kịch bản tải nặng.

Động lực: một cụm N các nút có mỗi số C có tổng số lõi là N * C. Để xử lý yêu cầu với nhân tố R, R lõi (của các nút khác nhau) được yêu cầu. Vì vậy, tại mọi thời điểm nhất định, cụm có thể xử lý lên đến N * C/R yêu cầu. Bạn nên giữ số lượng kết nối đồng thời xung quanh số này. Chia nó theo N để tính số lượng kết nối cho mỗi máy chủ. Thêm 1 kết nối dự phòng cho mỗi máy chủ cho độ trễ mạng, v.v.

Cập nhật: đơn giản hiệu suất khách hàng điều chỉnh:

  • Bắt đầu với một số giá trị maxConnsPerHost
  • tải Mô phỏng và quan sát sử dụng CPU và org.apache.cassandra.request->***Stage->pendingTasks JXM thuộc tính
  • Tăng maxConnsPerHost cho đến khi pendingTasks bắt đầu tăng nhanh. Đây có lẽ là giá trị tối ưu.
  • Tải CPU trên các nút cụm phải ở khoảng 50-70%. Nếu nó ít hơn nhiều - có lẽ có điều gì đó sai với cấu hình máy chủ.
+0

Cảm ơn Wildfire vì đề xuất. Đánh giá cao sự giúp đỡ của bạn. Và còn setMaxConns thì sao? Chúng ta nên đặt giá trị nào cho điều đó? Loại logic nào chúng ta thường làm theo để quyết định điều đó.? –

+0

@FarhanJamal: setMaxConns chỉ được sử dụng với ConnectionPoolType.BAG, nó chỉ bị bỏ qua trong các triển khai khác. Nếu bạn sử dụng nhóm kết nối BAG, bạn có thể đặt thuộc tính này thành số lượng chuỗi tối đa có thể gửi yêu cầu tới Cassandra cùng một lúc. – Wildfire

+0

Cảm ơn bạn đã đề xuất. Nói chung, tôi nên sử dụng hồ bơi kết nối nào? Có nghĩa là những gì kết nối tổng hợp sẽ cho phép tôi có hiệu suất đọc nhanh hơn. Hiện tại, trong ví dụ trên, tôi đang sử dụng 'ConnectionPoolConfigurationImpl'. Bạn có bất cứ đề nghị cho điều đó không? –