我最近开始在我们的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。现在,我尝试启用自动发现模式,但仅针对该特定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是否仅支持本地节点的自动发现?

我之所以这样问,是因为RING_DESCRIBE,它将为我提供来自两个colo的所有节点。因此,假设我是从PHX colo运行程序,则可能会去SLC colo获取数据,由于这个原因,由于PHX和SLC之间的ping时间为15-20毫秒,因此我看到了非常差的写入性能。

最佳答案

使用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(未设置HostSupplier的)或RING_DESCRIBE的NodeDiscoveryType都将导致RingtyscribeHostSupplier在Astyanax中使用。因此,Astyanax将“知道”所有节点,但是连接池将(通过setLocalDatacenter)限制为指定的DC。

09-05 01:26