我最近开始在Cassandra
中使用Production environment
。我们有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
。现在我正在尝试启用自动发现模式,但仅针对该特定颜色。所以在我的情况下,它应该能够检测到PHX colo的12个节点而不是所有24个节点。
以下是我使用ConnectionPoolType
作为TOKEN_AWARE
的代码,默认情况下使用NodeDiscoveryType
作为RING_DESCRIBE
,这将显示24 nodes
所有colos/datacenter
对应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());
}
和我不想要的东西。我需要拥有与每个colo / datacenter相对应的所有节点
任何想法如何使用Astyanax客户端实现这种情况?这可能吗?
{{1}}
简而言之,astynanx仅支持本地节点的自动发现吗?
为什么我问这是因为RING_DESCRIBE,它会给我来自colo的所有节点。因此,如果我从PHX colo运行我的程序,那么它可能会转到SLC colo获取数据,因为我看到非常差的写入性能,因为PHX和SLC之间的ping时间是15-20 ms。 / p>
答案 0 :(得分:2)
使用NodeDiscoveryType RING_DESCRIBE(或没有HostSupplier的TOKEN_AWARE)Astyanax将发现所有节点,但您还应该使用setLocalDatacenter。使用ConnectionPoolConfigurationImpl设置AstyanaxContext时,请使用带有所需DC的setLocalDatacenter。这将确保来自其他DC的主机不在连接池中,并且您的请求是本地的。
.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(40)
.setLocalDatacenter("DC1")
.setSeeds("127.0.0.1:9160")
)
同样,我的理解是,TOKEN_AWARE的NodeDiscoveryType(没有设置HostSupplier)或RING_DESCRIBE都会导致在Astyanax中使用RingDescribeHostSupplier。因此,Astyanax将“了解”所有节点,但连接池将受限(通过setLocalDatacenter)到指定的DC。
答案 1 :(得分:0)
尝试使用NodeDiscoveryType.TOKEN_AWARE
,从astyanax文档中可以说,它被设计为多区域环描述问题,其中环描述来自其他区域或数据中心的返回节点