Docker容器部署Nacos高可用集群(详细,可跟做)
神奇的海马体 2024-10-03 16:37:00 阅读 88
文章目录
一、理论知识1、集群选举原理2、高可用集群架构图3、环境信息
二、实现步骤1、部署Docker环境2、部署docker-compose环境3、部署MySQL数据库及配置操作4、部署Nacos5、部署Nginx并代理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地址 | 安装服务 |
---|---|---|
1 | 16.32.15.200 | Nacos、Docker、docker-compose |
2 | 16.32.15.201 | Nacos、Docker、docker-compose |
3 | 16.32.15.115 | Nacos、Docker、docker-compose、MySQL、Nginx |
2、中间件版本信息:
序号 | 中间件名称 | 版本 |
---|---|---|
1 | Nacos | v2.3.2 |
2 | MySQL | 8.0.38 |
3 | Nginx | 1.20.1 |
4 | Docker | 26.1.4 |
二、实现步骤
1、部署Docker环境
1、前提环境准备
<code>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(这里我使用传统方式部署)
<code>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
三、拓展
伪集群在单台服务中运行:
<code>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
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。