【问题标题】:Upgrade issue in Application querying schema_keyspaces and using RoundRobin policy应用程序查询 schema_keyspaces 和使用 RoundRobin 策略中的升级问题
【发布时间】:2019-04-09 13:31:09
【问题描述】:

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

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

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

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

现在考虑升级 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 并成功重新启动。但这对我来说似乎很难看。

【问题讨论】:

    标签: cassandra datastax-java-driver


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢 Alex 的回复,问题出在我们最新版本的代码中,我们提供了配置原生协议版本,并且在升级过程中我们确保升级后的节点应该只使用协议版本 3 而不是 4 ,但在旧代码中没有相同的配置..我们不能更改旧的部署代码。
    • 是的,那就是问题 - 所以你需要让它重新启动,但我不记得,如果在旧版本的驱动程序中,接触点的洗牌发生与否。您可以查看这张票:datastax-oss.atlassian.net/browse/JAVA-618 - 如果您使用的驱动程序版本低于 2.0.11,那么您需要更改旧应用程序中的联系点。
    • 我们的驱动程序版本>2.0..我已经通过重新启动测试了 suffling 功能...在第 6 次重新启动时,我的应用程序成功启动:p...虽然令人沮丧,但它可以工作跨度>
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-12-09
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多