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.
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 đó.? –
@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
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? –