Datastax Cassandra C/C++ 驱动程序 cass_cluster_set_blacklist_filtering 功能

Datastax Cassandra C/C++ driver cass_cluster_set_blacklist_filtering functionality

Datastax C/C++ 驱动程序具有黑名单过滤功能作为其负载平衡控制的一部分。

https://docs.datastax.com/en/developer/cpp-driver/2.5/topics/configuration/

如果我遗漏了什么但我的理解是 CQL 客户端无法连接到列入黑名单的主机,请纠正我。

我正在使用 C/C++ 驱动程序 v2.5 和以下代码块并尝试连接到多节点集群:

CassCluster* cluster = cass_cluster_new();
CassSession* session = cass_session_new();
const char* hosts    = "192.168.57.101";
cass_cluster_set_contact_points(cluster, hosts);
cass_cluster_set_blacklist_filtering(cluster, hosts);
CassFuture* connect_future = cass_session_connect(session, cluster);

在此代码块中,CQL 客户端尝试连接的主机被设置为黑名单。但是,CQL 客户端似乎连接到该主机并执行任何查询。上面的代码块有问题吗?如果不是这样,这是预期的行为吗?它的行为是否因为它是一个多节点集群并与其他对等点建立连接而有所不同?

我们将不胜感激。

提前致谢

由于您只提供一个联系点,因此该 IP 地址用于建立到集群的控制连接。一旦建立了控制连接并读取对等节点 table 以确定集群中可用的其他节点,就会与其他节点建立连接。此时,所有查询都将路由到其他节点,而不是您的 initial/blacklisted 联系点;但是与初始联系点的连接将保留,因为它是集群的控制连接。

为了更好地了解驱动程序内部的情况,您可以在驱动程序中启用日志记录。以下是通过控制台启用日志记录的示例:

void on_log(const CassLogMessage* message, void* data) {
  fprintf(stderr, "%u.%03u [%s] (%s:%d:%s): %s\n",
  (unsigned int) (message->time_ms / 1000),
  (unsigned int) (message->time_ms % 1000),
  cass_log_level_string(message->severity),
  message->file, message->line, message->function,
  message->message);
}

/* Log configuration *MUST* be done before any other driver call */
cass_log_set_level(CASS_LOG_TRACE);
cass_log_set_callback(on_log, NULL);

为了减少将被列入黑名单的节点上的额外连接,您可以向集群提供与将被列入黑名单的节点(或多个节点)不同的不同联系点。