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

时间:2013-05-09 00:55:48

标签: java cassandra astyanax netflix

我最近开始在Cassandra中使用Production environment。我们有24 node cluster replication factor of 4。含义2 copies将出现在each datacenter中。这意味着我们有一个带有24 nodes的交叉colo群集,这意味着12 nodes in SLC colo12 nodes in PHX colo

我正在使用Astyanax clientCassandra 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的代码,默认情况下使用NodeDiscoveryType作为RING_DESCRIBE,这将显示24 nodes所有colos/datacenter对应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()); } 和我不想要的东西。我需要拥有与每个colo / datacenter相对应的所有节点

任何想法如何使用Astyanax客户端实现这种情况?这可能吗?

{{1}}

简而言之,astynanx仅支持本地节点的自动发现吗?

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

2 个答案:

答案 0 :(得分:2)

使用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的NodeDiscoveryType(没有设置HostSupplier)或RING_DESCRIBE都会导致在Astyanax中使用RingDescribeHostSupplier。因此,Astyanax将“了解”所有节点,但连接池将受限(通过setLocalDatacenter)到指定的DC。

答案 1 :(得分:0)

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