RabbitMQ高可用集群部署及配置+HAproxy负载(源码)

版权声明:本文为博主原创文章,转载请注明来源:https://blog.csdn.net/loame_zyq https://blog.csdn.net/loame_zyq/article/details/83343155

1.环境

rabbitmq-1 10.24.43.4 centos6.x
rabbitmq-2 10.24.43.5 centos6.x

2.部署前准备

(1).修改主机名

10.24.43.4 rabbitmq_1
10.24.43.5 rabbitmq_2
部署路径:/data/UnicomSMS/

(2).时间同步
ntpdate ntp1.aliyun.com
注:这里ntp后面跟域名/ip可以自行选择,此处作者用的时阿里的时间服务器
两台同步同一个地址,创建计划任务每5分钟同步一次即可
crontab -e
最后一行添加
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
3.安装依赖环境
yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
4.安装erlang

wget http://erlang.org/download/otp_src_19.0.tar.gz
tar -zxvf otp_src_19.0.tar.gz
cd otp_src_19.0
mkdir /data/UnicomSMS/Erlang
./configure --prefix=/data/UnicomSMS/Erlang --without-javac
make && make install
export
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/data/UnicomSMS/Erlang/bin:/data/UnicomSMS/Rabbitmq_server-3.6.5/sbin" >>/etc/profile
source /etc/profile

测试:输出erl会进入erl编译界面,证明安装配置成功!ctrl+G 然后输入q退出编译

5.安装rabbitmq

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-generic-unix-3.6.5.tar.xz
yum install -y xz
xz -d rabbitmq-server-generic-unix-3.6.5.tar.xz
mkdir /data/UnicomSMS/Rabbitmq_server-3.6.5
tar -xvf rabbitmq-server-generic-unix-3.6.5.tar -C /data/UnicomSMS/Rabbitmq_server-3.6.5/
echo "export PATH=$PATH:/data/UnicomSMS/Erlang/bin:/data/UnicomSMS/Rabbitmq_server-3.6.5/sbin" >> /etc/profile
source /etc/profile

6.导入rabbitmq的管理界面

两个目录没作用太繁琐,环境变量也定义的一个,所以去掉一个

cd /data/UnicomSMS/Rabbitmq_server-3.6.5/rabbitmq_server-3.6.5/
mv * ..
cd ..
rm -rf rabbitmq_server-3.6.5/

进入rabbitmq的sbin目录

cd /data/UnicomSMS/Rabbitmq_server-3.6.5/sbin
./rabbitmq-plugins enable rabbitmq_management
这里执行后The following plugins have been enabled:意思是下列插件已启用,有点像报错,并不是报错哦

7.设置erlang

查找位置:find / -name *erlang.cookie
/root/.erlang.cookie #如果用的包和我一样,默认就是这
将rabbitmq-1的该文件内容复制到rabbitmq_2,注意这个文件的权限是 400(默认即是400)
[root@rabbitmq_1 ~]#cat /root/.erlang.cookie
将其内容复制
[root@rabbitmq_2 ~]# vim /root/.erlang.cookie
将复制的内容替换到此处
[root@rabbitmq_2 ~]#chmod 400 /root/.erlang.cookie

可以通过cat /root/.erlang.cookie来查看两台机器的cookie是否一致,设置erlang的目的是要保证集群内的cookie内容一致。

8.使用-detached参数运行各节点

rabbitmqctl stop #如果已经在运行中用此命令停掉服务
rabbitmq-server -detached #运行各节点
rabbitmqctl start_app #开启
rabbitmqctl stop_app #关闭
然后可以通过rabbitmqctl cluster_status查看节点状态。PS:要先拷贝cookie到另一台机器上,保证两台机器上的cookie是一致的并且权限都为400,然后再启动服务。

9.新增用户赋予权限

由于guest这个用户,只能在本地访问,所以我们要新增一个用户并赋予权限:
添加用户并设置密码:
rabbitmqctl add_user admin 123456

添加权限(使admin用户对虚拟主机“/” 具有所有权限):
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

修改用户角色(加入administrator用户组):
rabbitmqctl set_user_tags admin administrator

然后就可以远程访问了,然后可直接配置用户权限等信息。到此,就可以通过http://ip:15672 使用admin 123456 进行登陆了。
到这里的话,每个节点是作为单独的一台RabbitMQ存在的,也可以正常提供服务了

10.组成集群
rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用,并将节点设置为原始状态。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
将rabbitmq_1与rabbitmq_2组成集群,这里以rabbitmq_1为例

rabbitmq_2#rabbitmqctl stop_app

rabbitmq_2#rabbitmqctl join_cluster rabbit@rabbitmq_1
#这里集群的名字一定不要写错了,需保证rabbitmq_1是开启的,rabbitmq_2是关闭的,才可以加入集群,如果还报错,请检查
cookie是否一致且权限都是否为400,最好不要复制cookie到其他节点,建议把文件cp过去并赋予400权限,因为我第一次复制过去wc -c 发现字节不一样
rabbitmq_2# rabbitmqctl start_app

(PS:如果要使用内存节点,则可以使用rabbitmq_2# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1加入集群)集群配置完毕!
11.检查集群状态

集群配置完毕后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。
rabbitmq_1# rabbitmqctl cluster_status

会有一个集群名字和连接信息,我这里只贴出来一个集群名字
{cluster_name,<<”rabbit@rabbitmq_1”>>}

可知,集群的名称默认为rabbit@rabbitmq_1;

PS:另外一种查看集群是否成功的方式,在web页面上的“Queues”的列表中,查看有如下显示为“同步镜像到node2”,则也表示集群配置成功

12.设置镜像队列策略
在任意一个节点上执行如下操作(这里在rabbitmq_1上执行)

首先,在web界面,登陆后,点击“Admin–Virtual Hosts(页面右侧)”,在打开的页面上的下方的“Add a new virtual host”处增加一个虚拟主机,同时给用户“admin”和“guest”均加上权限(在页面直接设置、点点点即可);

然后,在linux中执行如下命令

rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all"}'
“/” vhost默认名称,可通过rabbitmqctl list_vhosts查看, “^”匹配所有的队列, ha-all 策略名称为ha-all, ‘{“ha-mode”:”all”}’ 策略模式为 all 即复制到所有节点,包含新增节点。

则此时镜像队列设置成功。(这里的虚拟主机coresystem是代码中需要用到的虚拟主机,虚拟主机的作用是做一个消息的隔离,本质上可认为是一个rabbitmq-server,是否增加虚拟主机,增加几个,这是由开发中的业务决定,即有哪几类服务,哪些服务用哪一个虚拟主机,这是一个规划)。

12:这里补充一些对于设置镜像队列策略的说明

格式:rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

-p Vhost#可选参数,针对指定vhost下的queue进行设置
Name:#policy的名称
Pattern:#queue的匹配模式(正则表达式)
Definition#镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode#指明镜像队列的模式,有效值为 all/exactly/nodes
all#表示在集群中所有的节点上进行镜像
exactly#表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
node#:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params#ha-mode模式需要用到的参数
ha-sync-mode#进行队列中消息的同步方式,有效值为automatic和manual
priority#可选参数,policy的优先级
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。完成这 几个步骤后,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。

13.安装并配置HA
在rabbitmq-1上yum安装HAProxy(yum -y install haproxy),然后修改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 
       log        global 
       mode       tcp 
       option     tcplog 
       option     dontlognull 
       retries    3 
       option redispatch 
       maxconn 2000 
       contimeout      5s 
       clitimeout      120s 
       srvtimeout      120s 

listen rabbitmq_cluster 10.24.43.4:5670
       mode      tcp 
       balance roundrobin 
       server rabbit1  10.24.43.4:5672 check inter 5000 rise 2 fall 2 
       server rabbit2  10.24.43.5:5672 check inter 5000 rise 2 fall 2 

       listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s

一般前面对照一下,就listen段落复制进去就可以了,记得改ip哦
14.重启 haproxy
service haproxy restart

登录浏览器输入地址http://10.24.43.4:8100/rabbitmqstats查看HAProxy的状态

15.查询命令
获取服务器状态信息
服务器状态:rabbitmqctl status ##其中可查看rabbitmq的版本信息

16.获取集群状态信息
rabbitmqctl cluster_status

原文

猜你喜欢

转载自blog.csdn.net/loame_zyq/article/details/83343155