首页 > 解决方案 > 应用程序查询 schema_keyspaces 和使用 RoundRobin 策略中的升级问题

问题描述

在我们使用 cassandra 2.1 的 Java 应用程序版本 1 中

在启动时,我们正在执行查询:“*SELECT * from system.schema_keyspaces;*”以获取键空间信息(如果失败,应用程序将无法启动)

然而,我们正在从使用 cassandra 3.11 的驱动程序的 cluster.metadata 实例中获取 keypspace 信息的新代码

我们正在使用 java datastax 驱动程序的 DC 感知 RoundRobin 负载平衡策略。

现在考虑升级 3 个节点的场景:A、B 和 C,其中 A 已升级(新应用程序 + Cassandra 3.11),B 上的升级正在进行中(Cassandra 在此处关闭),C 未升级(旧应用程序 + Cassandra 2.1)。并且您在 C 节点上的客户端应用程序将重新启动。

如果 C 节点的 java 客户端上的旧查询在 A 上执行(因为客户端将以循环方式发送查询),我将收到 InvalidQueryException。如果失败,则旧应用程序中没有处理。我们如何解决这个问题?

com.datastax.driver.core.exceptions.InvalidQueryException: un-configured table schema_keyspaces

我发现从 C Cassandra 节点上的客户端应用程序 + 对等表的联系点中删除 A 的 Ip 的一种方法。现在重新启动客户端应用程序。然后 Cassandra 恢复 peers 表条目。

其他方法是继续在 C 上重新启动客户端应用程序,直到客户端应用程序查询实际命中 Cassandra 2.1 并成功重新启动。但这对我来说似乎很丑陋。

标签: cassandradatastax-java-driver

解决方案


在您的应用程序中,最好明确设置协议版本以匹配 Cassandra 2.1,而不是尝试依赖自动协商功能。驱动程序的文档明确说明了这一点。

根据兼容性矩阵,您需要将协议版本显式设置为 V3,但这也取决于驱动程序版本,因此您可能需要坚持使用版本 2。

Cluster cluster = Cluster.builder()
    .addContactPoint("xxxx")
    .withProtocolVersion(ProtocolVersion.V3)
    .build();

升级到 3.11 后,您可以切换到协议版本 4。


推荐阅读