如何优雅地更新形成 Hazelcast 集群组的 ECS 服务?

How to update ECS-service forming a Hazelcast cluster group gracefully?

我们有一个 ECS 服务 (EC2 ECS),其中有几个任务形成了一个 Hazelcast 集群组(hazelcast:3.10.6,hazelcast-aws:2.2,我们使用 Hazelcast 来存储一些共享数据和分布式对象中的锁) .它使用滚动服务更新,最小健康百分比设置为 100,最大设置为 200。

使用新任务定义更新此服务不是很可靠 - 由于 ECS 服务更新过程的性质,Hazelcast 通常无法保留现有集群。它有时会非常快速地删除具有旧任务定义的任务,通常一次删除多个任务,从而破坏 Hazelcast 集群组。

是的,我们可以重构服务以使用客户端-服务器模型在单独的服务中存储内存网格或使用替代方案,例如在 Redis 中存储锁,但听听已经遇到类似困难的人会很有趣并找到了一种在 ECS 中优雅地更新支持 Hazelcast 的服务的方法。

要使 Hazelcast 在基本上任何容器化环境中都可靠,您需要定义正常关闭。这将防止任何数据丢失或同时杀死多个 Hazelcast 实例。

为了做到这一点,你可以检查ECS doc about StopTask and Hazelcast documentation on Graceful Shutdown。简而言之,您需要:

  • hazelcast.shutdownhook.policy=GRACEFUL 添加到 JAVA_OPTS
  • hazelcast.graceful.shutdown.max.wait=<max-waiting-time-for-data-migration>添加到JAVA_OPTS
  • ECS_CONTAINER_STOP_TIMEOUT 环境变量更改为 <max-waiting-time-for-data-migration>

如果您在 Hazelcast 集群中存储大量数据,可以将值 max-waiting-time-for-data-migration 设置为较大的数字,甚至几个小时。