rabbitMQ集群搭建

一、环境说明

系统版本: CentOS 7.6.1810

内核版本: 3.10.0-957.el7.x86_64

keepalived版本: 2.2.7

haproxy版本: 2.1.10

erlang版本: 23.3

rabbitMQ版本: 3.8.14

角色 IP地址 节点主机名 硬件配置 运行模式
master 172.17.0.31 mq01 4C4G 硬盘
node 172.17.0.32 mq02 4C4G 内存
node 172.17.0.33 mq03 4C4G 内存

二、系统优化可以根据这篇文档进行优化到第十一步:Kubernetes部署_莫渊博-天下无病的博客-CSDN博客_kubernetes部署

三、修改主机名

mq01(172.17.0.31)修改主机名

hostnamectl set-hostname mq01

mq02(172.17.0.32)修改主机名

hostnamectl set-hostname mq02

mq03(172.17.0.33)修改主机名

hostnamectl set-hostname mq03

四、修改hosts,3台都操作

cat >> /etc/hosts <

五、配置ssh密钥连接

1)在 mq01 上操作,生成密钥

ssh-keygen

rabbitMQ集群搭建_第1张图片

2)添加公钥:cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

3)修改文件属性:chmod 600 /root/.ssh/authorized_keys

4)传输到另外两台服务器上

scp -r /root/.ssh/ mq02:/root/
scp -r /root/.ssh/ mq03:/root/

5)测试连接情况

rabbitMQ集群搭建_第2张图片

 六、安装依赖包(3台都操作)

yum -y install epel-release
yum install -y ncurses-devel openssl-devel unixODBC-devel gcc gcc-c++ popt-devel systemd-devel wxWidgets-devel wxBase-devel

ln -s /usr/bin/wx-config-3.0 /usr/bin/wx-config

七、创建 rabbitmq 用户

useradd -u 1020 -s /sbin/nologin rabbitmq

八、创建相关目录

mkdir -p /data/{recycle,software}

九、安装erlang

cd /data/recycle/
wget https://erlang.org/download/otp_src_23.3.tar.gz
tar zxf otp_src_23.3.tar.gz
cd otp_src_23.3/
./configure --prefix=/data/software/erlang
make -j 2
make install
cd /data/recycle/
rm otp_src_23.3* -rf

cat > /etc/profile.d/erlang_home.sh <

十、安装 rabbitMQ

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-generic-unix-3.8.14.tar.xz

tar xf rabbitmq-server-generic-unix-3.8.14.tar.xz
mv rabbitmq_server-3.8.14/ /data/software/rabbitmq

cat > /etc/profile.d/rabbitmq_home.sh <

 

 十一、编写配置文件

1)端口解析:

35441 对应默认端口5672,由不带TLS和带TLS的AMQP 0-9-1和1.0客户端使用,也就是客服端连接到rabbitMQ服务的通信端口

35442 对应默认端口15672,管理界面ui使用的端口

35443 对应默认端口25672,( Erlang distribution)server间内部通信口

4369  epmd,RabbitMQ节点和CLI工具使用的对等发现服务

IP=$(ip route | awk '{print $9}' | grep -E '([0-9]{1,3}.){3}[0-9]{1,3}')
echo ${IP}

cat > /data/software/rabbitmq/etc/rabbitmq/rabbitmq.conf <

2) mq01服务器配置

cat > /data/software/rabbitmq/etc/rabbitmq/rabbitmq-env.conf <

3)mq02服务器配置

cat > /data/software/rabbitmq/etc/rabbitmq/rabbitmq-env.conf <

4)mq03服务器配置

cat > /data/software/rabbitmq/etc/rabbitmq/rabbitmq-env.conf <

5)创建目录:

mkdir /data/software/rabbitmq/{data,logs}

6)erlang 的环境变量添加rabbitMQ的脚本里

# 在第一行的下面添加内容
sed -i '1a export PATH=$PATH:/data/software/erlang/bin' /data/software/rabbitmq/sbin/rabbitmq-env
sed -i '1a export PATH=$PATH:/data/software/erlang/bin' /data/software/rabbitmq/sbin/rabbitmq-server

7)修改权限属性

chown -R rabbitmq:rabbitmq /data/software/rabbitmq

十二、安装 supervisor 管理服务工具

yum -y install supervisor


cat > /etc/supervisord.d/rabbitmq.ini <

十三、配置日志按天数切割

配置解析:

daily         # 日志按天轮询。也可以设为weekly、monthly、yearly
rotate 30     # 备份数,超过的会删除
dateext       # 备份文件名包含日期信息
dateyesterday # 用昨天的日期做后缀,如果不用这个参数,会造成日志文件显示的日期和实际不是一天
copytruncate  # 首先将目标文件复制一份,然后在做截取。这样做防止将原目标文件重命名引起的问题
delaycompress # 与compress选项一起用,delaycompress选项指示logrotate不将最近的归档压缩
compress      # 压缩文件。如果不想压缩 可以和delaycompress 一起去掉
missingok     # 忽略错误
notifempty    # 如果没有日志就不进行轮询

cat > /etc/logrotate.d/rabbitmq <

十四、启动supervisor

systemctl enable --now supervisord.service

十五、检查相关信息

1)检查 supervisor 管理 rabbitmq 的状态(RUNNING状态为正常)

2)启动 rabbitMQ 管理平台

rabbitmq-plugins enable rabbitmq_management

# 启动管理后需要重启才生效

supervisorctl restart rabbitmq
supervisorctl status

rabbitMQ集群搭建_第3张图片

3)检查 rabbitMQ 端口

netstat -untpl | grep 3544

4)检查日志切割

logrotate -vfd /etc/logrotate.d/rabbitmq

rabbitMQ集群搭建_第4张图片

 十六、将 mq02 和 mq03 加入到集群中

1)mq01 服务器操作

# 把 cookie 认证文件统一起来
scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie /root/
scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie /data/software/rabbitmq/

# 修改权限
chown rabbitmq:rabbitmq /data/software/rabbitmq/.erlang.cookie \
      /data/software/rabbitmq/.erlang.cookie \
      /root/.erlang.cookie

# 传输到 mq02
scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie mq02:/root/

scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie \
    mq02:/data/software/erlang/lib/erlang/erts-11.2/bin/

scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie \
    mq02:/data/software/rabbitmq/


# 传输到 mq03
scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie mq03:/root/

scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie \
    mq03:/data/software/erlang/lib/erlang/erts-11.2/bin/

scp /data/software/erlang/lib/erlang/erts-11.2/bin/.erlang.cookie \
    mq03:/data/software/rabbitmq/


# 重启rabbitMQ
supervisorctl restart rabbitmq
supervisorctl status

2)mq02 和 mq03 服务器操作 

rabbit@mq01 获取方式

在 mq01 上运行: rabbitmqctl cluster_status

rabbitMQ集群搭建_第5张图片

# 修改权限
chown rabbitmq:rabbitmq /data/software/rabbitmq/.erlang.cookie \
      /data/software/rabbitmq/.erlang.cookie \
      /root/.erlang.cookie

# 重启rabbitMQ
supervisorctl restart rabbitmq
supervisorctl status

# 停止 rabbitMQ 服务
rabbitmqctl stop_app

# 加入到 mq01 集群上,并以 内存模式 运行 rabbitMQ 服务
rabbitmqctl join_cluster --ram rabbit@mq01

# 启动 rabbitMQ 服务
rabbitmqctl start_app

3)任意一台服务器运行查看集群状态

 rabbitMQ集群搭建_第6张图片

4)添加rabbitMQ用户(在其中一台服务器上操作就行了)

rabbitmqctl list_users  # 查看用户列表
rabbitmqctl add_user admin 123456  # 添加用户为admin,密码为:123456
rabbitmqctl add_vhost test         # 添加工作目录为:test
rabbitmqctl set_user_tags admin administrator  # 把 admin 设置为管理员用户
rabbitmqctl set_permissions -p test admin ".*" ".*" ".*"  # 把工作目录(test)设置为admin拥有所有的权限
rabbitmqctl delete_user guest   # 删除默认自带的 guest 用户

5)验证查看用户(3台都查看一下)

rabbitmqctl list_users

 

 十七、部署 haproxy(在两台服务器上部署就行了,这里选择在 mq01 和 mq02上部署)

1)获取内核信息,等一会需要用到

uname -r

2)开始部署 haproxy

cd /data/recycle
wget https://www.haproxy.org/download/2.1/src/haproxy-2.1.10.tar.gz

tar zxf haproxy-2.1.10.tar.gz
cd haproxy-2.1.10

make TARGET=linux31 PREFIX=/data/software/haproxy ARCH=x86_64 USE_SYSTEMD=1
make install PREFIX=/data/software/haproxy

cd /data/recycle
rm -rf haproxy-2.1.10

3)配置管理启动 haproxy 的文件 

cat > /usr/lib/systemd/system/haproxy.service <<'EOF'
[Unit]
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target

[Service]
Environment="CONFIG=/data/software/haproxy/etc/haproxy.cfg" "PIDFILE=/data/software/haproxy/run/haproxy.pid"
EnvironmentFile=/etc/sysconfig/haproxy
ExecStartPre=/data/software/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
ExecStart=/data/software/haproxy/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $OPTIONS
ExecReload=/data/software/haproxy/sbin/haproxy -f $CONFIG -c -q $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
SuccessExitStatus=143
KillMode=mixed
Type=notify

[Install]
WantedBy=multi-user.target
EOF

4)配置保存 haproxy 日志配置文件

cat > /etc/sysconfig/haproxy < /etc/rsyslog.d/haproxy.conf <<'EOF'
local0.*    /data/software/haproxy/logs/haproxy.log
EOF

5)创建相关目录

mkdir /data/software/haproxy/{etc,logs,run}

6)配置 haproxy 主配置文件

cat > /data/software/haproxy/etc/haproxy.cfg <<'EOF'
global  # 全局配置
    # 通过 local0 关联 rsyslogd 进行输出,定义haproxy 日志级别
    log 127.0.0.1 local0 warning
    # 最大连接数
    maxconn 25600
    # 指定作为守护进程运行时的进程数,推荐设置为与CPU核心数相同
    nbproc 4
    # haproxy 运行的工作目录
    chroot /data/software/haproxy
    # 运行 haproxy 的用户或UID
    user haproxy
    # 运行 haproxy 的用户组或GID
    group haproxy
    # 以守护进行的方式运行
    daemon
    # 当前进程的 pid 文件存放位置
    pidfile /data/software/haproxy/run/haproxy.pid
    # 定义统计信息保留位置
    stats socket /data/software/haproxy/stats

defaults # 默认配置
    # 应用全局的日志配置
    log global
    # 使用4层代理模式,7层代理模式则为"http"
    mode tcp
    # 日志类别,模式是http的日志类型为httplog
    option tcplog
    # 不记录健康检查的日志信息
    option dontlognull
    # 打开http协议中服务器端关闭功能,使得支持长连接,使得会话可以被重用,使得每一个日志记录都会被记录
    option http-server-close
    # 如果option forwardfor被注释掉了,haproxy将不会将自己的作为代理写入到x-forwarder-for中去,且只有http模式有效
    # option forwardfor except 127.0.0.0/8
    # 3次失败则认为服务不可用
    retries 3
    # 当与上游服务器的会话失败(服务器故障或其他原因)时,把会话重新分发到其他健康的服务器上,当原来故障的服务器恢复时,会话又被定向到已恢复的服务器上,但如果是带认证(cookie)的不建议开启,不然会出现客服端要求重新登陆的情况。还可以用”retries”关键字来设定在判定会话失败时的尝试连接的次数
    # option redispatch
    # 设置默认负载均衡方式,类似于nginx的ip_hash
    #balance source
    # 设置默认负载均衡方式,轮询方式
    balance roundrobin
    # 每个进程可用的最大连接数
    maxconn 25600
    # 当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
    option abortonclose
    timeout http-request    10s  # 默认http请求超时时间
    timeout queue           1m   # 默认队列超时时间
    timeout connect         10s  # 默认连接超时时间
    timeout client          1m   # 默认客户端超时时间
    timeout server          1m   # 默认服务器超时时间
    timeout http-keep-alive 10s  # 默认持久连接超时时间
    timeout check           10s  # 设置心跳检查超时时间

# 绑定配置
listen rabbitmq_cluster # #Frontend和Backend的组合体,rabbitMQ集群的名称,按需自定义名称
    bind 172.17.0.120:35444  # 腾讯后台申请HAVIP,https://cloud.tencent.com/document/product/215/36691
    # 配置TCP模式
    mode tcp
    option tcplog
    # 采用加权轮询的机制进行负载均衡
    balance roundrobin
    # HAProxy 中的timeout client超时时间,配置大于系统的tcp_keepalive_time间隔时间,
    option clitcpka
    timeout client 30m
    timeout server 30m

    # RabbitMQ 集群节点配置
    server mq01  172.17.0.31:35441 check inter 5000 rise 2 fall 3 weight 1
    server mq02  172.17.0.32:35441 check inter 5000 rise 2 fall 3 weight 1
    server mq03  172.17.0.33:35441 check inter 5000 rise 2 fall 3 weight 1
#以上配置代表对地址为 rabbit-node1:5672 的 node1 节点每隔 5 秒进行一次健康检查,如果连续两次的检查结果都是正常,则认为该节点可用,此时可以将客户端的请求轮询到该节点上;如果连续 3 次的检查结果都不正常,则认为该节点不可用。weight 用于指定节点在轮询过程中的权重。
# 配置监控页面
listen monitor # #Frontend和Backend的组合体,监控组的名称,按需自定义名称
    bind 172.17.0.31:35445      # 绑定IP地址和监听端口
    mode http                   # 开启模式为http
    option httplog
    log global                  # 日志应用到全局的配置上
    bind-process 4              # 代理 haproxy_status,在多进程模式下,状态将只分配给当前请求的进程。所以,我们一般使用 "bind-process" 将 haproxy 状态页面绑定到固定的进程上,跟上面 nbproc 同理
    stats enable                # 开启后台统计
    stats uri /stats            # 统计页面uri
    stats hide-version          # 隐藏统计页面上HAProxy的版本信息
    stats refresh 30s           # 统计页面自动刷新时间
    stats realm Haproxy Manager # 设置登录HAproxy监控统计页面时,密码框上的文本提示信息 
    stats auth admin:admin      # 监控页面的用户和密码admin,可以设置多个用户名 
    stats auth admin1:admin1    # 监控页面的用户和密码admin1
    # stats admin if TRUE         # 手动启用/禁用,后端服务器(haproxy-1.4.9以后版本),出于安全考虑,生产环境下不开启
EOF

7)根据自己的情况去修改主配置文件(包括两台服务器都要修改)

rabbitMQ集群搭建_第7张图片

rabbitMQ集群搭建_第8张图片

十八、安装 keepalived(在两台服务器上部署就行了,这里选择在 mq01 和 mq02上部署)

1)开始下载安装

cd /data/recycle
wget https://keepalived.org/software/keepalived-2.2.7.tar.gz --no-check-certificate


tar zxf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7/
./configure --prefix=/data/software/keepalived
make
make install
cd /data/recycle
rm keepalived-2.2.7* -rf
cat > /etc/profile.d/keepalived_home.sh <

2)创建相关目录

mkdir /data/software/keepalived/{run,logs}

 3)配置日志收集

cat >/data/software/keepalived/etc/sysconfig/keepalived <<'EOF'
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp               -P    Only run with VRRP subsystem.
# --check              -C    Only run with Health-checker subsystem.
# --dont-release-vrrp  -V    Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs  -I    Dont remove IPVS topology on daemon stop.
# --dump-conf          -d    Dump the configuration data.
# --log-detail         -D    Detailed log messages.
# --log-facility       -S    0-7 Set local syslog facility (default=LOG_DAEMON)
#

KEEPALIVED_OPTIONS="-f /data/software/keepalived/etc/keepalived/keepalived.conf -D -d -S 1"
EOF

cat > /etc/rsyslog.d/keepalived.conf <

4)配置 keepalived 主配置文件

cat > /data/software/keepalived/etc/keepalived/keepalived.conf <<'EOF'
global_defs {
   # 路由id,主备节点不能相同
   router_id node1
   
   notification_email {
     # email 接收方
     [email protected]
     [email protected]
     [email protected]
   }
   
   # email 发送方
   notification_email_from [email protected]
   # 邮件服务器, smtp 协议
   smtp_server SMTP.qq.com
   smtp_connect_timeout 30
   
   vrrp_skip_check_adv_addr
   # 使用 unicast_src_ip 需要注释 vrrp_strict,而且也可以进行 ping 测试
   #vrrp_strict 
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

# 自定义监控脚本
vrrp_script chk_haproxy {
    # 脚本位置
    script "/data/software/keepalived/etc/keepalived/haproxy_check.sh" 
    # 脚本执行的时间间隔
    interval 5 
    weight 10
}

vrrp_instance VI_1 {
    # Keepalived的角色,MASTER 表示主节点,BACKUP 表示备份节点
    state MASTER 
    
    # 指定监测的网卡,可以使用 ifconfig 进行查看
    interface eth0
    
    # 虚拟路由的id,主备节点需要设置为相同
    virtual_router_id 51
    
    # 优先级,主节点的优先级需要设置比备份节点高
    priority 100 
    
    # 设置主备之间的检查时间,单位为秒 
    advert_int 1 
    
    # 如果两节点的上联交换机禁用了组播,则采用 vrrp 单播通告的方式
    unicast_src_ip 172.17.0.31 # 本机内网 IP
    unicast_peer {
        ##对端设备的 IP 地址,也称着为备用节点的IP地址
        172.17.0.32
    }
    
    # 定义验证类型和密码
    authentication { 
        auth_type PASS
        auth_pass 123456
    }

    # 调用上面自定义的监控脚本
    track_script {
        chk_haproxy
    }

    virtual_ipaddress {
        # 虚拟IP地址,可以设置多个
        # 腾讯后台申请HAVIP,https://cloud.tencent.com/document/product/215/36691
        172.17.0.120
    }
}
EOF

5)根据自己的情况去修改主配置文件(包括两台服务器都要修改)

rabbitMQ集群搭建_第9张图片

rabbitMQ集群搭建_第10张图片

如果要配置邮件发送信息的,可以自行百度的修改,这个不是必要的

rabbitMQ集群搭建_第11张图片

6)配置 keepalived 监控 haproxy 的脚本

cat > /data/software/keepalived/etc/keepalived/haproxy_check.sh <<'EOF'
#!/bin/bash

# 判断haproxy是否已经启动
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ] ; then
    #如果没有启动,则启动
    /data/software/haproxy/sbin/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
EOF

7)配置 systemctl 管理 keepalived 服务

cat > /usr/lib/systemd/system/keepalived.service <<'EOF'
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target
Documentation=man:keepalived(8)
Documentation=man:keepalived.conf(5)
Documentation=man:genhash(1)
Documentation=https://keepalived.org

[Service]
Type=simple
PIDFile=/run/keepalived.pid
KillMode=process
EnvironmentFile=-/data/software/keepalived/etc/sysconfig/keepalived
ExecStart=/data/software/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
EOF

十九、启动 keepalived 和 haproxy 服务

1)添加 keepalived 和 haproxy 用户

useradd -s /sbin/nologin keepalived
useradd -s /sbin/nologin haproxy

2)修改权限

chown -R keepalived:keepalived /data/software/keepalived/
chown -R haproxy:haproxy /data/software/haproxy/

3)启动服务,并设置开机自启

# 重启管理日志服务(rsyslogd) 
systemctl restart rsyslog.service

# 重新加载新的服务配置文件
systemctl daemon-reload

# 设置 keepalived 开机自启,并启动服务
systemctl enable --now keepalived

# 设置 haproxy 开机自启,并启动服务
systemctl enable --now haproxy

4)检查启动情况(两台服务器都操作)

# 检查进程

ps ax | grep -E 'haproxy|keepalived'

rabbitMQ集群搭建_第12张图片

# 检查端口

netstat -untpl | grep 3544

rabbitMQ集群搭建_第13张图片

# 检查IP地址,理论上应该是在 mq01 上的

ip add | grep 120

二十、测试IP地址能否漂移

# 关掉 mq01中的 keepalived 服务,并查看 mq02 的IP地址

systemctl stop keepalived.service  # mq01 服务器上操作
ip add | grep 120  # mq02 服务器上操作

 rabbitMQ集群搭建_第14张图片

测试看到是能漂移到 mq02 服务器上的,再次启动 mq01 上的  keepalived 服务,并查看 mq01 和 mq02 的IP地址

systemctl start keepalived.service  # mq01 服务器上操作
ip add | grep 120                   # mq01 服务器上操作

 rabbitMQ集群搭建_第15张图片

# mq02 服务器上操作,可以看到 mq02 服务器上已经没有了 172.17.0.120 的VIP地址

ip add | grep 120

rabbitMQ集群搭建_第16张图片

# 至此,MQ集群部署完成

你可能感兴趣的:(运维,rabbitmq,分布式)