.net core RabbitMQ docker方式部署 keepalived + haproxy + rabbitmq 高可用集群(九)
三台机器
- rabbitmq1:192.168.0.191
- rabbitmq2:192.168.0.110
- rabbitmq3:192.168.0.122
每台机器集群需要通信所以保证能ping通
如果ping不同 看看防火墙关闭了么
systemctl stop firewalld
我这选择的centeros的系统
每台机器拉镜像
docker pull rabbitmq:management

如果拉取的慢的需要查看docker镜像源
vim /etc/docker/daemon.json
替换国内镜像源
{"registry-mirrors":
[
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com/",
"https://reg-mirror.qiniu.com",
"https://6kx4zyno.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com/",
"https://reg-mirror.qiniu.com",
"https://hub-mirror.c.163.com/"
]
}
重启docker
systemctl restart docker
查看镜像源更换是否成功
docker info
==============================
192.168.0.191 机器 docker-compose


对 文件加权限
chmod +777 /home/admin1/yyx/rabbitmq/
chmod +777 /home/admin1/yyx/rabbitmq/data
chmod +777 /home/admin1/yyx/rabbitmq/log
rabbitmq 映射文件夹
docker-compose.yaml
docker-compose.yaml 内容
version: '3' services: rabbitmq: container_name: mcst-rabbitmq image: rabbitmq:management restart: always ports: - 4369:4369 - 5671:5671 - 5672:5672 - 15672:15672 - 25672:25672 environment: - TZ=Asia/Shanghai - RABBITMQ_ERLANG_COOKIE=rabbitmq - RABBITMQ_DEFAULT_USER=admin - RABBITMQ_DEFAULT_PASS=admin123 - RABBITMQ_DEFAULT_VHOST=mcst_vhost hostname: rabbitmq1 extra_hosts: - rabbitmq1:192.168.0.191 - rabbitmq2:192.168.0.110 - rabbitmq3:192.168.0.122 volumes: - /home/admin1/yyx/rabbitmq/data:/var/lib/rabbitmq/mnesia - /home/admin1/yyx/rabbitmq/log:/var/log/rabbitmq
这里如果不这么映射 会出现 docker rabbit启动失败,报错:erlang.cookie must be accessible by owner only
- /home/admin1/yyx/rabbitmq/data:/var/lib/rabbitmq/mnesia
- /home/admin1/yyx/rabbitmq/log:/var/log/rabbitmq
问题解决 参考 docker rabbit启动失败,报错:erlang.cookie must be accessible by owner only - JAs1mple - 博客园 (cnblogs.com)
执行 docker-compose up -d

192.168.0.110 机器
文件夹

与191一样的 加权限
chmod +777 /home/admin1/yyx/rabbitmq/
chmod +777 /home/admin1/yyx/rabbitmq/data
chmod +777 /home/admin1/yyx/rabbitmq/log
docker-compose
docker-compose.yaml 内容
设置了hostname 以及 ip 映射
hostname: rabbitmq2
extra_hosts:
- rabbitmq1:192.168.0.191
- rabbitmq2:192.168.0.110
- rabbitmq3:192.168.0.122
version: '3'
services:
rabbitmq:
container_name: mcst-rabbitmq
image: rabbitmq:management
restart: always
ports:
- 4369:4369
- 5671:5671
- 5672:5672
- 15672:15672
- 25672:25672
environment:
- TZ=Asia/Shanghai
- RABBITMQ_ERLANG_COOKIE=rabbitmq
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin123
- RABBITMQ_DEFAULT_VHOST=mcst_vhost
hostname: rabbitmq2
extra_hosts:
- rabbitmq1:192.168.0.191
- rabbitmq2:192.168.0.110
- rabbitmq3:192.168.0.122
volumes:
- /home/admin1/yyx/rabbitmq.sh:/home/rabbitmq.sh
- /home/admin1/yyx/rabbitmq/data:/var/lib/rabbitmq/mnesia
- /home/admin1/yyx/rabbitmq/log:/var/log/rabbitmq
rabbitmq.sh 脚本内容
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
如果 脚本没成功 就直接进入容器中 执行 脚本内容

192.168.0.122 机器

与191一样的 加权限
chmod +777 /home/admin1/yyx/rabbitmq/
chmod +777 /home/admin1/yyx/rabbitmq/data
chmod +777 /home/admin1/yyx/rabbitmq/log
docker-compose 内容
version: '3'
services:
rabbitmq:
container_name: mcst-rabbitmq
image: rabbitmq:management
restart: always
ports:
- 4369:4369
- 5671:5671
- 5672:5672
- 15672:15672
- 25672:25672
environment:
- TZ=Asia/Shanghai
- RABBITMQ_ERLANG_COOKIE=rabbitmq
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin123
- RABBITMQ_DEFAULT_VHOST=mcst_vhost
hostname: rabbitmq3
extra_hosts:
- rabbitmq1:192.168.0.191
- rabbitmq2:192.168.0.110
- rabbitmq3:192.168.0.122
volumes:
- /home/admin1/yyx/rabbitmq.sh:/home/rabbitmq.sh
- /home/admin1/yyx/rabbitmq/data:/var/lib/rabbitmq/mnesia
- /home/admin1/yyx/rabbitmq/log:/var/log/rabbitmq
rabbitmq.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
脚本与上面一样
如果不好用 处理也是 进入容器内 逐条执行脚本语句
查看是否成功

HAProxy 负载均衡
192.168.0.122 机器上部署 其实是部署的一个haproxy 备份
拉取 2.3.10 版本 的haproxy 高版本 或者latest 可能会出现
我拉取的高版本 出现内存不足的情况

docker pull haproxy:2.3.10
192.168.0.122 机器上haproxy文档目录

docker-compose 文件内容
注意 haproxy 映射了keepalived 文件夹 - /home/admin1/yyx/keepalived:/etc/keepalived
version: '3'
services:
haproxy:
container_name: mcst-haproxy
image: haproxy:2.3.10
restart: always
ports:
- 8100:8100
- 15670:5670
environment:
- TZ=Asia/Shanghai
extra_hosts:
- rabbitmq1:192.168.0.191
- rabbitmq2:192.168.0.110
- rabbitmq3:192.168.0.122
volumes:
- /home/admin1/yyx/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
- /home/admin1/yyx/keepalived:/etc/keepalived
haproxy.cfg 配置文件内容
global
log 127.0.0.1 local0 info
maxconn 2096
daemon
defaults
log global
mode tcp
option tcplog
retries 3
option redispatch
maxconn 4096
timeout connect 5s
timeout client 120s
timeout server 120s
# ssl for rabbitmq
# frontend ssl_rabbitmq
# bind *:5673 ssl crt /root/rmqha_proxy/rmqha.pem
# mode tcp
# default_backend rabbitmq
# web 管理界面
listen stats
bind *:8100
mode http
stats enable
stats realm Haproxy\ Statistics
stats uri /
stats auth admin:admin123
# 配置负载均衡
listen rabbitmq
bind *:5670
mode tcp
balance roundrobin
server rabbitmq1 rabbitmq1:5672 check inter 5s rise 2 fall 3
server rabbitmq2 rabbitmq2:5672 check inter 5s rise 2 fall 3
server rabbitmq3 rabbitmq3:5672 check inter 5s rise 2 fall 3
haproxy 配置文件内容 可能会出现 报错

parsing [/usr/local/etc/haproxy/haproxy.cfg:37]: Missing LF on last line, file might have been truncated at position 67
出现这种问题 查看行37 回车就行
192.168.0.191 机器上部署 与上面的 192.168.0.122 机器部署一样
docker-compose 文件内容 一样
haproxy 配置文件内容 一样

也就是说两台机器部署文件内容都一样的
查看haproxy 部署成功么
192.168.0.122 的

192.168.0.191 的

keepalived 2.0.20 构建haproxy 主备
192.168.0.191 主 192.168.0.122 备份
keepalived 文件夹 已经在 haproxy docker-compose.yml文件中映射了

keepalived.conf 内容
global_defs {
# 路由id,主备节点不能相同
router_id node1
}
# 自定义监控脚本
vrrp_script chk_haproxy {
# 脚本位置
script "/etc/keepalived/haproxy_check.sh"
# 脚本执行的时间间隔
interval 5
weight 10
}
vrrp_instance VI_1 {
# Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点
state MASTER
# 指定监测的网卡,可以使用 ifconfig 进行查看
interface ens33
# 虚拟路由的id,主备节点需要设置为相同
virtual_router_id 1
# 优先级,主节点的优先级需要设置比备份节点高
priority 100
# 设置主备之间的检查时间,单位为秒
advert_int 1
# 定义验证类型和密码
authentication {
auth_type PASS
auth_pass 123456
}
# 调用上面自定义的监控脚本
track_script {
chk_haproxy
}
virtual_ipaddress {
# 虚拟IP地址,可以设置多个
192.168.0.200
}
}
haproxy_check.sh 内容
#!/bin/bash
# 判断haproxy是否已经启动
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ] ; then
#如果没有启动,则启动
haproxy -f /etc/haproxy/haproxy.cfg
fi
#睡眠3秒以便haproxy完全启动
sleep 3
#如果haproxy还是没有启动,此时需要将本机的keepalived服务停掉,以便让VIP自动漂移到另外一台haproxy
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ]; then
systemctl stop keepalived
fi
需要 进入 haproxy 容器中 安装 keepalived
进入 191 的 haproxy 容器

执行 命令
更新update,安装keepalived
apt-get update
apt-get install keepalived
安装vim 安装ifconfig命令 安装ping
apt-get install net-tools
apt-get install iputils-ping
最后在容器内启动 keepalived
service keepalived start

192.168.0.122 备份 上配置 keepalived
文档结构

haproxy_check.sh 内容
#!/bin/bash
# 判断haproxy是否已经启动
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ] ; then
#如果没有启动,则启动
haproxy -f /etc/haproxy/haproxy.cfg
fi
#睡眠3秒以便haproxy完全启动
sleep 3
#如果haproxy还是没有启动,此时需要将本机的keepalived服务停掉,以便让VIP自动漂移到另外一台haproxy
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ]; then
systemctl stop keepalived
fi
keepalived.conf 内容 与 主 不同的 是 全局 路由id 名称 router_id node2 角色 为 state MASTER 其他都一样
global_defs { # 路由id,主备节点不能相同 router_id node2 } # 自定义监控脚本 vrrp_script chk_haproxy { # 脚本位置 script "/etc/keepalived/haproxy_check.sh" # 脚本执行的时间间隔 interval 5 weight 10 } vrrp_instance VI_1 { # Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点 state MASTER # 指定监测的网卡,可以使用 ifconfig 进行查看 interface ens33 # 虚拟路由的id,主备节点需要设置为相同 virtual_router_id 1 # 优先级,主节点的优先级需要设置比备份节点高 priority 100 # 设置主备之间的检查时间,单位为秒 advert_int 1 # 定义验证类型和密码 authentication { auth_type PASS auth_pass 123456 } # 调用上面自定义的监控脚本 track_script { chk_haproxy } virtual_ipaddress { # 虚拟IP地址,可以设置多个 192.168.0.200 } }
进入 122 的haproxy 容器 安装 keepalived
更新update,安装keepalived
apt-get update
apt-get install keepalived
安装vim 安装ifconfig命令 安装ping
apt-get install net-tools
apt-get install iputils-ping
最后在容器内启动 keepalived
service keepalived start
到这里 keepalived + haproxy + rabbitmq 高可用集群已经部署完毕
接下来 测试一下 明天在测试 。。。
参考 docker下用keepalived+Haproxy实现高可用负载均衡集群_docker haproxy keepalived_布偶猫爸爸的博客-CSDN博客
浙公网安备 33010602011771号