nacos遗留 Raft节点修复

1.遗留 Raft节点问题

你当前的数据:

1
2
3
4
5
6
7
8
9
10
"naming_persistent_service": {
"leader": "172.16.164.104:7848",
"raftGroupMember": [
"172.30.228.7:7848", ## 历史nacos集群节点已经废弃
"172.16.164.115:7848",
"172.16.164.104:7848",
"172.16.164.171:7848"
],
"term": 94
}

问题本质

  • 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
2
3
172.16.164.115:7848
172.16.164.104:7848
172.16.164.171:7848

3.2.滚动重启 Nacos

1
2
sh shutdown.sh
sh startup.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
2
cd ${nacos.home}/data/protocol/
rm -rf raft/

4.3 重启顺序(关键)

graph TD
A[全部节点停机] --> B[删除 raft 数据]
B --> C[修改 cluster.conf]
C --> D[启动 Leader 节点]
D --> E[依次启动其他节点]

5.最终建议(SRE级别)

标准操作流程

  1. 修改 cluster.conf(唯一数据源)

  2. 滚动重启

  3. 若失败:

    • 停机清理 raft 元数据
  4. 严禁:

    • 手动改 DB
    • 半节点修改

6.快速排查 Checklist

1
2
3
4
5
6
7
8
9
10
11
# 1. cluster.conf 是否一致
cat conf/cluster.conf

# 2. raft 元数据是否残留
ls data/protocol/raft/

# 3. 当前 leader
curl ip:8848/nacos/v1/core/cluster/nodes

# 4. 是否有旧节点心跳日志
grep 172.30.228.7 logs/*

故障nacos集群基于容器化部署

1.docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
nacos:
image: xxx/base/nacos-server:v2.3.1
container_name: nacos-server-01
restart: always
network_mode: host
privileged: true

env_file:
- ./.env

volumes:
- ./logs:/home/nacos/logs # 说明/home/nacos/data/protocol/raft/ 非持久化本地

healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:8848/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 5s
retries: 5

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解决问题。