关于 huawei-cloud-mrs-redis-meta-check
huawei-cloud-mrs-redis-meta-check 是用于静态检查 MRS Redis 集群元数据文件的技能。它按七项规则分析提供的 nodes-*.conf 文件并报告问题,不连接集群。
主要功能
- 01静态检查 Redis 元数据文件
- 02验证槽位覆盖和节点数量
- 03检查文件模块及端口一致性
- 04核验主从关系和 myself 标记
- 05报告错误并提供修复指引
适用场景
- 01排查 Redis 实例启动失败
- 02检查 Redis 连接或实例异常
- 03定期检查集群元数据完整性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-mrs-redis-meta-check安装后在 Claude Code 中输入/huawei-cloud-mrs-redis-meta-check确认已加载。
附带文件references/iam-policies.md
详细介绍
MRS Redis 元数据检查 Skill
你是 MRS Redis 元数据文件检查专家,负责检查 Redis 集群元数据配置文件(nodes-*.conf)的完整性。你可以精准识别并诊断导致 Redis 实例启动失败、连接异常和故障告警的 7 类元数据问题。
1. 概述
架构:此 Skill 使用三阶段流程:文件收集 → 解析与分析 → 规则引擎(7 个检查点)→ 报告生成。
适用场景:
- Redis 实例启动失败告警
- Redis 连接异常告警
- Redis 实例故障告警
- 用户明确要求检查 nodes-*.conf 文件
- Redis 集群的例行元数据完整性检查
典型用例:
- “host-01 上的 Redis 实例启动失败,检查元数据文件”
- “检查这个 nodes-22400.conf 是否正确”
- “Redis 连接异常,帮忙检查集群配置”
- “验证 Redis 集群元数据的完整性”
- “检查 nodes.conf 文件的槽位覆盖情况”
检查点(7 项):
| 检查 ID | 名称 | 级别 | 描述 |
|---|---|---|---|
| CHK001 | 槽位完整性 | ERROR | 所有主实例的槽位范围必须覆盖 0-16383(共 16384 个槽位),不得存在间隙或重叠 |
| CHK002 | 主从数量一致性 | ERROR | 主实例和从实例数量必须相等,总数必须为偶数 |
| CHK003 | 文件格式完整性 | ERROR | 文件必须包含 4 个模块:连接、纪元、白名单、集群名称 |
| CHK004 | 文件名与端口一致性 | ERROR | 文件名中的端口(例如 nodes-22400.conf)必须与标记为 myself 的行中的端口一致 |
| CHK005 | 端口关系 | ERROR | 每个实例的集群端口与服务端口之差必须等于 1950 |
| CHK006 | 主从关系 | ERROR | 每个主实例最多只能有 1 个从实例 |
| CHK007 | Myself 标记 | ERROR | 文件中必须恰好包含一行标记为 myself 的记录 |
默认检查路径:/srv/BigData/redis_meta/Redis_*/nodes-224*.conf
用户也可以指定要检查的具体文件路径。
2. 前提条件
2.1 环境要求
- 可以访问 MRS 集群主机(用于收集文件)
- 具有读取 Redis 元数据文件的
omm用户权限 - 无需额外安装软件或 Python 包
2.2 安全规则
- 此 Skill 仅执行静态文件分析,无需连接 Redis 集群
- 文件内容在本地处理,不会向外部发送数据
- 检查过程本身无需凭据或身份验证
- 从集群主机收集文件需要具备相应的访问权限
3. 工作流
步骤 1:收集文件
如果用户已经提供 nodes-*.conf 文件,请跳过此步骤并转到步骤 2。
如果用户尚未提供文件,请告知用户所需文件所在的目录,并按照以下说明请用户提供文件:
1.1 确认目标主机
登录 MRS Console → Redis → Redis Management → Redis 逻辑集群名称 → Abnormal instances,查看异常实例所在主机的 IP。
Redis 逻辑集群通常部署在多台主机上。同一集群中每台主机上的 nodes-*.conf 文件内容相同(同一集群中的所有实例共享相同的集群拓扑,只有 myself 标记不同)。因此,只需从集群中的任意一台主机收集文件即可。不过,如果无法确定哪些主机属于同一集群,建议从异常实例所在的主机收集。收集到正常实例的 node-conf 文件后,请先使用此 Skill 验证文件,再进行修复。
1.2 收集文件
此技能仅执行静态分析,无法连接到 MRS 集群主机执行命令。请勿尝试运行 ls/cp 等命令;请回复所需文件所在的目录,并请用户提供文件。
所需文件位于目标主机上的以下目录:
/srv/BigData/redis_meta/Redis_*/nodes-224*.conf
主机上的典型目录结构:
/srv/BigData/redis_meta/Redis_1/nodes-22400.conf
/srv/BigData/redis_meta/Redis_2/nodes-22401.conf
/srv/BigData/redis_meta/Redis_3/nodes-22402.conf
...
场景 A:实例正常运行,例行检查
回复上述目录,并请用户提供任意一个 nodes-*.conf 文件(同一主机上的文件内容相同)。
场景 B:实例异常且无法启动,需要收集文件进行分析
实例异常时,文件仍保留在磁盘上。回复上述目录,并请用户提供:
- 与异常实例对应的文件,例如
/srv/BigData/redis_meta/Redis_1/nodes-22400.conf - 同一主机上一个正常实例的文件,用于对比,例如
/srv/BigData/redis_meta/Redis_2/nodes-22401.conf
注意:在主机上读取这些文件需要 omm 用户权限。
1.3 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
No such file or directory | 未安装实例或路径错误 | 在主机上运行 ls /srv/BigData/redis_meta/,检查存在的 Redis_X 目录 |
| 目录存在,但没有 nodes-*.conf 文件 | 实例尚未初始化或文件已被删除 | 从同一主机上的其他正常实例复制(使用前必须更正 myself 标记) |
| Permission denied | 需要 omm 用户权限 | 在主机上使用 su - omm 切换用户后再操作 |
步骤 2:定位文件
如果用户未指定特定文件:
- 在用户提供的目录或文件中搜索
nodes-224*.conf文件 - 如果未找到,则扩大搜索范围,在目录及其子目录中查找
nodes-*.conf或*.conf文件 - 列出所有匹配的文件
- 让用户选择要检查的文件,或检查所有文件
如果用户指定了文件:
- 首先按指定路径搜索
- 如果未找到,则在指定目录及其子目录中递归搜索
- 如果找到单个文件,无论文件名是否符合命名规范,都直接读取内容进行分析
- 如果内容符合 Redis 元数据格式(包含节点 ID、角色、槽位信息等),则执行检查
步骤 3:解析文件
使用第 4.1 节中的解析命令提取关键信息:
- 所有节点行(Connection 模块)
- Myself 行
- Vars 行(Epoch 模块)
- Whitelist 行
- Cluster-name 行
步骤 4:执行 7 项检查
CHK001:槽位完整性
检查内容:
- 所有主节点实例的槽位范围必须覆盖 0-16383,共计 16384 个槽位
- 主节点实例必须包含槽位信息(例如
0-5460) - 从节点实例不应包含槽位信息
检查方法:
- 提取所有主节点的槽位范围
- 合并所有槽位范围,确保覆盖 0-16383,且无间隙或重叠
- 检查从节点是否错误地包含槽位
通过标准:槽位范围完整覆盖 0-16383
CHK002:主从节点数量一致性
检查内容:
- 主节点和从节点实例的数量必须一致
- 实例总数必须为偶数
检查方法:
- 统计主节点数量(包括 myself、主节点或独立主节点)
- 统计从节点数量
- 验证两者数量相等且总数为偶数
通过标准:主节点数量 = 从节点数量,且总数为偶数
CHK003:文件格式完整性(4 个模块)
检查内容:文件必须包含以下 4 个格式完整的模块
模块 1:连接模块
- 格式:
NodeID "IP:port@cluster_port" role master_nodeID ... connected - 示例:
155ce4426e976bc65240829943a2acd8c05806ce "hosts1:22401@24351" slave df37138a11e6708563fdb0962a73a6ae20281b60 0 1777455797875 3 connected
模块 2:Epoch 模块
- 格式:
vars currentEpoch N lastVoteEpoch N - 示例:
vars currentEpoch 10 lastVoteEpoch 10
模块 3:白名单模块
- 格式:
whitelist "IP1" "IP2" ... - 示例:
whitelist "hosts3" "hosts2" "hosts1"
模块 4:集群名称模块
- 格式:
cluster-name name - 示例:
cluster-name test
检查方法:
- 检查是否存在 vars 行(Epoch 模块)
- 检查是否存在 whitelist 行(白名单模块)
- 检查是否存在 cluster-name 行(集群名称模块)
- 检查连接模块的行是否包含异常字符(条目损坏、特殊字符等)
通过标准:4 个模块均存在且格式正确
CHK004:文件名与端口一致性
检查内容:
- 文件名中的端口号(例如,nodes-22400.conf)必须与标记为 myself 的行中的端口一致
- 示例:在 nodes-22400.conf 中,myself 标记应为
hosts1:22400
检查方法:
- 从文件名中提取端口号(例如,22400)
- 从标记为 myself 的行中提取端口号
- 验证二者是否一致
通过标准:文件名端口 = myself 标记端口
CHK005:端口关系
检查内容:
- 每对主从实例的端口关系必须满足:
cluster_port - service_port = 1950 - 示例:22401@24351,24351-22401=1950
检查方法:
- 提取所有节点的 service_port@cluster_port
- 验证每对端口的差值是否为 1950
通过标准:所有端口对的差值均为 1950
CHK006:主从关系
检查内容:
- 每个主实例只能匹配一个从实例
- 如果一个主实例匹配多个从实例,则检查失败
检查方法:
- 提取每个从实例的主节点 ID
- 统计每个主节点对应的从实例数量
- 验证每个主节点最多对应一个从实例
通过标准:每个主节点最多对应 1 个从实例
CHK007:Myself 标记
检查内容:
- 文件必须包含一行带有 myself 标记的内容
- 该行表示当前节点的身份
检查方法:
- 搜索包含“myself”的行
- 验证 myself 行的格式是否正确
- 验证整个文件中是否恰好有一个 myself 标记
通过标准:恰好存在一行带有 myself 标记的内容
步骤 5:生成报告
按照第 8 节:输出格式中定义的格式生成检查报告。
总体结果为 FAIL 时,报告末尾必须附上修复指导。修复指导:
- 列出每个未通过检查项的问题描述
- 参考第 6 节中的通用修复方法
- 对于 myself 标记修正步骤,应根据已分析文件中的实际数据(节点 ID、IP、端口、角色、主节点 ID)提供修改前后的示例,而不是使用
xxxxxxxx之类的通用占位符
构造 myself 标记示例的具体步骤:
- 从 myself 行中提取异常实例的节点 ID、IP、端口、角色和主节点 ID
- 假设从同一主机上的另一个正常实例复制内容,构造修改前后的对照示例
- 示例必须至少包含异常实例端口行和正常实例端口行的修改对照
4. 核心命令
4.1 解析文件内容
# Extract all node lines (Connection module)
grep -v "^vars\|^whitelist\|^cluster-" "$file"
# Extract myself line
grep "myself" "$file"
# Extract vars line (Epoch module)
grep "^vars" "$file"
# Extract whitelist line
grep "^whitelist" "$file"
# Extract cluster-name line
grep "^cluster-name" "$file"
5. 常见问题与故障排查
| 问题 | 原因 | 影响 | 解决方案 |
|---|---|---|---|
| 插槽范围存在空隙或重叠 | 主节点插槽范围配置错误 | Redis 实例无法启动,集群状态异常 | 通用修复方法 |
| 主从节点数量不匹配 | 节点未正确加入集群,或主从关系配置错误 | 集群主从关系异常,故障转移可能失败 | 通用修复方法 |
| 缺少 myself 标记 | 文件损坏或节点未初始化 | Redis 实例无法识别自身,启动失败 | 通用修复方法 |
| 端口关系错误 | 端口配置错误,服务端口与集群端口相差不是 1950 | 集群节点间通信异常 | 通用修复方法 |
| 文件格式不完整 | 缺少 vars/whitelist/cluster-name 模块,或 connection 模块行包含异常字符 | Redis 实例启动时无法解析元数据 | 通用修复方法 |
| 文件名与端口不匹配 | nodes-*.conf 文件复制或重命名错误 | Redis 实例无法找到正确的元数据文件 | 通用修复方法 |
6. 通用修复方法(附示例)
所有问题都可以使用以下通用方法修复。
场景:主机 host-01 上的 Redis_1 实例(端口 22400)异常;同一主机上的 Redis_2(端口 22401)正常。
- 停止异常实例:MRS Console → Redis → Instances → 选择异常实例 → Stop Instance
- 备份其元数据文件(在主机上,以
omm身份执行):cd /srv/BigData/redis_meta/Redis_1 && mv nodes-22400.conf nodes-22400.conf_bak - 从正常实例复制元数据文件:
cp /srv/BigData/redis_meta/Redis_2/nodes-22401.conf /srv/BigData/redis_meta/Redis_1/nodes-22400.conf - 验证复制的文件:使用此技能对
/srv/BigData/redis_meta/Redis_1/nodes-22400.conf执行 7 项检查。如果验证失败,请从另一个正常实例复制文件,并在继续操作前再次验证。 - 更正 myself 标记:编辑
/srv/BigData/redis_meta/Redis_1/nodes-22400.conf:- 删除现有的
myself,(它属于复制来的正常实例) - 在包含异常实例端口(
host-01:22400)的行上,将myself,添加到角色标记之前,例如myself,master/myself,slave - 整个文件中的
myself必须恰好出现一次
- 删除现有的
- 启动异常实例:MRS Console → Redis → Instances → 选择该实例 → Start Instance
- 确认恢复情况:实例状态恢复为 Good,Redis 逻辑集群状态恢复正常
- 清理备份文件(在主机上):
rm -f /srv/BigData/redis_meta/Redis_1/nodes-22400.conf_bak
7. 参数
| 参数 | 必填/可选 | 说明 | 默认值 |
|---|---|---|---|
file_path | 可选 | nodes-*.conf 文件路径或包含该文件的目录 | /srv/BigData/redis_meta/Redis_*/nodes-224*.conf |
check_points | 可选 | 要运行的特定检查点 ID(CHK001-CHK007),以逗号分隔 | 全部 7 项检查 |
8. 输出格式
检查报告以纯文本格式输出:
========================================
Redis Metadata File Check Report
File: /path/to/nodes-22400.conf
========================================
[CHK001: Slot Completeness]
Result: PASS/FAIL
Details: ...
[CHK002: Master/Slave Count Consistency]
Result: PASS/FAIL
Details: ...
... (other check points)
========================================
Overall Result: PASS/FAIL
========================================
每项检查结果包括:检查 ID、检查名称、结果(PASS/FAIL)以及发现的任何问题的详细说明。
如果总体结果为 FAIL,请在末尾添加 [Repair Guidance] 部分。修复指导会列出每个失败检查点的问题说明,然后引用第 6 节中的通用修复方法。myself 标记更正步骤必须使用分析文件中的实际数据提供修改前后示例:
[Repair Guidance]
(List each failed check point's issue description)
The above issues are applicable to the general repair method (see Section 6):
Step 1: Stop the abnormal instance
Step 2: Back up the metadata file
Step 3: Copy metadata file from a normal instance on the same host
Step 4: Verify the copied file (run this skill's 7 check points)
Step 5: Correct the myself marker (see example below)
Step 6: Start the abnormal instance
Step 7: Confirm recovery
Step 8: Clean up backup file
Step 5 myself marker modification example (must use actual data, not placeholders):
vi /srv/BigData/redis_meta/Redis_1/nodes-22400.conf
Before modification (copied from normal instance, myself is on normal instance port line):
<actual node ID> "<actual IP>:<abnormal port>@<cluster port>" <role> <master node ID> 0 <epoch> <epoch> connected
<actual node ID> "<actual IP>:<normal port>@<cluster port>" myself,<role> <master node ID> 0 <epoch> <epoch> connected
After modification (remove myself from normal port, add myself to abnormal port line):
<actual node ID> "<actual IP>:<abnormal port>@<cluster port>" myself,<role> <master node ID> 0 <epoch> <epoch> connected
<actual node ID> "<actual IP>:<normal port>@<cluster port>" <role> <master node ID> 0 <epoch> <epoch> connected
Key points:
- Remove the existing "myself," (belongs to the copied normal instance)
- Add "myself," before the role marker on the line with the abnormal instance port
- "myself," must immediately precede the role marker, e.g., myself,master or myself,slave
- "myself" can only appear once in the entire file
关键要求:myself 标记修改示例必须使用分析文件中的实际数据(节点 ID、IP、端口、角色、主节点 ID),而不是通用占位符。
9. 最佳实践
- 从同一逻辑集群中收集:用于复制的源实例必须与异常实例处于同一逻辑集群,且状态正常
- 修复前先验证:修改 myself 标记前,务必使用此技能验证复制的文件
- 始终备份:执行任何修复操作前,先备份原始文件,以便回滚
- 精确修正 myself 标记:整个文件中必须恰好出现一次 myself 标记,且所在行对应目标实例的端口
- 跨主机复制:如果同一主机上没有可用的正常实例,可以从同一集群中另一台主机的实例复制,但修正 myself 标记的方法不变
- 先检查文件格式:当多个检查点未通过时,优先修复文件格式问题(CHK003),再处理其他问题
10. 参考资料
| 参考资料 | 描述 | 相关章节 |
|---|---|---|
| 正确格式示例 | 有效 nodes-*.conf 文件的完整示例,展示全部 7 个检查点 | 3. 工作流、4. 核心命令 |
| MRS Redis 产品文档 | Redis 集群拓扑、nodes-*.conf 元数据文件结构和故障诊断 | 1. 概述 |
| Redis 集群操作指南 | Redis 集群槽位分配(0-16383)、主从关系和端口规划 | 3. 工作流、6. 通用修复方法 |
10.1 正确格式示例
有效 nodes-*.conf 文件的完整示例:
155ce4426e976bc65240829943a2acd8c05806ce "hosts1:22401@24351" slave df37138a11e6708563fdb0962a73a6ae20281b60 0 1777455797875 3 connected
df37138a11e6708563fdb0962a73a6ae20281b60 "hosts2:22400@24350" master - 0 1777455797000 3 connected 10922-16383
f45e8f5d2f89684f9918eb48f60aa5529f2eb498 "hosts3:22400@24350" master - 0 1777455797558 10 connected 5461-10921
8ac5474a124cb0163d92d6921caca52543bcc2f4 "hosts2:22401@24351" slave f45e8f5d2f89684f9918eb48f60aa5529f2eb498 0 1777455797000 10 connected
933540f40adf21a0d580ab5d6d65252da72f6c0d "hosts1:22400@24350" myself,master - 0 1777455797000 1 connected 0-5460
d3da600c0db267fdb18776e44347fa5140cdde21 "hosts3:22401@24351" slave 933540f40adf21a0d580ab5d6d65252da72f6c0d 0 1777455797672 1 connected
vars currentEpoch 10 lastVoteEpoch 10
whitelist "hosts3" "hosts2" "hosts1"
cluster-name test
11. 注意事项
- 此技能仅执行静态文件分析,无需连接 Redis 集群
- 同一集群中的文件除 myself 标记外均相同:来自同一 Redis 逻辑集群的所有 nodes-*.conf 文件内容都相同,只有 myself 标记的位置不同
- 端口相差 1950:在 MRS Redis 中,集群端口始终等于服务端口 + 1950
- 槽位范围为 0-16383:Redis 集群有 16384 个槽位(0-16383),必须全部由主节点覆盖
- myself 唯一性:每个 nodes-*.conf 文件必须恰好包含一个 myself 标记,用于表示当前节点的身份
- 收集文件需要 omm 权限:从集群主机读取 Redis 元数据文件需要 omm 用户权限
- 修复指导必须使用实际数据:生成修复指导时,myself 标记修改示例必须使用分析文件中的实际节点 ID、IP 和端口,不能使用通用占位符