【问题标题】:How to handle Cassandra lost connections?如何处理 Cassandra 丢失的连接?
【发布时间】:2018-01-30 01:17:49
【问题描述】:

我对使用 DataStax C++ 驱动程序的 Cassandra 开发相当陌生。我目前正在使用 Cassandra 3.9 和 DataStax C++ 驱动程序 2.6。在我的 C++ 应用程序中,我试图捕捉驱动程序失去与 Cassandra 的连接的情况,然后让应用程序重新尝试与 Cassandra 建立连接。我这样做如下:

  1. 通过检查 cass_future_error_code(connection) != CASS_OK 在执行查询之前捕获丢失的连接。如果结果为真,那么我知道连接丢失了。
  2. 我关闭会话,释放会话,释放集群以释放资源。
  3. 我重新创建资源并尝试重新连接到 Cassandra。

这种方法将在一个单独的线程中重复,直到重新建立连接。我通过关闭 Cassandra 服务器对此进行了测试。我曾预计应用程序会继续重试建立连接,直到 Cassandra 服务器可以重新启动并建立连接。但是,发生的事情是驱动程序抛出以下错误并且我的应用程序终止:

1503345418.300 [WARN] (src/control_connection.cpp:267:virtual void cass::ControlConnection::on_close(cass::Connection*)): Lost control connection to host xx.xx.xx.xx with the following error: Read error 'connection reset by peer'
1503345418.300 [ERROR] (src/pool.cpp:384:virtual void cass::Pool::on_close(cass::Connection*)): Closing established connection pool to host xx.xx.xx.xx because of the following error: Read error 'connection reset by peer'
Error: Request timed out

有没有更好的方法来处理丢失的 Cassandra 连接并实现连接重试?任何示例或指向示例的指针将不胜感激。

【问题讨论】:

    标签: c++ datastax cassandra-3.0


    【解决方案1】:

    DataStax C/C++ 驱动程序自动处理重新连接。 cass_cluster_set_reconnect_wait_time(Cluster*, time_in_ms) 可用于限制重新连接尝试(默认为 2 秒); https://github.com/datastax/cpp-driver/blob/2.6.0/include/cassandra.h#L1080-L1092。当驱动程序检测到某个节点已关闭时,它会自动尝试重新连接。

    【讨论】:

    • 当连接丢失并且客户端应用程序尝试提交查询时会发生什么?查询是否被丢弃?你知道处理这种情况的任何例子吗?
    • 如果是单节点集群,并且节点当前不可用,应该得到CASS_ERROR_LIB_NO_HOSTS_AVAILABLE;在这种情况下,查询将被丢弃(或永远不会在服务器上执行)。由客户端应用程序重新执行查询。
    • 感谢您的回复。我感谢您的帮助。 :-)
    • 如果你有一个双节点集群并且没有连接到任何一个节点,同样的逻辑是否适用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2015-01-14
    相关资源
    最近更新 更多