1

我最近开始Cassandra在我们的Production environment. 我们有一个24 node clusterwith replication 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。因此,如果您查看我下面的代码,我在我的代码中指定了 2 个节点setSeeds method,所有这些节点都属于PHX colo. 现在我正在尝试启用自动发现模式,但仅适用于那个特定的 colo。因此,在我的情况下,它应该能够检测 PHX colo 的 12 个节点,而不是所有 24 个节点。

下面是我使用ConnectionPoolTypeasTOKEN_AWARE的代码,默认情况下使用NodeDiscoveryTypeas RING_DESCRIBE,它将向我显示24 nodes与两者相对应的所有colos/datacenter内容,这就是我不想要的。我需要拥有与每个 colo/datacenter 对应的所有节点

知道如何使用 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 毫秒。

4

2 回答 2

2

使用 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。

于 2013-05-09T22:24:28.293 回答
0

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

于 2013-05-09T05:22:56.150 回答