【问题标题】:Does astyanax support autodiscovery mode for local nodes only?astyanax 是否仅支持本地节点的自动发现模式?
【发布时间】:2013-05-03 09:21:02
【问题描述】:

我最近开始在我们的Production environment 中使用Cassandra。我们有一个24 node clusterreplication factor of 4。意思是2 copies 将出现在each datacenter 中。所以这意味着我们有一个带有24 nodes 的交叉colo 集群,这意味着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,这将显示与colos/datacenter 对应的所有24 nodes,这就是我不想要。我需要让所有节点对应于每个 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 毫秒。

【问题讨论】:

    标签: java cassandra astyanax netflix


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经尝试过了,但它总是给我所有数据中心的所有节点。
      猜你喜欢
      • 2022-12-13
      • 2019-09-18
      • 1970-01-01
      • 2011-05-10
      • 2018-03-02
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多