docker-compose编排nacos高可用集群与nginx负载均衡实战

docker-compose编排nacos高可用集群与nginx负载均衡实战
1. 环境准备与基础概念在开始部署Nacos高可用集群之前我们需要先理解几个关键概念。Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台常用于微服务架构中。高可用集群意味着即使某个节点发生故障整个系统仍能继续运行。而Docker Compose是一个用于定义和运行多容器Docker应用的工具通过一个YAML文件就能搞定所有服务部署。我建议在开始之前准备好以下环境一台或多台Linux服务器建议CentOS 7或Ubuntu 18.04已安装Docker和Docker ComposeMySQL数据库用于Nacos数据持久化基本的Linux操作和Docker使用经验如果你还没有安装Docker和Docker Compose可以按照以下命令快速安装# 安装Docker curl -fsSL https://get.docker.com | sh systemctl start docker systemctl enable docker # 安装Docker Compose curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose2. MySQL数据库配置Nacos支持多种数据库但在生产环境中我们强烈建议使用MySQL作为持久化存储。我遇到过不少开发者直接使用内置的Derby数据库结果数据丢失后追悔莫及。下面是如何配置MySQL的详细步骤首先登录MySQL创建一个专用数据库和用户CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER nacos% IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON nacos_config.* TO nacos%; FLUSH PRIVILEGES;然后需要初始化Nacos的数据库表结构。你可以从Nacos的GitHub仓库获取SQL脚本wget https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql mysql -u nacos -p nacos_config mysql-schema.sql这里有个小技巧在实际项目中我通常会修改这个SQL脚本增加一些索引优化查询性能。比如在config_info表上添加针对data_id和group_id的联合索引。3. 编写docker-compose文件这是整个部署过程中最关键的部分。我们将使用docker-compose来定义和运行三个Nacos节点组成的集群。下面是一个完整的docker-compose.yml示例version: 3 services: nacos1: image: nacos/nacos-server:2.0.3 container_name: nacos1 environment: - PREFER_HOST_MODEhostname - MODEcluster - NACOS_SERVERSnacos1:8848 nacos2:8848 nacos3:8848 - SPRING_DATASOURCE_PLATFORMmysql - MYSQL_SERVICE_HOST你的MySQL地址 - MYSQL_SERVICE_DB_NAMEnacos_config - MYSQL_SERVICE_PORT3306 - MYSQL_SERVICE_USERnacos - MYSQL_SERVICE_PASSWORD你的密码 - JVM_XMS512m - JVM_XMX512m volumes: - ./cluster-logs/nacos1:/home/nacos/logs ports: - 8848:8848 - 9848:9848 networks: nacos_net: aliases: - nacos1 nacos2: image: nacos/nacos-server:2.0.3 container_name: nacos2 environment: - PREFER_HOST_MODEhostname - MODEcluster - NACOS_SERVERSnacos1:8848 nacos2:8848 nacos3:8848 - SPRING_DATASOURCE_PLATFORMmysql - MYSQL_SERVICE_HOST你的MySQL地址 - MYSQL_SERVICE_DB_NAMEnacos_config - MYSQL_SERVICE_PORT3306 - MYSQL_SERVICE_USERnacos - MYSQL_SERVICE_PASSWORD你的密码 - JVM_XMS512m - JVM_XMX512m volumes: - ./cluster-logs/nacos2:/home/nacos/logs ports: - 8849:8848 - 9849:9848 networks: nacos_net: aliases: - nacos2 nacos3: image: nacos/nacos-server:2.0.3 container_name: nacos3 environment: - PREFER_HOST_MODEhostname - MODEcluster - NACOS_SERVERSnacos1:8848 nacos2:8848 nacos3:8848 - SPRING_DATASOURCE_PLATFORMmysql - MYSQL_SERVICE_HOST你的MySQL地址 - MYSQL_SERVICE_DB_NAMEnacos_config - MYSQL_SERVICE_PORT3306 - MYSQL_SERVICE_USERnacos - MYSQL_SERVICE_PASSWORD你的密码 - JVM_XMS512m - JVM_XMX512m volumes: - ./cluster-logs/nacos3:/home/nacos/logs ports: - 8850:8848 - 9850:9848 networks: nacos_net: aliases: - nacos3 networks: nacos_net: driver: bridge这个配置有几个关键点需要注意我们创建了三个Nacos服务(nacos1、nacos2、nacos3)它们使用相同的MySQL数据库每个Nacos实例都挂载了独立的日志目录方便排查问题端口映射方面8848是HTTP API端口9848是gRPC端口Nacos 2.0新增我们使用了hostname模式而非IP模式这样更灵活且不易受IP变化影响4. Nginx负载均衡配置有了Nacos集群后我们需要一个统一的入口来分发请求。Nginx是个不错的选择。下面是一个Nginx配置示例upstream nacos_cluster { server nacos1:8848; server nacos2:8848; server nacos3:8848; } server { listen 80; server_name nacos.yourdomain.com; location / { proxy_pass http://nacos_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 长连接超时设置 proxy_connect_timeout 30s; proxy_read_timeout 600s; proxy_send_timeout 600s; } }你可以把这个配置添加到Nginx的配置文件中或者如果你也用Docker运行Nginx可以创建一个新的docker-compose服务nginx: image: nginx:1.21 ports: - 80:80 volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf depends_on: - nacos1 - nacos2 - nacos3 networks: - nacos_net在实际项目中我通常会为Nginx配置健康检查自动剔除不健康的Nacos节点upstream nacos_cluster { server nacos1:8848 max_fails3 fail_timeout30s; server nacos2:8848 max_fails3 fail_timeout30s; server nacos3:8848 max_fails3 fail_timeout30s; }5. 集群启动与验证一切准备就绪后就可以启动整个集群了docker-compose up -d启动后可以通过以下方式验证集群状态检查各节点日志docker logs -f nacos1访问Nacos控制台 打开浏览器访问 http://你的服务器IP/nacos默认用户名密码是nacos/nacos检查集群节点状态 在控制台的集群管理-节点列表中应该能看到三个节点都是健康的通过API检查curl http://你的服务器IP/nacos/v1/ns/operator/cluster/state6. 常见问题与优化建议在实际部署过程中你可能会遇到以下问题节点无法加入集群 检查防火墙是否开放了7848端口用于集群通信 确保所有节点的NACOS_SERVERS配置一致内存不足 适当增加JVM内存参数JVM_XMS和JVM_XMX 对于大型系统建议设置为2G或更高MySQL连接问题 确保MySQL允许远程连接 检查MySQL最大连接数是否足够建议设置100性能优化建议为MySQL添加合适的索引定期清理历史数据Nacos会积累大量配置变更记录考虑使用读写分离的MySQL架构安全建议修改默认的nacos/nacos账号密码启用Nacos的身份认证功能通过Nginx配置HTTPS访问7. 生产环境进阶配置对于生产环境你可能还需要考虑以下配置数据持久化 将Nacos的日志和配置文件挂载到宿主机volumes: - ./data/nacos1/logs:/home/nacos/logs - ./data/nacos1/conf:/home/nacos/conf监控告警 集成Prometheus监控Nacos集群状态 配置关键指标告警如节点下线、内存使用过高等备份策略 定期备份MySQL数据库 考虑使用xtrabackup进行热备份版本升级 测试环境先验证新版本 采用滚动升级策略逐个节点更新灾备方案 考虑跨机房部署集群 配置异地灾备集群这套部署方案已经在多个生产环境中验证过能够支撑日均百万级的配置访问量。关键在于合理配置资源、做好监控告警、定期维护。