RabbitMQ消息队列服务高可用搭建手册
注:本文搭建rabbitmq+haproxy+keepalived高可用集群,采用本地下载安装包的形式。
1. 帮助
1.1 安装包下载
1.2 集群运行前提
1) 集群所有节点必须运行相同的erlang及Rabbitmq版本。
2) Hostname解析,节点之间通过域名互相访问,本文为3个节点,使用配置hosts方式。
1.3 端口及协议
1) Rabbitmq
4369(tcp):erlang进程epmd用来做node连接的
5672(tcp):与mq服务通信使用
15672(tcp):rabbitmq服务后台管理页面访问端(http://ip:15672)
25672(tcp):集群之间访问使用
2) haproxy
8100:haproxy控制台访问端口,默认为8100
3) keepalived
防火墙开启vrrp 协议
2. 集群搭建
本文按照下图方案部署:
2.1 Erlang安装
1) 安装包 erlang-21.2.5-1.el7.centos.x86_64.rpm
2) 上传到指定目录,运行命令安装(本文安装路径为:/usr/local)
rpm -ivh erlang-21.2.5-1.el7.centos.x86_64.rpm
3) 暂时不支持制定路径安装,如果想换路径,用which erl 查看erlang安装地址,erlang被安装到了/usr/lib64/erlang
此目录,此时便可将此目录转移到你想放置的目录。
mv /usr/lib64/erlang/ /usr/local/
4) 此时运行命令报错
/usr/local/erlang/bin/erl:行29: /usr/lib64/erlang/erts-8.0.3/bin/erlexe: 没有那个文件或目录
原因在于erl文件中配置了ROOTDIR,使用命令打开erl文件。
vim /usr/local/erlang/bin/erl
#ROOTDIR改为如下,保存。
ROOTDIR="/usr/local/erlang"
5) 添加环境变量
export ERL_HOME=/usr/local/erlang
export PATH=$ERL_HOME/bin:$PATH
#/etc/profile更新生效命令
source /etc/profile
6) 运行erl成功
[root@mq1 ~]# erl
Erlang/OTP 21 [erts-10.2.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Eshell V10.2.3 (abort with ^G)
2.2 Rabbitmq单机安装
1) rabbitmq-server-3.7.11-1.el7.noarch.rpm安装包。
rpm -ivh rabbitmq-server-3.7.11-1.el7.noarch.rpm
2) 直接安装rabbitmq可能会报错找不到socat,下载socat-1.7.2.4-1.el7.rf.x86_64.rpm,安装成功后,继续安装rabbitmq便可成功。
rpm -ivh socat-1.7.2.4-1.el7.rf.x86_64.rpm
3) 修改配置登录用户名,默认guest:guest不让登录了
我们创建管理员用户
rabbitmq设置用户名和密码
/usr/local/rabbitmq_server-3.7.0/sbin目录下输入
#新增用户
./rabbitmqctl add_user zhangsan admin123
#设置用户级别
#用户级别:
#1、administrator 可以登录控制台、查看所有信息、可以对rabbitmq进行管理
#2、monitoring 监控者 登录控制台,查看所有信息
#3、policymaker 策略制定者 登录控制台,指定策略
#4、managment 普通管理员 登录控制台
./rabbitmqctl set_user_tags zhangsan administrator
4) 启动rabbitmq
执行命令:
#启动rabbitmq
systemctl start rabbitmq-server.service
#加入开机自启
systemctl enable rabbitmq-server.service
5) 启用后台管理页面
[root@mq1 ~]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@mq1:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_tracing
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@mq1...
Plugin configuration unchanged.
6) rabbitmq单机搭建完成
访问:http://ip:15672
7) 重复上面上步骤安装三台服务器
2.3 集群搭建
本文搭建使用三台linux机器(假设:ip1,ip2,ip3)
2.3.1 环境准备
1) erlang进程需要host来进行连接,所以它会检查你的hosts配置,而rabbitmq集群之间是通过erlang进程epmd用来做node连接的。三台服务需要修改其对应的hostname为mq1、mq2、mq3,并且每台机器hosts文件需要配置下面3行:
Ip1 mq1
Ip2 mq2
Ip3 mq3
2) 寻找rabbitmq安装路径,修改.erlang.cookie 文件中的字符串,让每台服务器保持一致
尽量使用scp命令复制:
scp -r /var/lib/rabbitmq/.erlang.cookie root@ip2:/var/lib/rabbitmq/
复制前修改文件权限,复制完要恢复文件权限(修改权限命令:chmod 400 .erlang.cookie
)
3) 三台mq服务启动成功后,停止三台mq的服务
rabbitmqctl stop_app
4) 加入集群命令(在其他两个几点mq2、ma3上运行)
rabbitmqctl stop_app(因为之前停止了,所以可能会报错,不用管。)
rabbitmqctl join_cluster rabbit@mq1 (这里的mq1,主节点的主机名)
rabbitmqctl start_app
5) 访问控制台,搭建成功
2. 配置haproxy
Haproxy是一款提供高可用性、负载均衡以及基于tcp和http应用的代理软件。
使用rpm安装包:haproxy-1.5.18-8.el7.x86_64.rpm
1) 安装haproxy
rpm -ivh haproxy-1.5.18-8.el7.x86_64.rpm
2) 配置文件放到/etc/haproxy/haproxy.cfg
cat /etc/haproxy/haproxy.cfg
#logging options
global
log 127.0.0.1 local0 info
maxconn 5120
chroot /usr/local/haproxy
uid 99
gid 99
daemon
quiet
nbproc 20
pidfile /var/run/haproxy.pid
defaults
log global
#使用4层代理模式,”mode http”为7层代理模式
mode tcp
#if you set mode to tcp,then you nust change tcplog into httplog
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
##客户端空闲超时时间为 60秒 则HA 发起重连机制
clitimeout 60s
##服务器端链接超时时间为 15秒 则HA 发起重连机制
srvtimeout 15s
#front-end IP for consumers and producters
listen rabbitmq_cluster
bind 0.0.0.0:5672
#配置TCP模式
mode tcp
#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
#简单的轮询
balance roundrobin
timeout client 3h
timeout server 3h
#rabbitmq集群节点配置 #inter 每隔五秒对mq集群做健康检查, 2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制
server mq1 ip1:5672 check inter 5000 rise 2 fall 2
server mq2 ip2:5672 check inter 5000 rise 2 fall 2
server mq3 ip3:5672 check inter 5000 rise 2 fall 2
#配置haproxy web监控,查看统计信息
listen stats
bind 0.0.0.0:8100
mode http
option httplog
stats enable
#设置haproxy监控地址为http://localhost:8100/rabbitmq-stats
stats uri /rabbitmq-stats
stats refresh 5s
haproxy.cfg需要注意haproxy安装目录,rpm安装位置为usr/lib/haproxy
3) 启动服务
[root@haproxy2 ~]# systemctl start haproxy.service
4) 搭建成功,访问以下地址可以对mq节点进行监控
http://192.168.65.115:8100/rabbitmq-stats
5) 关闭haproxy
[root@haproxy2 ~]# systemctl stop haproxy.service
6) 需要几台haproxy就安装几台,重复上面步骤就可以
3. Keepalived安装
简介,它是一个高性能的服务器高可用或热备解决方案,主要作用是为了防止服务单点故障问题,可以通过和nginx、haproxy等反向代理的负载均衡来实现与web服务端的高可用。Keepalived以vrrp协议为主,vrrp协议将两台或多台路由设备虚拟为一个设备,对外提供虚拟路由ip。
使用安装包:keepalived-1.2.18.tar.gz
1) yum安装环境依赖
yum install gcc -y
yum install -y openssl openssl-devel
yum install -y libnfnetlink-devel
yum -y install libnl libnl-devel
2) 安装keepalived
tar -zxvf keepalived-1.2.18.tar.gz
cd keepalived-2.0.10/
./configure --prefix=/usr/local/keepalived
make
make install
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/kee /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
3) 设置开机自启动
systemctl enable keepalived
**4) ** 添加keepalived_check.sh脚本文件至/etc/keepalived
vim /etc/keepalived/keepalived_check.sh
#!/bin/bash
COUNT=`ps -C haproxy --no-header |wc -l`
if [ $COUNT -eq 0 ];then
systemctl stop keepalived
fi
chmod +x /etc/keepalived/haproxy_check.sh
5) 配置keepalived.conf文件,可根据注释修改配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id KEEPMQ
}
vrrp_script chk_http_port {
script "/etc/keepalived/keepalived_check.sh"
interval 1
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 136
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
unicast_src_ip 10.64.35.136 #本地IP地址
unicast_peer {
10.64.35.137 #对端IP地址,此地址一定不能忘记
}
virtual_ipaddress {
10.64.35.156 #虚拟ip
}
track_script {
chk_http_port
}
}
6) 可能遇见主备双机同时拥有vip的问题
第一种办法设置混杂模式
ifconfig eth0 promisc#设置混杂模式
ifconfig eth0 promisc #取消混杂模式
第二种:centos7 默认防火墙firewall
开启vrrp 协议,主备都运行下面的命令
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT && firewall-cmd --reload