9.1.3 存储与一致性模型(MySQL、Distro、Raft)
Nacos 的存储与一致性模型围绕三类能力展开:配置持久化(MySQL)、注册数据高可用(Distro)、强一致元数据(Raft)。本节强调三者边界、运维要点与可操作示例。
MySQL:配置与元数据的持久化存储
- 作用范围:配置管理数据、命名空间、用户权限、历史版本等长期数据落盘。
- 运维要点:主从或 MGR 高可用;定期备份;关注连接池与慢查询。
- 故障影响:MySQL 不可用会影响配置发布与管理操作,已下发到客户端的配置不受影响。
安装与初始化示例(MySQL + Nacos)
# 1) 安装 MySQL(以 yum 为例)
yum install -y mysql-server
systemctl enable --now mysqld
# 2) 创建 nacos 数据库与用户
mysql -uroot -p <<'SQL'
CREATE DATABASE nacos_config DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'nacos'@'%' IDENTIFIED BY 'Nacos@123';
GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'%';
FLUSH PRIVILEGES;
SQL
# 3) 导入 Nacos 表结构(以 nacos-mysql.sql 为例)
mysql -unacos -pNacos@123 nacos_config < /opt/nacos/conf/nacos-mysql.sql
# 4) 配置 Nacos 连接 MySQL
sed -i 's/^spring.datasource.platform.*/spring.datasource.platform=mysql/' /opt/nacos/conf/application.properties
cat >>/opt/nacos/conf/application.properties <<'EOF'
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user.0=nacos
db.password.0=Nacos@123
EOF
# 5) 启动 Nacos(集群节点同理)
/opt/nacos/bin/startup.sh -m standalone
预期效果:Nacos 控制台中新增配置可写入 MySQL,重启后配置仍可见。
排错要点(MySQL)
# 连接异常排查
grep -E "Communications link failure|Access denied" /opt/nacos/logs/nacos.log
# 检查慢查询
mysql -uroot -p -e "SHOW VARIABLES LIKE 'slow_query%';"
常见原因:账号权限不足、连接串错误、端口被防火墙阻断、MySQL 未启动。
Distro:AP 优先的注册数据一致性
- 适用数据:服务实例的临时注册信息与心跳状态。
- 一致性策略:节点间增量同步与全量校验结合;优先保证本地可用。
- 优势与局限:高可用、易扩展;网络分区时可能出现短暂不一致。
- 运维关注:心跳超时参数、实例剔除策略、跨机房同步频率。
示例:注册信息同步观测
# 1) 查看 Nacos 节点日志中 Distro 同步
grep -E "distro|Distro" /opt/nacos/logs/nacos.log | tail -n 50
# 2) 调整心跳超时(示例:默认 15s -> 30s)
# 路径:/opt/nacos/conf/application.properties
echo "nacos.naming.expireInstance=true" >> /opt/nacos/conf/application.properties
echo "nacos.naming.heartbeat.timeout=30000" >> /opt/nacos/conf/application.properties
/opt/nacos/bin/shutdown.sh && /opt/nacos/bin/startup.sh
预期效果:实例心跳超时后剔除时间延长,降低网络抖动导致的误剔除。
排错要点(Distro)
# 实例频繁上下线排查
grep -E "instance.*(DOWN|UP)" /opt/nacos/logs/naming.log | tail -n 100
# 检查节点间网络
ping -c 3 <peer-ip>
常见原因:网络抖动、心跳超时配置过小、节点时间不同步。
Raft:CP 优先的强一致模型
- 适用场景:关键元数据、选主等一致性要求高的路径。
- 机制要点:Leader 选举、日志复制、提交顺序一致。
- 优缺点:强一致与线性化读写保障;写入延迟受多数派影响。
- 运维关注:节点数量建议奇数;网络抖动会影响选举与写入稳定性。
示例:观察 Raft 选主与写入
# 1) 查看 Raft 日志(选主、投票)
grep -E "raft|leader|vote" /opt/nacos/logs/nacos.log | tail -n 80
# 2) 模拟 Leader 节点异常(单节点测试勿用于生产)
# 先找出 leader 进程
ps -ef | grep nacos | grep -v grep
# 停止 leader
/opt/nacos/bin/shutdown.sh
# 观察其他节点是否重新选主
grep -E "leader" /opt/nacos/logs/nacos.log | tail -n 50
预期效果:多数派仍存活时可完成重新选主;若失去多数派,写入暂停。
排错要点(Raft)
# 选主频繁或写入阻塞
grep -E "Not leader|timeout" /opt/nacos/logs/nacos.log | tail -n 100
# 检查节点时钟
timedatectl status
常见原因:网络抖动、节点数为偶数导致多数派不稳定、时间不同步。
模型协同与选型建议
- 配置管理:MySQL 持久化为主,重视数据库高可用与备份。
- 服务注册:Distro 优先可用性,适用于高频心跳与大规模实例。
- 强一致需求:关键元数据与控制面决策使用 Raft。
- 组合策略:“配置强一致 + 注册高可用”,控制面稳、数据面快。
练习
1. 在 3 节点 Nacos 集群中,手动停止 1 个节点,观察 Distro 日志与服务发现是否中断。
2. 人为设置错误的 MySQL 密码,验证配置发布失败并定位报错日志。
3. 调整心跳超时参数,记录实例剔除时间变化。