我最近开始使用 Cassandra
在我们的 Production environment
. 我们有一个 24 node cluster
与 replication factor of 4
. 意义 2 copies
会在那里的 each datacenter
. 所以这意味着我们有一个单一的交叉colo集群 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
方法i将只传递与 one datacenter
. 它将是slc或phx。所以,如果你看一下我下面的代码,我已经在我的代码中指定了2个节点 setSeeds method
所有这些节点都属于 PHX colo
. 现在,我正在尝试启用自动发现模式,但只针对特定的colo。因此,在我的情况下,它应该能够检测phx colo的12个节点,而不是所有的24个节点。
下面是我使用的代码 ConnectionPoolType
作为 TOKEN_AWARE
默认情况下使用 NodeDiscoveryType
作为 RING_DESCRIBE
这会让我看到 24 nodes
对应于 colos/datacenter
这就是我不想要的。我需要所有节点对应于每个colo/数据中心
你知道如何使用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是否只支持本地节点的自动发现?
为什么我问这个问题是因为环描述,它会给我所有的节点从这两个colo。所以假设我运行我的程序从phx colo然后它可能会去slc colo获得数据,因为我看到非常糟糕的写性能的原因phx和slc之间的ping时间是15-20毫秒。
2条答案
按热度按时间ev7lccsx1#
使用nodediscoverytype ring\u descripe(或token\u aware with no hostsupplier),astynax将发现所有节点,但您也应该使用setlocaldatacenter。使用connectionpoolconfigurationimpl设置astyanaxcontext时,请使用所需dc的setlocaldatacenter。这将确保来自其他dc的主机不在连接池中,并且您的请求是本地的。
同样,我的理解是nodediscoverytype of token \u aware(不设置hostsupplier)或ring \u descripe都会导致在astynax中使用ringdescripbehostsupplier。因此,astyanax将“知道”所有节点,但是连接池将被限制(通过setlocaldatacenter)到指定的dc。
ocebsuys2#
尝试
NodeDiscoveryType.TOKEN_AWARE
从astyanax文档可以说,它是为多区域环描述问题而设计的,其中环描述来自其他区域或数据中心的返回节点