我最近开始Cassandra
在我们的Production environment
. 我们有一个24 node cluster
with 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 个节点。
下面是我使用ConnectionPoolType
asTOKEN_AWARE
的代码,默认情况下使用NodeDiscoveryType
as 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 毫秒。