我最近开始Cassandra在我们的Production environment. 我们有一个24 node clusterwith replication factor of 4。意义2 copies将在那里each datacenter。所以这意味着我们有一个单一的交叉结肠集群,24 nodes其中12 nodes in SLC colo和12 nodes in PHX colo。
我正在使用Astyanax client将数据写入Cassandra database. 现在我想弄清楚是否有任何方法Astyanax client能够找出所有nodes in the PHX colo or SLC colo节点而不是所有节点?
在我的setSeeds方法中,我将传递仅与one datacenter. 它将是 SLC 或 PHX。因此,如果您查看我下面的代码,我在我的代码中指定了 2 个节点setSeeds method,所有这些节点都属于PHX colo. 现在我正在尝试启用自动发现模式,但仅适用于那个特定的 colo。因此,在我的情况下,它应该能够检测 PHX colo 的 12 个节点,而不是所有 24 个节点。
下面是我使用ConnectionPoolTypeasTOKEN_AWARE的代码,默认情况下使用NodeDiscoveryTypeas RING_DESCRIBE,它将向我显示24 nodes与两者相对应的所有colos/datacenter内容,这就是我不想要的。我需要拥有与每个 colo/datacenter 对应的所有节点
知道如何使用 Astyanax 客户端实现这种情况吗?这可能吗?
private CassandraAstyanaxConnection() {
context = new AstyanaxContext.Builder()
.forCluster(ModelConstants.CLUSTER)
.forKeyspace(ModelConstants.KEYSPACE)
.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(40)
.setSeeds("cdb03.vip.phx.host.com:9160,cdb04.vip.phx.host.com:9160")
)
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setCqlVersion("3.0.0")
.setTargetCassandraVersion("1.2")
.setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE))
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());
context.start();
keyspace = context.getEntity();
emp_cf = ColumnFamily.newColumnFamily(
ModelConstants.COLUMN_FAMILY,
StringSerializer.get(),
StringSerializer.get());
}
简而言之 - astynanx 是否仅支持本地节点的自动发现?
为什么我问这个是因为 RING_DESCRIBE,它会给我来自两个 colo 的所有节点。所以假设如果我从 PHX colo 运行我的程序,那么它可能会去 SLC colo 获取数据,并且由于我看到非常糟糕的写入性能,因为 PHX 和 SLC 之间的 ping 时间为 15-20 毫秒。