1. 为什么需要Nacos持久化部署

第一次接触Nacos的同学可能会有疑问:为什么不能直接用Docker跑个Nacos容器就完事了?这里有个血泪教训要分享。去年我们团队在测试环境直接用默认方式启动Nacos容器,结果某天服务器意外重启,所有服务注册信息和配置数据全部丢失,导致十几个微服务集体瘫痪。这就是没有做持久化的惨痛代价。

Nacos作为服务发现和配置中心,存储着两类关键数据:

  • 动态数据:服务注册表、健康检查状态等运行时信息
  • 静态数据:配置文件、命名空间等持久化配置

当使用Docker默认运行方式时,这些数据都存储在容器内部。一旦容器停止或重建,数据就会像沙滩上的字迹一样被"潮水"抹去。想象一下,每次重启服务器都要重新注册所有微服务、重新配置所有参数,这运维工作简直要人命。

持久化部署的核心思路其实很简单:把容器内的重要目录映射到宿主机。具体来说需要重点关注三个目录:

  1. /home/nacos/conf - 存放集群配置、自定义参数
  2. /home/nacos/logs - 运行日志和访问记录
  3. /home/nacos/data - 服务注册数据和快照

实测发现,生产环境如果不做持久化,平均每3个月就会因为各种原因(服务器维护、意外宕机等)导致数据丢失。而配置了目录挂载后,即使容器完全重建,数据也能毫发无损。

2. 环境准备与镜像获取

2.1 获取Nacos官方镜像

官方提供了两个版本的镜像:

  • nacos/nacos-server:标准版
  • nacos/nacos-server:latest(带tag的版本)

建议使用带具体版本号的镜像,避免自动升级带来的兼容性问题。比如:

docker pull nacos/nacos-server:v2.2.3

如果服务器无法连接外网,可以按这个流程操作:

  1. 在联网机器拉取镜像
    docker pull nacos/nacos-server:v2.2.3
    
  2. 导出为本地文件
    docker save -o nacos-v2.2.3.tar nacos/nacos-server:v2.2.3
    
  3. 通过U盘或内网传输到目标服务器
  4. 在目标服务器加载镜像
    docker load -i nacos-v2.2.3.tar
    

2.2 数据库准备

Nacos支持两种存储模式:

  • 嵌入式数据库(默认):Derby,仅适合测试
  • 外置MySQL:生产环境必选

MySQL配置有个坑要注意:必须使用5.7+版本,且需要提前执行初始化脚本。我整理了个一键配置脚本:

# 创建数据库(假设MySQL已安装)
mysql -uroot -p -e "CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 下载初始化脚本
wget https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql

# 导入表结构
mysql -uroot -p nacos_config < mysql-schema.sql

曾经有团队因为没设置字符集,导致中文配置全部乱码,所以务必记得加utf8mb4参数。

3. 目录挂载实战操作

3.1 创建挂载目录结构

新手常犯的错误是直接挂载空目录,导致容器启动失败。正确做法是先创建目录并复制初始文件:

# 创建三级目录结构
mkdir -p /data/nacos/{conf,logs,data}

# 启动临时容器(仅用于文件拷贝)
docker run -d --name nacos-temp nacos/nacos-server:v2.2.3

# 拷贝初始配置文件
docker cp nacos-temp:/home/nacos/conf/ /data/nacos/
docker cp nacos-temp:/home/nacos/logs/ /data/nacos/ 
docker cp nacos-temp:/home/nacos/data/ /data/nacos/

# 清理临时容器
docker rm -f nacos-temp

这里有个细节:必须保持目录权限一致。我遇到过因为权限问题导致Nacos无法写入日志的情况,建议这样设置:

chown -R 1000:1000 /data/nacos  # Nacos容器默认使用nacos用户(UID=1000)
chmod -R 755 /data/nacos

3.2 关键配置文件调整

挂载conf目录后,需要重点关注两个文件:

  1. application.properties:数据库连接池配置
  2. cluster.conf:集群节点配置(单机可忽略)

对于MySQL连接,建议添加这些优化参数:

# 连接池配置
db.num=2
db.maxActive=20
db.maxIdle=10
db.minIdle=5
db.maxWait=5000

曾经有生产环境因为连接数不足导致Nacos假死,调整后性能提升明显。

4. 完整启动命令解析

这是经过生产验证的启动脚本,包含所有关键参数:

docker run -d \
  --name nacos \
  --privileged=true \
  --restart=always \
  -e MODE=standalone \
  -e SPRING_DATASOURCE_PLATFORM=mysql \
  -e MYSQL_SERVICE_HOST=192.168.1.100 \
  -e MYSQL_SERVICE_PORT=3306 \
  -e MYSQL_SERVICE_USER=nacos \
  -e MYSQL_SERVICE_PASSWORD=StrongPassword123 \
  -e MYSQL_SERVICE_DB_NAME=nacos_config \
  -e TIME_ZONE='Asia/Shanghai' \
  -v /data/nacos/logs:/home/nacos/logs \
  -v /data/nacos/data:/home/nacos/data \
  -v /data/nacos/conf:/home/nacos/conf \
  -p 8848:8848 \
  -p 9848:9848 \
  -p 9849:9849 \
  nacos/nacos-server:v2.2.3

参数详解

  • --privileged:让容器有足够权限写文件系统
  • TIME_ZONE:务必设置,否则日志时间全乱
  • 端口说明:
    • 8848:HTTP API和控制台
    • 9848/9849:gRPC通信端口(2.0+版本新增)

遇到过最坑的问题是防火墙忘记开放9848/9849端口,导致客户端一直报连接超时。

5. 验证与排错指南

5.1 健康检查

启动后执行这些检查:

# 查看容器状态
docker ps -a | grep nacos

# 检查日志(前100行)
docker logs --tail=100 nacos

# 验证接口
curl -X GET "http://localhost:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=10"

5.2 常见问题处理

问题1:启动时报"Permission denied"

  • 解决方案:
    chcon -Rt svirt_sandbox_file_t /data/nacos
    

问题2:MySQL连接失败

  • 检查方向:
    1. 数据库是否允许远程连接
    2. 账号密码是否正确
    3. 防火墙是否放行3306端口

问题3:控制台能打开但服务频繁掉线

  • 通常是因为没开放gRPC端口,检查:
    iptables -L -n | grep 9848
    

6. 生产环境优化建议

经过多个项目实践,总结出这些经验:

  1. 日志轮转:Nacos日志增长极快,建议添加logrotate配置
    /data/nacos/logs/*.log {
        daily
        rotate 30
        compress
        missingok
        notifempty
    }
    
  2. 备份策略
    • 每天备份/data/nacos/data目录
    • 使用rsync做异地备份
  3. 监控指标
    • 关注JVM内存使用率
    • 监控MySQL连接数
    • 设置服务健康检查告警

有次我们Nacos因为磁盘满了导致服务不可用,现在都会在/data分区设置80%使用率告警。

7. 版本升级注意事项

当需要升级Nacos版本时,务必遵循这个流程:

  1. 备份所有挂载目录
  2. 导出当前数据库快照
  3. 查看官方release notes中的不兼容变更
  4. 先在小规模测试环境验证
  5. 生产环境选择低峰期操作

曾经有团队直接从1.4升级到2.0导致所有客户端无法连接,就是因为忽略了gRPC协议的变更。

更多推荐