Coordinator HA
如 Milvus 架构 所示,Milvus 由许多组件组成,并让它们以分布式方式工作。在所有组件中,Milvus 通过 节点的扩展和横向扩展 确保工作节点的高可用性,使 coordinator 成为链条中唯一的薄弱环节。
概述
在 2.2.3 版本中,Milvus 为 coordinator 实现了高可用性,使它们能够在主备模式下工作,减轻可能导致服务不可用的潜在单点故障(SPoF)。

上图说明了 coordinator 如何在主备模式下工作。当一对 coordinator 启动时,它们使用各自的服务器 ID 向 etcd 注册并竞争主角色。成功从 etcd 租用主角色的 coordinator 将开始服务,而对中的另一个 coordinator 将保持在备用状态,监视主角色并准备在主 coordinator 死亡时提供服务。
启用 coordinator HA
使用 Helm
要启动多个 coordinator 并让它们在主备模式下工作,您应该对 values.yaml 文件进行以下更改。
- 将
xxxCoordinator.replicas设置为2。 - 将
xxxCoordinator.activeStandby.enabled设置为true。
以下代码片段以 RootCoord 为例。您可以对其他类型的 coordinator 进行相同操作。
rootCoordinator:
enabled: true
# 只有在您还需要将 activeStandby.enabled 设置为 true 时,才能将副本数设置为大于 1。
replicas: 2 # 否则,删除此配置项。
resources: {}
nodeSelector: {}
affinity: {}
tolerations: []
extraEnv: []
heaptrack:
enabled: false
profiling:
enabled: false # 启用实时性能分析
activeStandby:
enabled: true # 将此设置为 true 以让 RootCoordinator 在主备模式下工作。
使用 Docker
要启动多个 coordinator 并让它们在主备模式下工作,您可以向用于启动 Milvus 集群的 docker-compose 文件添加一些定义。
以下代码片段以 RootCoord 为例。您可以对其他类型的 coordinator 进行相同操作。
rootcoord:
container_name: milvus-rootcoord
image: milvusdb/milvus:v2.2.3
command: ["milvus", "run", "rootcoord"]
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
PULSAR_ADDRESS: pulsar://pulsar:6650
ROOT_COORD_ADDRESS: rootcoord:53100
# 添加 ROOT_COORD_ENABLE_ACTIVE_STANDBY 以启用主备
ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
depends_on:
- "etcd"
- "pulsar"
- "minio"
# 添加以下内容以让 RootCoord 在主备模式下工作
# rootcoord-1:
# container_name: milvus-rootcoord-1
# image: milvusdb/milvus:v2.2.3
# command: ["milvus", "run", "rootcoord"]
# environment:
# ETCD_ENDPOINTS: etcd:2379
# MINIO_ADDRESS: minio:9000
# PULSAR_ADDRESS: pulsar://pulsar:6650
# ROOT_COORD_ADDRESS: rootcoord-1:53100
# # 添加 ROOT_COORD_ENABLE_ACTIVE_STANDBY 以启用主备
# ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
# depends_on:
# - "etcd"
# - "pulsar"
# - "minio"
使用 Mac/Linux shell
要启动多个 coordinator 并让它们在主备模式下工作,您可以
-
将 Milvus 源代码下载到本地驱动器,并从源代码启动 Milvus 集群,如下所示:
sudo ./scripts/start_cluster.sh在此步骤结束时,Milvus 只运行每种类型的一个 coordinator。
-
更新
milvus.yaml以更改每种类型 coordinator 的端口号。以下以 rootCoord 为例。rootCoord:
address: localhost
port: 53100 # 更改为 53001 -
启动备用 coordinator。
sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &在此步骤结束时,运行以下命令验证存在两个 coordinator 进程。
ps aux|grep milvus输出应该类似于
> ps aux|grep milvus
root 12813 0.7 0.2 410709648 82432 ?? S 5:18PM 0:33.28 ./bin/milvus run rootcoord
root 12816 0.5 0.2 409487968 62352 ?? S 5:18PM 0:22.69 ./bin/milvus run proxy
root 17739 0.1 0.3 410289872 91792 s003 SN 6:01PM 0:00.30 ./bin/milvus run rootcoord
...备用 coordinator 每十秒输出一个日志条目,如下所示:
[INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."] -
杀死对中的主 coordinator 并观察备用 coordinator 的行为。
您可以发现备用 coordinator 需要 60 秒才能接管主角色。
[2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord\" mod_revision:167 "]
[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord-15\" mod_revision:167 "]
[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] ["stop watching ACTIVE key"]
[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] ["start retrying to register as ACTIVE service..."]
[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] ["register ACTIVE service successfully"] [ServerID=19]
[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] ["quit STANDBY mode, this node will become ACTIVE"]
[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] ["rootcoord switch from standby to active, activating"]
[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] ["RootCoord Register Finished"]
[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] ["RootCoord start done ..."]
[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] ["RootCoord successfully started"]
相关配置项
默认情况下,Coordinator HA 是禁用的。您可以通过更改 Milvus 配置文件中的以下项目来手动启用此功能。
限制
目前,主服务和备用服务之间没有强一致性保证。因此,备用 coordinator 在接管主角色时需要重新加载元数据。
Etcd 只有在当前会话超时后才会释放租约。会话超时默认为 60 秒。因此,在主 coordinator 死亡和备用 coordinator 接管主角色之间有 60 秒的间隔。