在我们的java应用程序版本1中,它使用的是cassandra 2.1
在启动时,我们正在执行查询:“selectfrom system.schema\u keyspaces;”获取键空间信息(如果失败,应用程序将无法启动)
然而,新的代码我们从驱动程序的cluster.metadata示例中获取keypspace信息,该示例使用的是cassandra3.11
我们正在使用java datastax驱动程序的dc感知循环负载平衡策略。
现在考虑升级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节点上的client application+peers表的接触点中删除a的ip。现在重新启动客户端应用程序。然后cassandra恢复对等表条目。
另一种方法是继续在c上重新启动客户机应用程序,直到客户机应用程序查询实际到达cassandra2.1并成功地重新启动。但我觉得这很难看。
1条答案
按热度按时间bf1o4zei1#
在您的应用程序中,最好显式地将协议版本设置为与cassandra2.1匹配,而不是试图依赖自动协商特性。驱动程序的文档中明确说明了这一点。
根据兼容性矩阵,您需要显式地将protocol version设置为v3,但这也取决于驱动程序版本,因此您可能需要坚持使用版本2。
升级到3.11后,您可以切换到协议版本4。