mcpField
H
huawei-cloud-mrs-redis-meta-check

huawei-cloud-mrs-redis-meta-check

github.com/huaweicloud云与 DevOps5949 次安装2 天前更新
代码仓库

关于 huawei-cloud-mrs-redis-meta-check

huawei-cloud-mrs-redis-meta-check 是用于静态检查 MRS Redis 集群元数据文件的技能。它按七项规则分析提供的 nodes-*.conf 文件并报告问题,不连接集群。

主要功能

  1. 01静态检查 Redis 元数据文件
  2. 02验证槽位覆盖和节点数量
  3. 03检查文件模块及端口一致性
  4. 04核验主从关系和 myself 标记
  5. 05报告错误并提供修复指引

适用场景

  1. 01排查 Redis 实例启动失败
  2. 02检查 Redis 连接或实例异常
  3. 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 个从实例
CHK007Myself 标记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:实例异常且无法启动,需要收集文件进行分析

实例异常时,文件仍保留在磁盘上。回复上述目录,并请用户提供:

  1. 与异常实例对应的文件,例如 /srv/BigData/redis_meta/Redis_1/nodes-22400.conf
  2. 同一主机上一个正常实例的文件,用于对比,例如 /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:定位文件

如果用户未指定特定文件:

  1. 在用户提供的目录或文件中搜索 nodes-224*.conf 文件
  2. 如果未找到,则扩大搜索范围,在目录及其子目录中查找 nodes-*.conf 或 *.conf 文件
  3. 列出所有匹配的文件
  4. 让用户选择要检查的文件,或检查所有文件

如果用户指定了文件:

  1. 首先按指定路径搜索
  2. 如果未找到,则在指定目录及其子目录中递归搜索
  3. 如果找到单个文件,无论文件名是否符合命名规范,都直接读取内容进行分析
  4. 如果内容符合 Redis 元数据格式(包含节点 ID、角色、槽位信息等),则执行检查
步骤 3:解析文件

使用第 4.1 节中的解析命令提取关键信息:

  • 所有节点行(Connection 模块)
  • Myself 行
  • Vars 行(Epoch 模块)
  • Whitelist 行
  • Cluster-name 行
步骤 4:执行 7 项检查
CHK001:槽位完整性

检查内容:

  • 所有主节点实例的槽位范围必须覆盖 0-16383,共计 16384 个槽位
  • 主节点实例必须包含槽位信息(例如 0-5460)
  • 从节点实例不应包含槽位信息

检查方法:

  1. 提取所有主节点的槽位范围
  2. 合并所有槽位范围,确保覆盖 0-16383,且无间隙或重叠
  3. 检查从节点是否错误地包含槽位

通过标准:槽位范围完整覆盖 0-16383

CHK002:主从节点数量一致性

检查内容:

  • 主节点和从节点实例的数量必须一致
  • 实例总数必须为偶数

检查方法:

  1. 统计主节点数量(包括 myself、主节点或独立主节点)
  2. 统计从节点数量
  3. 验证两者数量相等且总数为偶数

通过标准:主节点数量 = 从节点数量,且总数为偶数

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

检查方法:

  1. 检查是否存在 vars 行(Epoch 模块)
  2. 检查是否存在 whitelist 行(白名单模块)
  3. 检查是否存在 cluster-name 行(集群名称模块)
  4. 检查连接模块的行是否包含异常字符(条目损坏、特殊字符等)

通过标准:4 个模块均存在且格式正确

CHK004:文件名与端口一致性

检查内容:

  • 文件名中的端口号(例如,nodes-22400.conf)必须与标记为 myself 的行中的端口一致
  • 示例:在 nodes-22400.conf 中,myself 标记应为 hosts1:22400

检查方法:

  1. 从文件名中提取端口号(例如,22400)
  2. 从标记为 myself 的行中提取端口号
  3. 验证二者是否一致

通过标准:文件名端口 = myself 标记端口

CHK005:端口关系

检查内容:

  • 每对主从实例的端口关系必须满足:cluster_port - service_port = 1950
  • 示例:22401@24351,24351-22401=1950

检查方法:

  1. 提取所有节点的 service_port@cluster_port
  2. 验证每对端口的差值是否为 1950

通过标准:所有端口对的差值均为 1950

CHK006:主从关系

检查内容:

  • 每个主实例只能匹配一个从实例
  • 如果一个主实例匹配多个从实例,则检查失败

检查方法:

  1. 提取每个从实例的主节点 ID
  2. 统计每个主节点对应的从实例数量
  3. 验证每个主节点最多对应一个从实例

通过标准:每个主节点最多对应 1 个从实例

CHK007:Myself 标记

检查内容:

  • 文件必须包含一行带有 myself 标记的内容
  • 该行表示当前节点的身份

检查方法:

  1. 搜索包含“myself”的行
  2. 验证 myself 行的格式是否正确
  3. 验证整个文件中是否恰好有一个 myself 标记

通过标准:恰好存在一行带有 myself 标记的内容

步骤 5:生成报告

按照第 8 节:输出格式中定义的格式生成检查报告。

总体结果为 FAIL 时,报告末尾必须附上修复指导。修复指导:

  • 列出每个未通过检查项的问题描述
  • 参考第 6 节中的通用修复方法
  • 对于 myself 标记修正步骤,应根据已分析文件中的实际数据(节点 ID、IP、端口、角色、主节点 ID)提供修改前后的示例,而不是使用 xxxxxxxx 之类的通用占位符

构造 myself 标记示例的具体步骤:

  1. 从 myself 行中提取异常实例的节点 ID、IP、端口、角色和主节点 ID
  2. 假设从同一主机上的另一个正常实例复制内容,构造修改前后的对照示例
  3. 示例必须至少包含异常实例端口行和正常实例端口行的修改对照

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)正常。

  1. 停止异常实例:MRS Console → Redis → Instances → 选择异常实例 → Stop Instance
  2. 备份其元数据文件(在主机上,以 omm 身份执行):
    cd /srv/BigData/redis_meta/Redis_1 && mv nodes-22400.conf nodes-22400.conf_bak
    
  3. 从正常实例复制元数据文件:
    cp /srv/BigData/redis_meta/Redis_2/nodes-22401.conf /srv/BigData/redis_meta/Redis_1/nodes-22400.conf
    
  4. 验证复制的文件:使用此技能对 /srv/BigData/redis_meta/Redis_1/nodes-22400.conf 执行 7 项检查。如果验证失败,请从另一个正常实例复制文件,并在继续操作前再次验证。
  5. 更正 myself 标记:编辑 /srv/BigData/redis_meta/Redis_1/nodes-22400.conf:
    • 删除现有的 myself,(它属于复制来的正常实例)
    • 在包含异常实例端口(host-01:22400)的行上,将 myself, 添加到角色标记之前,例如 myself,master / myself,slave
    • 整个文件中的 myself 必须恰好出现一次
  6. 启动异常实例:MRS Console → Redis → Instances → 选择该实例 → Start Instance
  7. 确认恢复情况:实例状态恢复为 Good,Redis 逻辑集群状态恢复正常
  8. 清理备份文件(在主机上):
    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. 最佳实践

  1. 从同一逻辑集群中收集:用于复制的源实例必须与异常实例处于同一逻辑集群,且状态正常
  2. 修复前先验证:修改 myself 标记前,务必使用此技能验证复制的文件
  3. 始终备份:执行任何修复操作前,先备份原始文件,以便回滚
  4. 精确修正 myself 标记:整个文件中必须恰好出现一次 myself 标记,且所在行对应目标实例的端口
  5. 跨主机复制:如果同一主机上没有可用的正常实例,可以从同一集群中另一台主机的实例复制,但修正 myself 标记的方法不变
  6. 先检查文件格式:当多个检查点未通过时,优先修复文件格式问题(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. 注意事项

  1. 此技能仅执行静态文件分析,无需连接 Redis 集群
  2. 同一集群中的文件除 myself 标记外均相同:来自同一 Redis 逻辑集群的所有 nodes-*.conf 文件内容都相同,只有 myself 标记的位置不同
  3. 端口相差 1950:在 MRS Redis 中,集群端口始终等于服务端口 + 1950
  4. 槽位范围为 0-16383:Redis 集群有 16384 个槽位(0-16383),必须全部由主节点覆盖
  5. myself 唯一性:每个 nodes-*.conf 文件必须恰好包含一个 myself 标记,用于表示当前节点的身份
  6. 收集文件需要 omm 权限:从集群主机读取 Redis 元数据文件需要 omm 用户权限
  7. 修复指导必须使用实际数据:生成修复指导时,myself 标记修改示例必须使用分析文件中的实际节点 ID、IP 和端口,不能使用通用占位符

评论

支持 Markdown