部署模式
搭建环境
主机名 | IP | 模块 | 节点类型 |
---|---|---|---|
rabbitmq01 | 192.168.1.37 | rabbitmq+haproxy+keepalived | disc(磁盘) |
rabbitmq02 | 192.168.1.38 | rabbitmq+haproxy+keepalived | ram(内存) |
rabbitmq03 | 192.168.1.39 | rabbitmq+haproxy | ram(内存) |
VIP | 192.168.1.40 | 高可用IP |
安装MQ
安装MQ(一键安装脚本)
也可参考MQ部署文档:https://blog.csdn.net/weixin_49566876/article/details/128375842?spm=1001.2014.3001.5502
#########################此脚本用于安装MQ#################################
#!/bin/bash
#source /etc/profile
#创建安装目录
mkdir /data/src/mq&&cd /data/src/mq
#下载安装包
wget https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.8.16-1.el7.noarch.rpm/download.rpm?distro_version_id=140
wget https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.2.7-1.el7.x86_64.rpm/download.rpm?distro_version_id=140
if [ ! -f ./erlang-23.2.7-1.el7.x86_64.rpm ];then
echo -e "\\033[31m erlang-23.2.7-1.el7.x86_64.rpm 安装包下载失败,退出安装 \\033[0m"
exit
fi
if [ ! -f ./rabbitmq-server-3.8.16-1.el7.noarch.rpm ];then
echo -e "\\033[31m rabbitmq-server-3.8.16-1.el7.noarch.rpm 安装包下载失败,退出安装 \\033[0m"
exit
fi
echo -e "\\033[1;32m开始安装Rabbitmq-server 3.8.16\\033[0m"
#关闭selinux,关闭防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
firewall-cmd --add-port=5672/tcp --permanent
firewall-cmd --add-port=15672/tcp --permanent
firewall-cmd --reload
#创建rabbitmq用户
groupadd rabbitmq
useradd rabbitmq -g rabbitmq
#获取当前路径
DIR=$(cd $(dirname $0); pwd)
#mq数据目录
dir=/data/rabbitmq/data
#判断数据目录是否存在
if [ ! -d $dir ];then
mkdir -p /data/rabbitmq/{data,logs}
chown -R rabbitmq.rabbitmq /data/rabbitmq/
else
chown -R rabbitmq.rabbitmq /data/rabbitmq/
echo "安装目录已存在,跳过创建"
fi
#安装mq
yum localinstall -y erlang-23.2.7-1.el7.x86_64.rpm
mq=`rpm -qa|grep rabbitmq-server|wc -l`
if [ $mq -lt 1 ];then
yum localinstall -y rabbitmq-server-3.8.16-1.el7.noarch.rpm
else
echo "mq已安装,跳过安装"
fi
#拷贝mq配置文件
echo "创建mq配置文件"
if [ ! -d /etc/rabbitmq ];then
mkdir -p /etc/rabbitmq
fi
cat > /etc/rabbitmq/rabbitmq.conf << EOF
#禁止来宾访问
loopback_users.guest = false
#监听端口
listeners.tcp.default = 5672
#默认用户名和密码
default_pass = admin
default_user = admin
#WEB管理端端口
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
#WEB默认访问路径(建议不配置)
management.path_prefix=mq
#Erlang分发服务器端口
#DIST_PORT=25673
##mq默认端口
##NODE_PORT=5673
##EPMD端口
#export ERL_EPMD_PORT=14369
#设置内存使用上限
vm_memory_high_watermark.relative=0.6
EOF
cat > /etc/rabbitmq/rabbitmq-env.conf << EOF
#设置数据目录位置
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
#设置log文件位置
RABBITMQ_LOG_BASE=/data/rabbitmq/logs
EOF
#启动mq
echo "启动Rabbit-MQ..............."
systemctl enable rabbitmq-server
systemctl start rabbitmq-server
#加载mq插件
echo "加载MQ插件..................."
rabbitmq-plugins enable rabbitmq_random_exchange rabbitmq_recent_history_exchange rabbitmq_recent_history_exchange rabbitmq_sharding rabbitmq_shovel rabbitmq_shovel_management rabbitmq_top rabbitmq_tracing rabbitmq_trust_store rabbitmq_web_mqtt rabbitmq_web_mqtt_examples rabbitmq_web_stomp rabbitmq_web_stomp_examples rabbitmq_prometheus rabbitmq_jms_topic_exchange rabbitmq_consistent_hash_exchange rabbitmq_event_exchange
rabbitmq-plugins enable rabbitmq_management&&rabbitmqctl add_user admin admin&&rabbitmqctl set_user_tags admin administrator
echo "输出mq加载模块列表"
rabbitmq-plugins list
搭建普通集群
- 设置主机名解析,同步.erlang.cookie文件
主机: 192.168.1.37
#修改主机名
hostnamectl set-hostname rabbitmq01
#修改hosts文件,增加主机名解析
echo "192.168.1.37 rabbitmq01" >> /etc/hosts
echo "192.168.1.38 rabbitmq02" >> /etc/hosts
echo "192.168.1.39 rabbitmq03" >> /etc/hosts
#同步修改.erlang.cookie文件
echo "123456" > /home/rabbitmq/.erlang.cookie
#重启mq服务
systemctl restart rabbitmq-server
主机: 192.168.1.38
#修改主机名
hostnamectl set-hostname rabbitmq02
#修改hosts文件,增加主机名解析
echo "192.168.1.37 rabbitmq01" >> /etc/hosts
echo "192.168.1.38 rabbitmq02" >> /etc/hosts
echo "192.168.1.39 rabbitmq03" >> /etc/hosts
#同步修改.erlang.cookie文件
echo "123456" > /home/rabbitmq/.erlang.cookie
#重启mq服务
systemctl restart rabbitmq-server
主机: 192.168.1.39
#修改主机名
hostnamectl set-hostname rabbitmq03
#修改hosts文件,增加主机名解析
echo "192.168.1.37 rabbitmq01" >> /etc/hosts
echo "192.168.1.38 rabbitmq02" >> /etc/hosts
echo "192.168.1.39 rabbitmq03" >> /etc/hosts
#同步修改.erlang.cookie文件
echo "123456" > /home/rabbitmq/.erlang.cookie
#重启mq服务
systemctl restart rabbitmq-server
- 节点加入集群
主机: 192.168.1.38
#加入集群
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq01 --ram
rabbitmqctl start_app
主机: 192.168.1.39
#加入集群
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq01 --ram
rabbitmqctl start_app
- 设置集群名称
rabbitmqctl set_cluster_name rabbitmq_HA_cluster
- 验证(登录控制台查看或命令查看集群状态)
命令查看
rabbitmqctl cluster_status
管理端查看
创建镜像规则
- 命令行设置
rabbitmqctl set_policy "queue_policy_test" "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
- 控制台设置
各参数含义如下:
Name: policy 的名称。
Pattern: queue 的匹配模式(正则表达式)。
Definition: 镜像定义,主要有三个参数:ha-mode, ha-params, ha-sync-mode。
ha-mode: 指明镜像队列的模式,有效值为 all、exactly、nodes。其中 all 表示在集群中所有的节点上进行镜像(默认即此);exactly 表示在指定个数的节点上进行镜像,节点的个数由 ha-params 指定;nodes 表示在指定的节点上进行镜像,节点名称通过 ha-params 指定。
ha-params: exactly 模式需要用到的参数,
ha-sync-mode: 进行队列中消息的同步方式,有效值为 automatic 和 manual。
priority 为可选参数,表示 policy 的优先级。
搭建Haproxy(192.168.1.37、192.168.1.38)
- 安装haproxy(两台主机一致)
yum install -y gcc
yum install -y haproxy
mkdir /etc/haproxy/errors/&&cd /etc/haproxy/errors/
touch 400.http 403.http 408.http 500.http 502.http 503.http 504.http
echo "local5.* /var/log/haproxy.log" >> /etc/rsyslog.conf
systemctl restart rsyslog
- 配置haproxy文件(两台主机一致)
vi /etc/haproxy/haproxy.cfg
###########全局配置#########
global
log 127.0.0.1 local5
log 127.0.0.1 local5 info
chroot /var/lib/haproxy # 改变当前工作目录
stats socket /run/haproxy/admin.sock mode 660 level admin # 创建监控所用的套接字目录
pidfile /var/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
user haproxy # 默认用户
group haproxy # 默认用户组
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon
# Default SSL material locations
#ca-base /etc/ssl/certs
#crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
#ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
#ssl-default-bind-options no-sslv3
###########默认配置#########
defaults
log global
mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog # 采用http日志格式
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
# 或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某
# 一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
# 官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
# 该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
timeout connect 5000 # 连接超时时间
timeout client 50000 # 客户端连接超时时间
timeout server 50000 # 服务器端连接超时时间
option httpclose # 每次请求完毕后主动关闭http通道
option httplog # 日志类别http日志格式
#option forwardfor # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout connect 10000 # default 10 second timeout if a backend is not found
maxconn 60000 # 最大连接数
retries 3 # 3次连接失败就认为服务不可用,也可以通过后面设置
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
####################################################################
listen http_front
bind 0.0.0.0:1080 #监听端口
stats enable #启动统计
stats refresh 30s #统计页面自动刷新时间
stats uri /status #统计页面url
stats realm "Haproxy Manager" #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
#####################我把RabbitMQ的管理界面也放在HAProxy后面了###############################
listen rabbitmq_admin
bind 0.0.0.0:16672
server node1 192.168.1.37:15672
server node2 192.168.1.38:15672
server node3 192.168.1.39:15672
####################################################################
listen rabbitmq_cluster
bind 0.0.0.0:6672
option tcplog
log global
mode tcp
timeout client 3h
timeout server 3h
option clitcpka
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
server rabbitmq01 192.168.1.37:5672 check inter 5s rise 2 fall 3 #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
server rabbitmq02 192.168.1.38:5672 check inter 5s rise 2 fall 3
server rabbitmq03 192.168.1.39:5672 check inter 5s rise 2 fall 3
- 启动haproxy
systemctl start haproxy
配置keepalived(192.168.1.37、192.168.1.38)
- 安装keepalived(两台主机一致)
yum -y isntall keepalived
- 配置keepalived配置文件
(主节点-192.168.1.37)
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.173.17.137
smtp_connect_timeout 30
router_id HA_MQ01
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_service { #VRRP 脚本声明
script "/etc/keepalived/chk_service.sh" #周期性执行的脚本
interval 1 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 2 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 11
nopreempt
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.40
}
track_script {
check_service
}
unicast_src_ip 192.168.1.37 #设置实例的私网IP地址
unicast_peer {
192.168.1.38 #对端实例的私网IP地址
}
}
(从节点-192.168.1.38)
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.173.17.137
smtp_connect_timeout 30
router_id HA_MQ02
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_service { #VRRP 脚本声明
script "/etc/keepalived/chk_service.sh" #周期性执行的脚本
interval 1 #运行脚本的间隔时间,秒
weight -20 #权重,priority值减去此值要小于备服务的priority值
fall 2 #检测几次失败才为失败,整数
rise 2 #检测几次状态为正常的,才确认正常,整数
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 11
nopreempt
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.40
}
track_script {
check_service
}
unicast_src_ip 192.168.1.38 #设置实例的私网IP地址
unicast_peer {
192.168.1.37 #对端实例的私网IP地址
}
}
- 配置keepalived自动切换脚本
vi /etc/keepalived/chk_service.sh
#!/bin/bash
count=`netstat -nltp | grep 6672 | grep -v grep | wc -l`
if [[ $count > 0 ]]; then
exit 0
else
systemctl stop keepalived
fi
- 启动keepalived
systemctl start keepalived
- 查看vip
ip a
访问haproxy统计页面(通过VIP访问)
http://192.168.1.40:1080/status
通过HA访问mq管理端
http://192.168.1.40:16672