集群与高可用
多节点集群的组成、Redis 与集群配置页的参数、粘性会话要求、节点扩缩与授权节点上限、故障策略。
概述
单实例模式下,会话、缓存、定时任务都在进程内完成。集群模式下,多个节点连接同一个配置库,并借助 Redis 共享会话、广播消息、分布式锁、Leader 选举与调度协调,由前置的负载均衡分发请求。
集群由以下部分组成:
| 组成 | 作用 |
|---|---|
| 多个产品节点 | 每个节点运行同一个产品 jar,配置同一个配置库 |
| 外接配置库 | 所有节点共享的平台数据;集群配置、授权也保存在其中 |
| Redis | 会话存储、跨节点广播、分布式锁、节点注册与 Leader 选举 |
| 负载均衡 / 反向代理 | 分发请求,需要支持粘性会话,见下文 |
发行包不提供集群编排工具。节点安装与单机相同,见 裸机部署。
功能入口
「系统 > 系统设置 > 集群配置」页,包含三块:「运行状态」「Redis 拓扑配置」「集群运行时参数」。「系统 > 智能运维 > 运行状态」页可查看运行时状态、当前节点 ID、活跃节点列表、Redis 健康与系统资源。
提示:托管模式下这些入口会被隐藏;独立部署时保留。
操作步骤
切换到集群模式
- 准备好 Redis,并确认应用节点能访问。
- 让所有节点使用同一个外接配置库(同一份
database.config或同一组MR_DB_*环境变量)。见 初始化向导与数据库准备。 - 打开「集群配置」页,在「Redis 拓扑配置」中选择「拓扑模式」并填写连接信息,见下表。
- 点击「测试 Redis 连接」,通过后点击「保存配置」。
- 点击「切换到集群模式」,在「切换运行模式确认」对话框中点击「确认切换」。程序会先执行 Redis 连通性预检查,通过后才启动分布式会话与广播通道;未通过时按钮显示为「先验证 Redis 并继续」,不会切换。
- 在「运行状态」块查看「切换状态」,变为「集群运行中」即完成。
退回单实例:点击「退回单实例模式」并确认,将断开 Redis,恢复本地会话与缓存。
切换状态取值:
| 状态 | 含义 |
|---|---|
| 单实例运行中 | 未启用集群 |
| 正在切换到集群… | 切换进行中 |
| 集群运行中 | 正常 |
| 集群受限(Redis 异常) | Redis 不可用,按故障策略处理 |
| 正在退回单实例… | 退回进行中 |

增加节点
- 在新服务器上按 裸机部署 安装同一版本的产品包。
- 让它使用同一个配置库(复制
database.config,或设置MR_DB_*)。 - 保持四个加密密钥一致(未自定义时都用内置默认值),见 配置项参考。
- 启动。节点从配置库读取集群配置并加入集群,在「运行状态」页的活跃节点列表中可见。
- 把新节点加入负载均衡。
集群令牌由第一个启动的节点在配置库中自动生成,其他节点读取使用,不需要手工分发。如需覆盖,可设置 MR_CLUSTER_TOKEN。
Redis 拓扑配置
| 字段 | 说明 | 默认值 |
|---|---|---|
| 拓扑模式 | 「单机 (Standalone)」「哨兵 (Sentinel)」「集群 (Cluster)」 | Standalone |
| 主机 | 单机模式的 Redis 地址 | 127.0.0.1 |
| 端口 | 单机模式的端口 | 6379 |
| Master 名称 | 哨兵模式必填 | 空 |
| 哨兵节点 | 哨兵模式必填 | 空 |
| 集群节点 | 集群模式必填 | 空 |
| 最大重定向 | 集群模式的最大重定向次数 | 3 |
| 用户名 | 留空表示不需要 | 空 |
| 密码 | 留空表示不需要 | 空 |
| 数据库 | Redis 库序号 | 0 |
集群运行时参数
这组参数默认只读,需要点击「启用高级参数修改」并确认后才能编辑,保存时还会再次确认。修改不当可能导致节点协调异常,默认不建议修改。
| 参数 | 说明 | 默认值 |
|---|---|---|
| 会话 TTL(秒) | 会话有效期 | 86400 |
| 锁键前缀 | 分布式锁的 Redis 键前缀 | mr:lock: |
| Leader 选举键 | Leader 选举使用的键 | mr:leader |
| 节点心跳 TTL(秒) | 节点注册心跳的存活时间 | 30 |
| 调度扫描间隔(秒) | 定时调度的扫描周期 | 10 |
| 调度认领批次大小 | 一次认领的任务数 | 10 |
| 通知频道前缀 | 通知广播频道前缀 | mr:notify: |
| 缓存失效频道 | 缓存失效广播频道 | mr:cache:invalidate |
| 故障策略 | Redis 异常时的行为 | 受限模式 |
故障策略
| 取值 | 行为 |
|---|---|
| 受限模式 (RESTRICTED) | 停止调度、拒绝新会话写入、停止跨节点广播,但允许已有本地请求继续 |
| 快速失败 (FAIL_FAST) | 将节点标记为不健康,交由负载均衡摘除 |
「运行状态」页中的「快速失败激活」显示 FAIL_FAST 是否已触发。
负载均衡要求
粘性会话
集群模式下,报表数据缓存保留在各节点的本地内存中,缓存心跳、导出、翻页等后续请求必须回到生成该缓存的节点。Sight Wall 的实时数据流(SSE)同样绑定在发起注册的节点上。
程序会在响应中带上头 X-MR-Node-Id(当前处理节点 ID),可作为负载均衡做粘性路由的依据。路由未命中时:
| 现象 | 说明 |
|---|---|
接口返回业务码 4091,提示「报表实例不在当前节点,请检查负载均衡粘性会话配置」 |
报表缓存所在节点与当前请求节点不一致 |
大屏实时流返回 sticky-miss,提示「大屏实时流未命中当前节点,请检查粘性会话配置」 |
大屏流所在节点与连接请求节点不一致 |
因此,负载均衡必须配置粘性会话,例如按客户端 IP 或 Cookie 固定到同一节点,并关闭 SSE 路径的缓冲。
健康检查
用 GET /api/health,返回字段 ready 为 true 表示可接收流量,mode 为 CLUSTER 表示运行在集群模式。返回中还包含 nodeId、leader、activeNodes。
授权与节点数
- 授权保存在配置库中。任意节点导入一次,其他节点最迟约 60 秒内自动生效,不需要逐台导入。
- 授权可以限定节点数上限(
nodeMax)。新节点加入时,如果其他活跃节点数加上自己超过上限,该节点被拒绝加入集群,授权状态显示node_limit_exceeded,原因为「集群节点数超过授权上限 N,本节点未加入集群。请升级授权或减少节点。」已在集群内的节点不受影响,节点重启重入也不会被拦。上限为 0 或未设置表示不限。 - 运行配额(并发访问 IP、运行数量)在集群下需要用 Redis 计数,否则每个节点各算各的,实际放行量被放大。见 运行配额与机器绑定。
节点角色
配置项 sight-data.node.products 可指定本节点只运行哪些产品(如 [datawall]),为空表示运行全部已授权产品。节点分配不能超出授权范围。sight-data.node.name 用于给节点起标识名,便于运维和日志。
注意事项
注意:定时调度在集群中由 Leader 或库级锁保证同一任务只在一个节点执行;系统内置的自动备份也是如此,见 备份与恢复。
注意:切换运行模式会改变会话与缓存的存放方式,建议在业务低峰进行,并提前确认负载均衡已配置粘性会话。
注意:升级时,先启动的新版本节点会对配置库执行迁移,见 升级与变更管理。