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

版权声明:本文为作者原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原创文章,作者:老C,如若转载,请注明出处:https://www.code404.icu/730.html

发表评论

登录后才能评论