Rabbitmq高可用集群搭建(HA+Keep+MQ_Cluster)

部署模式

在这里插入图片描述

搭建环境

主机名IP模块节点类型
rabbitmq01192.168.1.37rabbitmq+haproxy+keepaliveddisc(磁盘)
rabbitmq02192.168.1.38rabbitmq+haproxy+keepalivedram(内存)
rabbitmq03192.168.1.39rabbitmq+haproxyram(内存)
VIP192.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

搭建普通集群

  1. 设置主机名解析,同步.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
  1. 节点加入集群
    主机: 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
  1. 设置集群名称
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
在这里插入图片描述

程序连接MQ地址为:HA-VIP:6672

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值