【发布时间】:2017-06-27 17:11:35
【问题描述】:
我们正在寻找一种在 CI 环境中执行 Cassandra 集群滚动升级的方法。
我们让 Cassandra 跨多个虚拟机运行。当虚拟机启动时,它会从池中分配一个随机 IP 地址。我们无法控制它以获取静态 IP 地址。我们也“不允许”登录到虚拟机来运行 Cassandra 的手动升级。所以要升级,我们需要启动一个新的虚拟机并在上面安装更高版本的 Cassandra。
理想情况下,我们希望:
- 关闭现有节点上的 Cassandra;
- 使用新版本的 cassandra 和新 IP 地址启动新节点;
- 将数据从旧节点复制到新节点;
- 启动新节点,因为它是旧节点(autobootstrap=false);
- 这里可能需要一些 Cassandra 设置来告诉集群这是一个现有节点,就像 cassandra.replace_node 一样,但这不需要 autobootstrap=true)
- 运行“nodetool upgradesstables”。
我们曾考虑过使用 cassandra.replace_node 或 cassandra.replace_node_first_boot,但有关这些的文档强烈暗示(或声明)在使用这些节点时必须引导节点,这意味着我们无法从旧节点复制数据(因为它会被忽略/覆盖/复制)。
是否可以在不引导节点的情况下做我们想做的事情?
(我们正在研究静态 IP 地址的可能性 - 如果我们可以重复使用 IP 地址,那么该节点将显示为正在升级的节点 - 不需要引导程序。但是,我们看起来不太可能拥有静态 IP )。
【问题讨论】:
-
添加节点而不是升级现有节点并不是一个好主意。整个数据必须重新流式传输,并且每当现有节点退役时,它们也开始脱落数据。所以会有很多数据流,而不是仅仅升级现有的二进制文件。
-
为什么不直接停止 Cassandra 并升级呢?可以为启动的任何新实例创建新映像。这将是一个很好的练习,因为您需要有流程和此类设置来执行诸如针对严重错误等情况的重新启动和升级之类的事情,否则您将来可能会陷入非常糟糕的境地。
-
我很乐意停止 C* 并升级,但我们不允许这样做。根据 CI 平台上的新策略,所有升级都必须在新 VM 上进行。我的手被绑住了。当新虚拟机出现时,旧虚拟机仍然可用,因此数据可用。所以我正在寻找一种将数据从旧虚拟机复制到新虚拟机的方法,使用 C* 魔术,并让新节点作为旧节点出现,只需使用新的 IP 地址。我想类似的问题是:如何更改 C* 集群中节点的 IP 地址?如果我们能回答这个问题,我们就可以回答上面的场景。
标签: cassandra