nacos遗留 Raft节点修复
1.遗留 Raft节点问题
你当前的数据:
1 | "naming_persistent_service": { |
问题本质
172.30.228.7:7848已经下线/废弃但仍存在于 Raft Group(CP一致性组)
导致:
- 集群 quorum 判断异常(潜在风险)
- 出现
invalid redirect request/not found user等异常 - 注册/心跳异常
2.Nacos 2.x Raft 架构关键点
2.1 两类数据源
| 类型 | 说明 |
|---|---|
| AP(临时实例) | Distro 协议 |
| CP(持久实例) | Raft 协议 |
你这个:
1 | naming_persistent_service |
属于 CP(Raft)
2.2 Raft 成员来源
Raft 成员不是动态感知的,而是来源:
1 | cluster.conf |
并在:
1 | ${nacos.home}/data/protocol/raft/ |
中持久化
3.移除遗留节点方法
推荐调整 cluster.conf + 重启
3.1.所有节点修改 cluster.conf(核查)
1 | vim conf/cluster.conf |
删除:
1 | 172.30.228.7:7848 |
确保所有节点一致:
1 | 172.16.164.115:7848 |
3.2.滚动重启 Nacos
1 | sh shutdown.sh |
或者:
1 | systemctl restart nacos |
3.3.验证
1 | curl -s http://ip:8848/nacos/v1/core/cluster/nodes |
确认:
- raftGroupMember 不再包含旧节点
4.如果未生效(常见坑)
4.1 原因:本地 Raft 元数据未清理
Nacos 会缓存旧成员:
1 | data/protocol/raft/ |
4.2 强制清理方案(谨慎)
⚠️ 必须在所有节点停机状态下操作
步骤
1 | cd ${nacos.home}/data/protocol/ |
4.3 重启顺序(关键)
graph TD A[全部节点停机] --> B[删除 raft 数据] B --> C[修改 cluster.conf] C --> D[启动 Leader 节点] D --> E[依次启动其他节点]
5.最终建议(SRE级别)
标准操作流程
修改 cluster.conf(唯一数据源)
滚动重启
若失败:
- 停机清理 raft 元数据
严禁:
- 手动改 DB
- 半节点修改
6.快速排查 Checklist
1 | # 1. cluster.conf 是否一致 |
故障nacos集群基于容器化部署
1.docker-compose.yml
1 | services: |
3个nacos节点,组成nacos集群。
2.env
## .env
# ===== 基础运行模式 =====
MODE: cluster
PREFER_HOST_MODE: ip
NACOS_SERVER_PORT: 8848
NACOS_SERVER_IP: 172.16.164.104 # 在不同节点则填写对应节点IP
NACOS_SERVERS: "172.16.164.104:8848 172.16.164.115:8848 172.16.164.171:8848"
# ===== JVM =====
JVM_XMS: 512m
JVM_XMX: 512m
JVM_XMN: 512m
# ===== MySQL =====
SPRING_DATASOURCE_PLATFORM: mysql
SPRING_SQL_INIT_MODE: never
MYSQL_SERVICE_HOST: 172.16.164.171
MYSQL_SERVICE_PORT: 6767
MYSQL_SERVICE_USER: nacos_test
MYSQL_SERVICE_PASSWORD: xxx
MYSQL_SERVICE_DB_NAME: nacos_config_test
MYSQL_SERVICE_DB_PARAM: "characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai"
# ===== Nacos Auth(2.x 必需)=====
NACOS_AUTH_ENABLE: "true"
nacos.core.auth.enabled: "true"
nacos.core.auth.server.identity.key: nacos
nacos.core.auth.server.identity.value: nacos
nacos.core.auth.plugin.nacos.token.secret.key: U2VjcmV0S2V5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5
nacos.auth.username: nacos
nacos.auth.password: nacos
3.遗留Raft节点解决办法
- nacos全部节点down,在up解决问题。