背景和观察:
我有一个在生产环境中运行的 3 节点集群(版本 3.11)。对于迁移,我首先尝试使用 cassandra 4.1.2 版本创建 1 个新节点,并将这些节点添加到现有集群中。要添加这些节点,我必须运行-Dcassandra.skip_schema_check=true
命令,否则新节点在启动时会失败。当我能够在现有集群中添加这些节点后,我发现数据没有从版本 3 流到版本 4 节点的新节点。这里的想法是,一旦数据复制到版本 4 节点,我们就可以一一关闭版本 3 节点,这将是一个平滑的迁移。
这里从 3.x 迁移到 4.x 的文档建议迁移应该逐个节点完成,我应该首先删除一个节点,然后在该节点上设置 cassandra 4,然后使用相同的数据文件运行 cassandra 4然后对所有节点执行相同的操作。
问题:
我的问题是,如果我继续采用 datastax 文档中提到的方法,那么有一天版本 4 和版本 3 将共存,而我的读/写负载仍将进入集群。在此期间,2 个不同版本节点之间不会发生数据传输,因此前往版本 4 节点的写入请求将不会复制到版本 3 节点,反之亦然。这将导致数据不一致,直到所有节点都迁移并开始相互通信。我们假设数据最终会保持一致,但如果在此过程中出现任何问题,我们将无法解决生产中不一致的数据。那么我可以采取哪些步骤来确保不存在数据不一致,并且如果出现问题,有一些更简单的方法来纠正数据。我还想了解为什么 cassandra 不支持上述第一种方法,因为从迁移的角度来看,这对于开发人员来说似乎是一种更简单的方法。
有几个用户运行 Cassandra 并升级它们,几十年来他们的应用程序没有任何停机时间。
这不是推荐的方法。如果您担心现有集群无法承受负载,并且当有一个节点将被关闭以重新启动二进制升级后(从 3.0 开始)时,您的应用程序没有使用正确的一致性级别进行读/写。 x 到 4.x(即),那么您需要首先通过添加与集群中其他节点完全相同的 3.x 版本的新节点来扩展集群,然后逐一升级到 4.x 。另一种方法是找出低/无流量时段,并首先通过在该集群的所有节点上执行从 3.x 到 4.x 的二进制升级,然后最终调用 sstable 升级过程来一次一个节点地执行升级过程。将现有 SSTable 转换为较新版本的格式。
例如,当节点运行 Cassandra 的集群的
3.11.15
所有节点都成功升级到 Cassandra 时,该集群将被视为完全升级4.1.3
。除了少数例外,整个集群会像在早期版本的 Cassandra 上一样继续工作,直到集群中的所有节点都升级为止。这是不正确的理解。协调器将确保它将根据应用程序客户端驱动程序中的配置方式满足写入一致性。因此,如果您的客户端应用程序的
LOCAL_QUORUM
键空间复制因子设置为 的表的写入一致性级别为 ,则在确认客户端写入成功之前,3
至少会满足副本节点拥有数据副本的要求(即使其中之一)2
副本处于打开状态3.x
,另一个处于4.x
版本状态)。这里
3.x
4.x
有一个很棒的升级指南,您应该熟悉并遵循它来实现您想要在这里实现的目标。如果您需要额外的帮助,您可以随时订阅Luna。