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/#/