【发布时间】:2013-05-03 09:21:02
【问题描述】:
我最近开始在我们的Production environment 中使用Cassandra。我们有一个24 node cluster 和replication factor of 4。意思是2 copies 将出现在each datacenter 中。所以这意味着我们有一个带有24 nodes 的交叉colo 集群,这意味着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。因此,如果您查看我的以下代码,我在 setSeeds method 中指定了 2 个节点,并且所有这些节点都属于 PHX colo。现在我正在尝试启用自动发现模式,但仅适用于那个特定的 colo。所以在我的情况下,它应该能够检测到 PHX colo 的 12 个节点,而不是所有 24 个节点。
下面是我的代码,其中我使用ConnectionPoolType 作为TOKEN_AWARE,默认情况下使用NodeDiscoveryType 作为RING_DESCRIBE,这将显示与colos/datacenter 对应的所有24 nodes,这就是我不想要。我需要让所有节点对应于每个 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 毫秒。
【问题讨论】:
标签: java cassandra astyanax netflix