docker-compose搭建consul高可用主从集群
- 使用docker手动搭建consul集群
- 测试consul是否能正常启动
- 搭建consul-master集群
- 搭建consul-slave集群,加入master
- 加入nginx,实现slave的负载均衡
- 使用docker-compose构建
- 构建consul-master集群
- 构建consul-slave集群
- 使用nginx对consul-slave实现负载均衡
- 测试集群高可用
- 关闭consul-slave-1节点
- 这里修改了服务名称和端口,模拟另一个服务
- 获取服务实例,测试是否能获取consul-slave-1节点上注册的服务
- 写在最后
使用docker手动搭建consul集群
#拉取consul镜像
docker pull consul:1.9.0
测试consul是否能正常启动
docker run --rm -ti -p 8500:8500 consul:1.9.0
启动成功如下
浏览器访问
搭建consul-master集群
注意: consul集群节点最少数量通过-bootstrap-expect来决定的,这里我的master集群数量设置为2
集群需要在同一个网段,并且有固定ip,所以这里我们先创建一个网卡,用于集群使用
docker network create --driver=bridge --subnet=10.10.0.0/16 consul
1.启动consul-master-1节点
docker run --name consul-master-1 --network=consul --ip=10.10.10.10 -p 8500:8500 -d consul:1.9.0 agent -bind=0.0.0.0 -bootstrap-expect=2 -node=consul-master-1 -server -client=0.0.0.0 -ui
这里还没有节点加入
2.启动consul-master-2节点,加入集群
这里就不暴露端口了
docker run --name consul-master-2 --network=consul --ip=10.10.10.20 -d consul:1.9.0 agent -bind=0.0.0.0 -retry-join="10.10.10.10" -node=consul-master-2 -server -client=0.0.0.0
3.查看日志,查找leader节点
查看consul-master-1节点日志,可以看到,选举的leader为consul-master-1
4.浏览器访问
搭建consul-slave集群,加入master
consul-slave集群,不会参与leader选举,只接收数据复制流
1.创建consul-slave1
# 通过关闭-server参数,标识此节点是一个客户端,不参与leader选举
docker run --name consul-slave-1 --network=consul --ip=10.10.10.30 -d consul:1.9.0 agent -bind=0.0.0.0 -retry-join="10.10.10.10" -node=consul-slave-1 -client=0.0.0.0
2.创建consul-slave2
# 通过关闭-server参数,标识此节点是一个客户端,不参与leader选举
docker run --name consul-slave-2 --network=consul --ip=10.10.10.40 -d consul:1.9.0 agent -bind=0.0.0.0 -retry-join="10.10.10.10" -node=consul-slave-2 -client=0.0.0.0
通过浏览器查看,slave节点已经加入了
加入nginx,实现slave的负载均衡
这里让应用的服务发现与注册都走consul-slave的节点,保护master
1.启动nginx容器
docker run --name consul-slave-lb -p 80:80 --network=consul -d nginx:alpine
2.进入容器,修改配置,实现consul-slave的负载均衡
docker exec -ti consul-slave-lb sh
3.修改nginx容器里面的default.conf文件
执行以下脚本,修改default.conf文件的内容
cat >/etc/nginx/conf.d/default.conf <<EOF
upstream consul-slave-cluster {
server 10.10.10.30:8500;
server 10.10.10.40:8500;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://consul-slave-cluster;
}
}
EOF
4.退出容器,重启consul-slave-lb容器
exit
docker restart consul-slave-lb
5.通过程序,注册一个服务到consul
6.通过浏览器查看服务注册情况
可以看到,服务注册在consul-slave-2这个节点上面,由于consul和我这边注册的服务网段不通,所以监控检查是失败的
使用docker-compose构建
在使用docker-compose之前,请关闭之前创建的consul容器,并删除对应网卡
docker rm -f consul-master-1
docker rm -f consul-master-2
docker rm -f consul-slave-1
docker rm -f consul-slave-2
docker rm -f consul-slave-lb
docker network rm consul
构建consul-master集群
1.编写consul-master.yml的docker-compose文件
version: '3'
services:
consul-master-1:
image: consul:1.9.0
container_name: consul-master-1
ports:
- 8500:8500
networks:
- consul
command:
- sh
- -c
- |
consul agent -data-dir=/opt/consul/data -bind=0.0.0.0 -bootstrap-expect=2 -node=consul-master-1 \
-server -client=0.0.0.0 -ui
consul-master-2:
image: consul:1.9.0
container_name: consul-master-2
networks:
- consul
command:
- sh
- -c
- |
consul agent -data-dir=/opt/consul/data -bind=0.0.0.0 -retry-join=consul-master-1 -node=consul-master-2 \
-server -client=0.0.0.0
networks:
consul:
driver: bridge
ipam:
driver: default
config:
- subnet: 10.10.0.0/16
目录如下
2.启动consul-master集群
docker-compose -f consul-master.yml up -d
通过浏览器查看,效果如下
构建consul-slave集群
这里-retry-join=consul-master-1是docker-compose里面的container_name
1.编写consul-slave.yml
version: '3'
services:
consul-slave-1:
image: consul:1.9.0
container_name: consul-slave-1
networks:
- consul
command:
- sh
- -c
- |
consul agent -data-dir=/opt/consul/data -retry-join=consul-master-1 -bind=0.0.0.0 -node=consul-slave-1 -client=0.0.0.0 -ui
consul-slave-2:
image: consul:1.9.0
container_name: consul-slave-2
networks:
- consul
command:
- sh
- -c
- |
consul agent -data-dir=/opt/consul/data -bind=0.0.0.0 -retry-join=consul-master-1 -node=consul-slave-2 -client=0.0.0.0
networks:
consul:
external:
name: consul_consul #这里引用consul-master集群创建的网卡
当前目录如下
2.启动consul-slave集群
通过浏览器查看,效果如下
使用nginx对consul-slave实现负载均衡
1.编写consul-slave-lb.yml
version: '3'
services:
consul-slave-lb:
image: nginx:alpine
ports:
- 80:80
networks:
- consul
volumes:
- ./conf.d:/etc/nginx/conf.d
networks:
consul:
external:
name: consul_consul
2.生成consul-slave-lb.conf配置文件
mkdir conf.d
cat > conf.d/consul-slave-lb.conf <<EOF
upstream consul-slave-cluster {
server consul-slave-1:8500;
server consul-slave-2:8500; #这里如果设置了slave的hostname,就填写slave的hostname,否则填container_name即可
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://consul-slave-cluster;
}
}
EOF
3.启动consul-slave-lb,并使用程序向slave注册服务
docker-compose -f consul-slave-lb.yml up -d
通过浏览器访问,可以看到,服务注册在consul-slave-1这个节点
测试集群高可用
关闭consul-slave-1节点
consul-slave-1这个节点也已经挂掉了
这里修改了服务名称和端口,模拟另一个服务
获取服务实例,测试是否能获取consul-slave-1节点上注册的服务
可以看到,是有获取到注册在consul-slave-1这个节点上的服务实例的