Docker容器部署Nacos高可用集群(详细,可跟做)

一、理论知识

1、集群选举原理

1、节点状态和角色:

  • Leader(领导者)
    • 负责状态管理:Leader负责管理整个集群的状态,包括配置更新、服务注册和发现等。
    • 处理客户端请求:所有的客户端写请求必须经过Leader处理,Leader会负责将这些请求复制到其他节点,确保数据一致性。
    • 心跳检测:Leader定期发送心跳信号给Follower,以确认集群中所有节点的状态。
    • 日志复制:Leader将接收到的客户端写请求复制到其他节点(Follower)上,确保数据的持久化和一致性。
  • Follower(跟随者):
    • 接收日志条目:Follower从Leader接收复制的日志条目,保持自己的数据与Leader一致。
    • 响应客户端读请求:Follower可以响应客户端的读请求,但是写请求必须转发给Leader处理。
    • 参与选举:Follower可以成为Candidate参与选举过程,以便在Leader失效时选举出新的Leader。
  • Candidate(候选者):
    • 发起选举:当一个节点认为当前的Leader失效时,它会变成Candidate,并向其他节点发起选举请求。
    • 获得选票:候选者需要集群中过半数节点的投票才能成为新的Leader。
    • 参与心跳检测:在选举期间,Candidate也会参与心跳检测,以确保集群中没有活跃的Leader。

2、Leader选举机制:

在初始启动或者发生Leader节点故障时,集群需要选举一个新的Leader。候选者节点通过投票来决定新的Leader。

3、投票机制:

候选者向其他节点发送选举请求,其他节点如果同意,则将自己的投票给候选者。候选者需要获得集群中过半数节点的投票才能成为新的Leader。

4、数据同步机制:

Nacos采用Raft算法作为其核心的一致性协议,确保在分布式环境下各个节点之间的数据强一致性。Raft算法通过选举Leader节点来处理数据更新请求,并同步到Follower节点,从而实现集群节点间的数据同步。

2、高可用集群架构图

在这里插入图片描述

  • Nacos集群连接一套MySQL数据库
  • 通过Nginx二级代理Nacos集群
  • 微服务程序连接Nacos可写为NginxIP/nacos,nginx会负载到三台Nacos集群中,当然如果程序支持连接Nacos集群,可直接配置连接Nacos集群,就不过一层Nginx了。

3、环境信息

1、服务器信息:

序号IP地址安装服务
116.32.15.200Nacos、Docker、docker-compose
216.32.15.201Nacos、Docker、docker-compose
316.32.15.115Nacos、Docker、docker-compose、MySQL、Nginx

2、中间件版本信息:

序号中间件名称版本
1Nacosv2.3.2
2MySQL8.0.38
3Nginx1.20.1
4Docker26.1.4

二、实现步骤

1、部署Docker环境

1、前提环境准备

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2、配置阿里云Yum源

yum -y install yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、安装Docker

yum install docker-ce docker-ce-cli containerd.io -y

4、配置国内镜像加速地址

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com"]
}
EOF

5、启动并加入自启动

systemctl start docker
systemctl enable docker

6、查看版本

docker --version

2、部署docker-compose环境

1、下载docker-compose(官方的,下载较慢)

curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2、赋予执行权限

chmod +x /usr/local/bin/docker-compose

3、查看版本

docker-compose --version

3、部署MySQL数据库及配置操作

1、目录准备

mkdir ~/docker-compose/mysql -p
mkdir /home/software/mysql/{data,logs} -p

2、创建MySQL的docker-compose.yaml文件

vim ~/docker-compose/mysql/docker-compose.yaml

version: '3'
services:
  mysql:
    image: "mysql:8.0.38"
    container_name: "mysql"
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=Asd@123$
    restart: on-failure:3
    volumes:
      - /home/software/mysql/data:/var/lib/mysql
      - /home/software/mysql/logs:/var/log/mysql
    network_mode: "host"

3、运行MySQL容器

cd ~/docker-compose/mysql
docker-compose up -d

4、创建数据库、用户、赋权操作

docker exec -it mysql mysql -uroot -pAsd@123$

create database nacos;
create user "nacos"@"%" identified WITH mysql_native_password by "Asd@123$";
grant all on nacos.* to "nacos"@"%";
flush privileges;
exit;

4、部署Nacos

1、获取初始化SQL,并导入

docker run -itd --name test-nacos nacos/nacos-server:v2.3.2 /bin/bash
docker cp test-nacos:/home/nacos/conf/mysql-schema.sql .
docker rm -f test-nacos

导入SQL至nacos库中:

docker cp mysql-schema.sql mysql:/tmp
docker exec -it mysql mysql -uroot -pAsd@123$ nacos

source /tmp/mysql-schema.sql
exit;

2、目录准备

mkdir ~/docker-compose/nacos -p
mkdir /home/software/nacos/data -p

3、创建Nacos的docker-compose.yaml文件

注意:所有节点中docker-compose.yaml文件文件内容相同

vim ~/docker-compose/nacos/docker-compose.yaml

version: '3'
services: 
 nacos:
    image: "nacos/nacos-server:v2.3.2"
    container_name: nacos
    restart: on-failure:3
    environment:
      - TZ=Asia/Shanghai
      - MODE=cluster
      - PREFER_HOSTZ_MODE=ip
      - NACOS_SERVER_PORT=8848
      - NACOS_SERVERS=16.32.15.115:8848 16.32.15.200:8848 16.32.15.201:8848
      - MYSQL_SERVICE_HOST=16.32.15.115
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=Asd@123$
      - JVM_XMS=1024m
      - JVM_XMX=1024m
      - NACOS_AUTH_ENABLE=true
      - SPRING_DATASOURCE_PLATFORM=mysql
      - NACOS_AUTH_IDENTITY_KEY=2222
      - NACOS_AUTH_IDENTITY_VALUE=2xxx
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
    volumes:
      - /home/software/nacos/data:/home/nacos/data
    network_mode: "host"
    privileged: true

4、运行Nacos容器

cd ~/docker-compose/nacos
docker-compose up -d

5、验证Nacos集群

访问任意节点地址:http://IP:8848/nacos

默认账号/密码:nacos/nacos

登入WEB管理页面后,点击 集群管理 > 节点列表,如下图:

在这里插入图片描述

5、部署Nginx并代理Nacos集群

1、部署Nginx(这里我使用传统方式部署)

yum -y install epel-*
yum -y install nginx

2、配置负载均衡

vim /etc/nginx/conf.d/nacos.conf

upstream nacosCluster {
        server 16.32.15.115:8848 weight=3;
        server 16.32.15.200:8848 weight=3;
        server 16.32.15.201:8848 weight=3;
}
server {
    location /nacos {
        proxy_pass http://nacosCluster;
        proxy_connect_timeout 3s;
        proxy_read_timeout 30s;
        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_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
    }
}

3、启动并加入自启动

nginx -t # 检查配置语法
systemctl start nginx
systemctl enable nginx

4、验证

浏览器访问:http://NginxIP/nacos

在这里插入图片描述

三、拓展

伪集群在单台服务中运行:

version: '3'
services: 
 nacos1:
    image: "nacos/nacos-server:v2.3.2"
    container_name: nacos1
    restart: on-failure:3
    environment:
      - TZ=Asia/Shanghai
      - MODE=cluster
      - PREFER_HOSTZ_MODE=ip
      - NACOS_SERVER_PORT=8848
      - NACOS_SERVERS=172.40.0.4 172.40.0.3 172.40.0.2
      - MYSQL_SERVICE_HOST=16.32.15.115
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=Asd@123$
      - JVM_XMS=1024m
      - JVM_XMX=1024m
      - NACOS_AUTH_ENABLE=true
      - SPRING_DATASOURCE_PLATFORM=mysql
      - NACOS_AUTH_IDENTITY_KEY=2222
      - NACOS_AUTH_IDENTITY_VALUE=2xxx
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
    privileged: true
    ports:
      - "17848:7848"
      - "18848:8848"
      - "19848:9848"
      - "19849:9849"
    networks:
      nacos-network:
        ipv4_address: 172.40.0.4

 nacos2:
    image: "nacos/nacos-server:v2.3.2"
    container_name: nacos2
    restart: on-failure:3
    environment:
      - TZ=Asia/Shanghai
      - MODE=cluster
      - PREFER_HOSTZ_MODE=ip
      - NACOS_SERVER_PORT=8848
      - NACOS_SERVERS=172.40.0.4 172.40.0.3 172.40.0.2
      - MYSQL_SERVICE_HOST=16.32.15.115
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=Asd@123$
      - JVM_XMS=1024m
      - JVM_XMX=1024m
      - NACOS_AUTH_ENABLE=true
      - SPRING_DATASOURCE_PLATFORM=mysql
      - NACOS_AUTH_IDENTITY_KEY=2222
      - NACOS_AUTH_IDENTITY_VALUE=2xxx
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
    privileged: true
    ports:
      - "27848:7848"
      - "28848:8848"
      - "29848:9848"
      - "29849:9849"
    networks:
      nacos-network:
        ipv4_address: 172.40.0.3

 nacos3:
    image: "nacos/nacos-server:v2.3.2"
    container_name: nacos3
    restart: on-failure:3
    environment:
      - TZ=Asia/Shanghai
      - MODE=cluster
      - PREFER_HOSTZ_MODE=ip
      - NACOS_SERVER_PORT=8848
      - NACOS_SERVERS=172.40.0.4 172.40.0.3 172.40.0.2
      - MYSQL_SERVICE_HOST=16.32.15.115
      - MYSQL_SERVICE_DB_NAME=nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=Asd@123$
      - JVM_XMS=1024m
      - JVM_XMX=1024m
      - NACOS_AUTH_ENABLE=true
      - SPRING_DATASOURCE_PLATFORM=mysql
      - NACOS_AUTH_IDENTITY_KEY=2222
      - NACOS_AUTH_IDENTITY_VALUE=2xxx
      - NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
    privileged: true
    ports:
      - "37848:7848"
      - "38848:8848"
      - "39848:9848"
      - "39849:9849"
    networks:
      nacos-network:
        ipv4_address: 172.40.0.2

networks:
  nacos-network:
    ipam:
      driver: default
      config:
        - subnet: 172.40.0.0/16
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用Docker Compose部署Nacos集群,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了DockerNacos的数据库。 2. 创建一个目录来存放Nacos相关文件。 3. 在该目录下创建并编写一个名为`nginx.conf`的配置文件,用于配置Nginx。 4. 创建并编写一个名为`docker-compose.yaml`的配置文件,用于编排Nacos集群容器。 5. 使用以下命令来编排和启动Nacos集群容器: ``` docker-compose -f docker-compose.yaml up -d ``` 6. 等待一段时间,直到所有容器都成功启动。你可以使用以下命令来查看容器的运行情况: ``` docker ps -n 5 ``` 7. 最后,你可以通过访问`http://{ip}:8845/nacos`来访问Nacos的管理界面,账号和密码都是`nacos`。 请注意,上述步骤中的具体配置文件和命令可以根据你的实际情况进行调整。 #### 引用[.reference_title] - *1* *2* [docker-compose部署Nacos集群](https://blog.csdn.net/weixin_44842613/article/details/124629239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [使用Docker Compose快速部署整套Nacos集群](https://blog.csdn.net/m0_37924754/article/details/131241702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神奇的海马体

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值