【问题标题】:How to use all the four nodes to make the connection to cassandra database如何使用所有四个节点连接到 cassandra 数据库
【发布时间】:2023-03-24 13:32:01
【问题描述】:

我最近开始使用 Cassandra 数据库,我正在使用 Netflix 客户端从 Cassandra 数据库中填充和读取数据。

我有一个包含四个节点的集群。我已经创建了这样的键空间-

        create keyspace profilekeyspace
        with placement_strategy = 'NetworkTopologyStrategy'
        and strategy_options = {DC2 : 1, DC1 : 1}
        and durable_writes = true;

我的专栏家族名称是-profile_columnfamily

这是我的四个节点-

      lp-host01.vip.slc.qa.host.com:9160
      lp-host02.vip.slc.qa.host.com:9160
      lp-host03.vip.phx.qa.host.com:9160
      lp-host04.vip.phx.qa.host.com:9160

现在我只使用上面的一个节点来连接到 Cassandra 数据库并填充数据。但是我的 DBA 说,您需要使用所有四个节点来建立连接。

private AstyanaxContext<Keyspace> context;

private CassandraAstyanaxConnection() {

    context = new AstyanaxContext.Builder()
    .forCluster("TEST CLUSTER")
    .forKeyspace("PROFILE")
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()     
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
        .setPort(9160)
        .setMaxConnsPerHost(1)
        .setSeeds("lp-host01.vip.slc.qa.host.com:9160:9160")//using only node from above to make the connection
    )
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()     
        .setCqlVersion("3.0.0")
        .setTargetCassandraVersion("1.2"))
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());

    context.start();
    keyspace = context.getEntity();

    emp_cf = ColumnFamily.newColumnFamily(
        "PROFILE_COLUMNFAMILY",
        StringSerializer.get(),
        StringSerializer.get());
}

现在我不确定如何使用所有四个节点通过 Netflix 客户端建立连接?谁能帮我解决这个问题?

感谢您的帮助。

【问题讨论】:

    标签: java cassandra astyanax


    【解决方案1】:

    种子列表是一个逗号分隔的列表。所以你可以在 setSeeds 调用中添加其余部分:

    setSeeds("server1:9160,server2:9160,server3:9160")

    此外,Astyanax 将发现环中的其他服务器。您只需要列出一个即可发现所有其他服务器,但如果该服务器已关闭,您需要列出更多。很像 cassandra.yaml 中的种子列表。

    请注意,您已经复制了行中的端口:

    .setSeeds("lp-host01.vip.slc.qa.host.com:9160:9160")

    【讨论】:

    • 是的,我会纠正的。误会了。所以一般来说你说我们应该只使用一个节点来建立连接。但是由于某种原因假设特定节点已关闭?那么与 Cassandra 数据库的整个连接会丢失吗?所以在这种情况下,最好的方法是连接到所有四个节点,如果其中任何一个节点关闭,是否可以使用其他节点来建立连接?对吗?
    • 给 setSeeds 的列表不是要连接的节点列表,它是使用种子发现所有其余节点的节点列表。然后 Astyanax 连接到所有这些。但是,如果您有一个种子节点并且它已关闭,那么当您的应用程序启动时它不会找到任何节点,因此会失败。出于这个原因,您希望将几个节点列为种子,但不必是所有节点。
    • 谢谢理查德。这完全有道理。最后一个问题,您能否检查一下我与 Cassandra 数据库建立连接的方式是否存在任何问题,这会在读取数据时影响性能?正如上面的 sn-p 代码,将在我的 Singleton 类中,所以我只创建一次连接,然后我每次都重用它。
    • 这会创建一个连接池。只要您将它与多线程访问一起使用,您就会获得良好的性能。
    • 是的,我正在使用多线程代码,只创建一次连接,然后每次都重用它。所以你觉得应该没问题吧?
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2013-04-27
    • 2014-04-11
    • 2018-05-08
    • 2019-12-11
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多