滚动更新
为实现 Apache Druid 集群的无停机滚动更新,我们建议按照以下顺序更新 Druid 进程:
- Historical
- Middle Manager 和 Indexer(如有)
- Broker
- Router
- Overlord(注意:如果您使用基于自动伸缩的替换,则可以在任何 Middle Manager 进程之前升级 Overlord。)
- Coordinator(或合并后的 Coordinator+Overlord)
如果您需要进行滚动降级,请反转该顺序并从 Coordinator 进程开始。
有关最新版本的信息,请参阅 Druid 发布版本。
Historical
Historical 进程可以逐个更新。每个 Historical 进程在启动时都需要花费时间将更新前所服务的段(segments)映射到内存中。根据主机硬件的不同,启动时间通常需要几秒到几分钟。只要每个 Historical 进程的更新间隔足够长(大于启动单个进程所需的时间),您就可以对整个 Historical 集群进行滚动更新。
Overlord
Overlord 进程可以以滚动方式逐个更新。
Middle Managers/Indexers
Middle Manager 或 Indexer 节点运行批处理和实时索引任务。通常您希望以不导致实时索引任务失败的方式更新 Middle Manager。为此有三种策略:
滚动重启(基于恢复)
当设置 druid.indexer.task.restoreTasksOnRestart=true 时,Middle Manager 可以以滚动方式逐个更新。在这种情况下,支持恢复的索引任务会在 Middle Manager 重启时恢复其状态,从而不会失败。
目前,只有实时任务支持恢复,因此非实时索引任务将会失败并需要重新提交。
滚动重启(基于优雅终止)
可以使用“禁用(disable)”API 优雅地终止 Middle Manager。这适用于所有任务类型,即使是那些不可恢复的任务。
要为更新准备 Middle Manager,请向 <Middle_Manager_IP:PORT>/druid/worker/v1/disable 发送 POST 请求。此后,Overlord 将不再向该 Middle Manager 发送任务。已启动的任务将运行至完成。可以使用 <Middle_Manager_IP:PORT>/druid/worker/v1/enabled 来检查当前状态。
要查看所有现有任务,请向 <Middle_Manager_IP:PORT>/druid/worker/v1/tasks 发送 GET 请求。当该列表为空时,您可以安全地更新该 Middle Manager。Middle Manager 重启后,它会自动重新启用。您也可以通过向 <Middle_Manager_IP:PORT>/druid/worker/v1/enable 发送 POST 请求来手动启用 Middle Manager。
基于自动伸缩的替换
如果您的 Overlord 启用了自动伸缩,那么 Overlord 进程可以批量启动新的 Middle Manager 进程,并在旧进程的任务完成后优雅地将其终止。此过程通过设置 druid.indexer.runner.minWorkerVersion=#{VERSION} 来配置。每次更新 Overlord 进程时,都应增加 VERSION 的值,这将触发大规模启动新的 Middle Manager。
还需要设置配置项 druid.indexer.autoscale.workerVersion=#{VERSION}。
独立实时节点(Standalone Real-time)
独立实时进程可以以滚动方式逐个更新。
Broker
Broker 进程可以以滚动方式逐个更新。更新每个进程之间需要有一定的延迟,因为 Broker 在返回有效结果之前必须加载整个集群的状态。
Coordinator
Coordinator 进程可以以滚动方式逐个更新。