Keepalived+Haproxy+RabbitMQ-高可用集群部署
1、服务器环境
主机名 | IP | 主从 | 部署服务 |
---|---|---|---|
rabbitmq01 | 10.22.86.40 | slave | keepalived;haproxy;rabbitmq |
rabbitmq02 | 10.22.86.41 | master | keepalived;haproxy;rabbitmq |
rabbitmq03 | 10.22.86.42 | slave | keepalived;haproxy;rabbitmq |
# 这里采用Master + slave +slave 的部署方式,Master部署在rabbitmq02上。
# 离线环境使用rpm包安装
haproxy-1.5.18-9.el7_9.1.x86_64.rpm
keepalived-1.3.5-19.el7.x86_64.rpm
erlang-19.3.0-1.el7.centos.x86_64.rpm
socat-1.7.2.4-1.el7.rf.x86_64.rpm
rabbitmq-server-3.6.6-1.el7.noarch.rpm
# 百度云盘:https://pan.baidu.com/s/138X8vkkB9JwRxB4SOTGwbw
# 提取码:khmq
2、部署 RabbitMQ
三台机器都需要部署RabbitMQ。
2.1、yum安装
# 由于RabbitMQ是通过Erlang来开发的,需要需要安装Erlang,然而在安装Erlang的时候又有一大波依赖需要安装,但是郁闷的是这些依赖不在CentOS默认的yum库中。
# 方法一: yum 安装
# 添加Erlang Solutions key 支持
[root@rabbitmq01 ~]# rpm --import http://binaries.erlang-solutions.com/debian/erlang_solutions.asc
[root@rabbitmq01 ~]# wget http://binaries.erlang-solutions.com/rpm/centos/erlang_solutions.repo
# 安装Erlang
[root@rabbitmq01 ~]# yum install epel-release
[root@rabbitmq01 ~]# yum install erlang
# 安装RabbitMQ
[root@rabbitmq01 ~]# rpm -ivh http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
[root@rabbitmq01 ~]# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
[root@rabbitmq01 ~]# rpm -ivh rabbitmq-server-3.6.6-1.el7.noarch.rpm
# 方法二: rpm包安装
# 准备rpm包安装,注意版本号要对应
[root@rabbitmq01 ~]# ls
erlang-19.3.0-1.el7.centos.x86_64.rpm
socat-1.7.2.4-1.el7.rf.x86_64.rpm
rabbitmq-server-3.6.6-1.el7.noarch.rpm
# 注意安装顺序,顺序错了会报错。
[root@rabbitmq01 ~]# rpm -ivh erlang-19.3.0-1.el7.centos.x86_64.rpm
[root@rabbitmq01 ~]# rpm -ivh socat-1.7.2.4-1.el7.rf.x86_64.rpm
[root@rabbitmq01 ~]# rpm -ivh rabbitmq-server-3.6.6-1.el7.noarch.rpm
# 启动 RabbitMQ 服务
[root@rabbitmq01 ~]# systemctl start rabbitmq-server
# 安装rabbitmq插件
[root@rabbitmq01 ~]# cd /usr/lib/rabbitmq/bin/
[root@rabbitmq01 ~]# rabbitmq-plugins enable rabbitmq_management
# 创建用户
[root@rabbitmq01 ~]# rabbitmqctl add_user admin clzn@123
# 给用户赋权
[root@rabbitmq01 ~]# rabbitmqctl set_user_tags admin administrator
[root@rabbitmq01 ~]# rabbitmqctl set_permissions -p '/' admin '.' '.' '.*'
# 任意一台机器的.erlang.cookie 复制到其他机器的/var/lib/rabbitmq/下
[root@rabbitmq01 ~]# chmod 600 /var/lib/rabbitmq/.erlang.cookie
# 重启 RabbitMQ 服务
[root@rabbitmq01 ~]# systemctl restart rabbitmq-server
2.2把集群中的3个节点联系起来,可以将其中两个节点加入到另一个节点中
# 修改主机的hosts文件,三台主机都要修改。
[root@rabbitmq01 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.22.86.40 rabbitmq01
10.22.86.41 rabbitmq02
10.22.86.42 rabbitmq03
# 在主机1中操作
[root@rabbitmq01 ~]# rabbitmqctl stop_app
[root@rabbitmq01 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq02
[root@rabbitmq01 ~]# rabbitmqctl start_app
# 在主机3中操作
[root@rabbitmq03 ~]# rabbitmqctl stop_app
[root@rabbitmq03 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq02
[root@rabbitmq03 ~]# rabbitmqctl start_app
# 设置policy,以ha.开头的队列将会被镜像到集群其他所有节点,一个节点挂掉然后重启后会自动同步队列消息(生产环境采用这个方式)
[root@rabbitmq01 ~]# rabbitmqctl set_policy ha-all-queue "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}'
3、部署 Haproxy
三台机器都需要部署 Haproxy。
# 方法一
[root@rabbitmq01 ~]# yum install haproxy -y
# 方法二
[root@rabbitmq01 ~]# rpm -ivh haproxy-1.5.18-9.el7_9.1.x86_64.rpm
# 主程序: /usr/sbin/haproxy
# 配置文件: /etc/haproxy/haproxy.cfg
# 主配置文件主要结构:
1) global 全局配置段 ;
2) proxies代理配置段 ;
一. global 全局配置段
# log:全局日志配置,默认发往本机的日志服务器;
# 表示发往远端可添加:log 远端IP local2
# 系统默认:log 127.0.0.1 local2
# 修改本机日志配置文件
[root@rabbitmq01 ~]# vim /etc/rsyslog.conf
$ModLoad imudp #取消注释
$UDPServerRun 514 #取消注释
local2.* /var/log/haproxy.log #新增
# 修改haproxy配置,三台主机都需要修改
[root@rabbitmq01 ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
frontend http *:8999
default_backend rabbitmq
stats enable
stats uri /status
stats realm "haproxy info"
stats auth ha1:666666
stats hide-version
stats refresh 5s
stats admin if TRUE
backend rabbitmq
balance roundrobin
server rabbitmq 10.22.86.40:15672 check
server rabbitmq 10.22.86.41:15672 check
server rabbitmq 10.22.86.42:15672 check
3.1、启动 Haproxy
[root@rabbitmq01 ~]# systemctl start haproxy
# 可以通过地址:http://10.22.86.43:8999/status 访问
4、部署 Keepalived
# 三台机器均需部署
# 方法一
[root@rabbitmq01 ~]# yum install keepalived -y
# 方法二
[root@rabbitmq01 ~]# rpm -ivh keepalived-1.3.5-19.el7.x86_64.rpm
# 编写 Haproxy 检测脚本
[root@rabbitmq01 ~]# vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then
/usr/bin/systemctl stop keepalived
fi
# 修改 Keepalived 配置 rabbitmq01
[root@rabbitmq01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id ha1 ##标识节点的字符串,通常为hostname
}
vrrp_script chk_haproxy_proxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight 1
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens32 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一致
priority 90 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress {
10.22.86.43/24 # 定义虚拟ip(VIP),可多设,每行一个
}
track_script {
chk_haproxy_proxy
}
}
# 修改 Keepalived 配置 rabbitmq02
[root@rabbitmq02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id ha1 ##标识节点的字符串,通常为hostname
}
vrrp_script chk_haproxy_proxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight 1
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens32 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一致
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress {
10.22.86.43/24 # 定义虚拟ip(VIP),可多设,每行一个
}
track_script {
chk_haproxy_proxy
}
}
# 修改 Keepalived 配置 rabbitmq03
[root@rabbitmq03 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id ha1 ##标识节点的字符串,通常为hostname
}
vrrp_script chk_haproxy_proxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight 1
}
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens32 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一致
priority 80 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress {
10.22.86.43/24 # 定义虚拟ip(VIP),可多设,每行一个
}
track_script {
chk_haproxy_proxy
}
}
4.1、启动 Keepalived
[root@rabbitmq01 ~]# systemctl start keepalived
5、 测试访问
可以通过VIP地址访问 rabbitmq 地址: http://10.22.86.43:8999/#/