集群配置
YedMQ 使用 Raft 协调分布式状态。本页说明多节点部署时最关键的配置项,以及当前 REST 管理流程如何配合这些配置工作。
配置示例
[cluster]
cluster_name = "YedMQ"
node_id = 1001
heartbeat_interval = 10
store_dir = "./store"
session_ttl = 86400
startup_mode = "bootstrap"
nodes = [
{ id = 1001, rpc_address = "node1.example.com:3457", api_address = "node1.example.com:3456" },
{ id = 1002, rpc_address = "node2.example.com:3457", api_address = "node2.example.com:3456" },
{ id = 1003, rpc_address = "node3.example.com:3457", api_address = "node3.example.com:3456" },
]
[cluster.rpc]
external = "0.0.0.0:3457"
主要字段说明
cluster_name:同一集群所有节点共享的逻辑名称node_id:当前节点的唯一数字标识heartbeat_interval:Raft 心跳间隔,单位为秒store_dir:Raft 日志和复制状态的存储目录session_ttl:断开连接后持久会话保留时间,建议在真实部署中显式设置startup_mode:bootstrap:首节点模式,启动时会基于成员列表初始化 raft 组join:扩容节点模式,启动后等待通过集群管理 API 加入
nodes:已知节点列表,每个节点包含rpc_address和api_addresscluster.rpc.external:节点间 RPC 通信监听地址
当前被复制的状态
YedMQ 目前维护三个独立的 raft 组:
- topic 元数据
- session actor map
- session state
这也是为什么很多集群 API 会同时操作三个 raft 组。
推荐扩容流程
- 初始节点或初始成员集合使用
startup_mode = "bootstrap"启动。 - 新增节点使用
startup_mode = "join"启动。 - 通过管理 API 把新节点加入集群:
POST /api/v1/cluster/learners:先把节点作为 learner 加入三个 raft 组。POST /api/v1/cluster/nodes:一次请求完成 learner 添加和成员变更。
- 通过
GET /api/v1/cluster/metrics检查新节点是否已经稳定加入。
一步完成新增节点的请求示例:
{
"node_id": 1002,
"node": {
"rpc_addr": "10.0.0.2:3457",
"api_addr": "10.0.0.2:3456"
},
"members": [1001, 1002]
}
手动初始化接口
虽然 bootstrap 模式会在启动时初始化 raft 状态,但当前仍保留了显式初始化接口,适合运维流程或手工操作:
POST /api/v1/cluster/initPOST /api/v1/cluster/raft/topic/initPOST /api/v1/cluster/raft/session_actor_map/initPOST /api/v1/cluster/raft/session_state/init