滚动更新

简介

滚动更新是将系统的一个版本替换为另一个版本而不停机的过程。更改可以是新代码、更改的依赖项(如新的 Akka 版本)或修改的配置。滚动更新通常用于有状态的 Akka 集群,在更新期间不能像蓝绿色部署那样并行运行两个单独的集群。

在执行滚动更新时,Akka 有两个部分需要仔细考虑。

  1. 远程消息协议的兼容性。旧节点可以向新节点发送消息,反之亦然。
  2. 持久化事件和快照的序列化格式。新节点必须能够读取旧数据,并且在更新期间,旧节点必须能够读取新节点存储的数据。

还有许多应用程序特定的方面。有一个可以改进的序列化格式策略是很重要的,并且你可以在「持久化 - 模式演化」中找到一些建议,它在使用滚动更新部署时也适用于远程消息。

Akka 支持在两个连续补丁版本之间滚动更新,除非本页提到异常。例如,将 Akka 版本从 2.5.15 更新到 2.5.16。很多时候也可以跳过几个版本,这里也描述了一些例外情况。例如,在没有中间版本 2.5.15 的情况下,可以从 2.5.14 更新到 2.5.16。

不支持具有两个以上不同版本的集群。在开始下一个更新之前,必须执行完前一个更新。

由于协议完全不同,不支持从经典远程处理到动脉(Artery)的滚动更新。它将需要完全关闭集群并重新启动。

关闭命令

最好将运行时间最长的节点保留到最后。这是因为集群单例(包括集群分片协调员)运行在最旧的节点上。更有效的方法是避免移动单例,因为这些单例通常必须恢复其状态,并且可能会导致不必要的延迟,例如访问新的分片 Actor。

更改日志

2.5.0 小版本中的几个变更

从 2.4.x 更新到 2.5.x 时,请参阅「迁移指南」。

2.5.10 连接回归

问题:#24622

不兼容的变化在 2.5.10 中引入,并在 2.5.11 中得到修正。

这意味着你不能从 2.5.9 进行滚动更新到 2.5.10,而必须从 2.5.9 更新到 2.5.11。

2.5.10 加入旧版本

问题:#25491

不兼容的变化在 2.5.10 中引入,并在 2.5.15 中得到修正。

这意味着如果需要在更新阶段连接 2.5.9 节点,那么应该直接从 2.5.9 滚动更新到 2.5.15。

2.5.14 ORSet[ActorRef] 的分布式数据序列化

问题:#23703

在 2.5.14 中进行了有意的变更。

此更改需要两个阶段的更新,其中复制的数据与新节点和旧节点都兼容。

  • 2.5.13 - 更改前的旧格式。可以与中间格式和旧格式通信。
  • 2.5.14、2.5.15、2.5.16 - 中间格式。可以与旧格式和新格式通信。
  • 2.5.17 - 新格式。可以与中间格式和新格式通信。

这意味着你不能直接从 2.5.13 更新到 2.5.17,必须首先更新到中间版本 2.5.14、2.5.15 或 2.5.16 之一。

2.5.22 ShardRegionStats 的 ClusterSharding 序列化

问题:#25348

在 2.5.22 中进行了有意的变更。

已更改类的序列化程序:GetShardRegionStatsShardRegionStatsGetShardStatsShardStats

此更改需要两个阶段的更新,其中引入了新的序列化程序,但在早期版本中未启用。

  • 2.5.18 - 添加了序列化程序但未启用,仍使用JavaSerializer
  • 2.5.22 - 为这些类启用了ClusterShardingMessageSerializer

这意味着你不能直接从 2.5.17 更新到 2.5.22,必须首先更新到中间版本 2.5.18、2.5.19、2.5.20 或 2.5.21 之一。


英文原文链接Rolling Updates.