gpt4 book ai didi

java - astyanax 是否仅支持本地节点的自动发现模式?

转载 作者:行者123 更新时间:2023-11-30 04:23:22 25 4
gpt4 key购买 nike

我最近开始使用Cassandra在我们的Production environment 。我们有一个24 node clusterreplication factor of 4 。含义2 copies将会在 each datacenter 中出现。这意味着我们有一个跨主机集群 24 nodes这意味着12 nodes in SLC colo12 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默认情况下使用 NodeDiscoveryTypeRING_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 仅支持本地节点的自动发现吗?

为什么我问这个是因为 RING_DESCRIBE,它会给我来自两个 colo 的所有节点。因此,假设如果我从 PHX colo 运行我的程序,那么它可能会转到 SLC colo 获取数据,并且由于 PHX 和 SLC 之间的 ping 时间为 15-20 毫秒,我看到写入性能非常差。

最佳答案

使用NodeDiscoveryType RING_DESCRIBE(或没有HostSupplier的TOKEN_AWARE)Astyanax将发现所有节点,但您还应该使用setLocalDatacenter。使用 ConnectionPoolConfigurationImpl 设置 AstyanaxContext 时,请使用 setLocalDatacenter 和所需的 DC。这将确保来自其他 DC 的主机不在连接池中,并且您的请求是本地的。

.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(40)
.setLocalDatacenter("DC1")
.setSeeds("127.0.0.1:9160")
)

同样,我的理解是,TOKEN_AWARE(未设置 HostSupplier)或 RING_DESCRIBE 的 NodeDiscoveryType 都将导致在 Astyanax 中使用 RingDescribeHostSupplier。因此,Astyanax 将“了解”所有节点,但连接池将仅限于(通过 setLocalDatacenter)指定的 DC。

关于java - astyanax 是否仅支持本地节点的自动发现模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com