如何处理 Cassandra 丢失的连接?
Posted
技术标签:
【中文标题】如何处理 Cassandra 丢失的连接?【英文标题】:How to handle Cassandra lost connections? 【发布时间】:2018-01-30 01:17:49 【问题描述】:我对使用 DataStax C++ 驱动程序的 Cassandra 开发相当陌生。我目前正在使用 Cassandra 3.9 和 DataStax C++ 驱动程序 2.6。在我的 C++ 应用程序中,我试图捕捉驱动程序失去与 Cassandra 的连接的情况,然后让应用程序重新尝试与 Cassandra 建立连接。我这样做如下:
-
通过检查 cass_future_error_code(connection) != CASS_OK 在执行查询之前捕获丢失的连接。如果结果为真,那么我知道连接丢失了。
我关闭会话,释放会话,释放集群以释放资源。
我重新创建资源并尝试重新连接到 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 连接并实现连接重试?任何示例或指向示例的指针将不胜感激。
【问题讨论】:
【参考方案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
;在这种情况下,查询将被丢弃(或永远不会在服务器上执行)。由客户端应用程序重新执行查询。
感谢您的回复。我感谢您的帮助。 :-)
如果你有一个双节点集群并且没有连接到任何一个节点,同样的逻辑是否适用?以上是关于如何处理 Cassandra 丢失的连接?的主要内容,如果未能解决你的问题,请参考以下文章