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

f0brbegy  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(311)

我最近开始使用 Cassandra 在我们的 Production environment . 我们有一个 24 node clusterreplication 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毫秒。

n9vozmp4

n9vozmp41#

尝试 NodeDiscoveryType.TOKEN_AWARE 从astyanax文档可以说,它是为多区域环描述问题而设计的,其中环描述来自其他区域或数据中心的返回节点

zf9nrax1

zf9nrax12#

使用nodediscoverytype ring\u descripe(或token\u aware with no hostsupplier),astynax将发现所有节点,但您也应该使用setlocaldatacenter。使用connectionpoolconfigurationimpl设置astyanaxcontext时,请使用所需dc的setlocaldatacenter。这将确保来自其他dc的主机不在连接池中,并且您的请求是本地的。

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

同样,我的理解是nodediscoverytype of token \u aware(不设置hostsupplier)或ring \u descripe都会导致在astynax中使用ringdescripbehostsupplier。因此,astyanax将“知道”所有节点,但是连接池将被限制(通过setlocaldatacenter)到指定的dc。

相关问题