一、rabbitmq cluster的基础知识
1.RabbitMQ简介
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如pyhton、C等,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性方面的性能不较好。AMQP,即Advanced message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,消息中间件主要用于组建之间的解耦,消息的发送者无需知道消息使用者的存在,反之依然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)。
2.RabbitMQ集群概述
通过Erlang的分布式特性(通过magic cookie认证节点)的方式管理rabbitmq集群,即各个rabbitmq服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。这些节点通过RabbitMQ HA队列(镜像队列)进行消息队列结构复制。
二、rabbitmq cluster安装
1.安装所需要的包
在所有的rabbit节点都需要安装rabbit,以及开启web服务。
**本小结在全部rabbit节点执行
安装所需要的包
yum install rabbitmq-server erlang socat -y
启动服务
systemctl enable rabbitmq-server.service
systemctl start rabbitmq-server.service
启动web页面
rabbitmq-plugins enable rabbitmq_management #启动web插件端口15672
netstat -antp|egrep '567'
2.设置Erlang Cookie
RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的,因此要保证所有节点的cookie一致性。
为了保证所有rabbit节点cookie的一致性,我们可以将一台节点的cokkie分别同步复制到其他的rabbit部署节点,这里以zcontrollerA1的cookie为例,将zcontrollerA1中的rabbit cookie分别复制到其他的rabbit部署节点。
scp /var/lib/rabbitmq/.erlang.cookie zcontrollerA2:/var/lib/rabbitmq/
所有rabbitmq的cookie设置完成之后,在以rabbit的cookie为基准的节点上执行以下命令。
systemctl stop rabbitmq-server.service
pkill beam.smp
rabbitmqctl stop
rabbitmq-server -detached
rabbitmqctl cluster_status
3.将各节点添加到集群
将其他节点分别加入到基准cookie所在的节点,示例中,将所有节点都加入到zcontrollerA1的集群中,除zcontrollerA1之外的其他节点均需要执行。
**分别在cookie基准节点之外的其他rabbit节点依次执行,其中zcontrollera1指的是将当前rabbit要加入的集群节点,即cookie的基准节点。
systemctl stop rabbitmq-server.service
pkill beam.smp
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@zcontrollera1
rabbitmqctl start_app
rabbitmqctl cluster_status
4.设置镜像队列
设置镜像队列,在某一台设备上执行就行。
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' #设置镜像队列
rabbitmqctl set_cluster_name RabbitMQ-Cluster #更改群集名称
rabbitmqctl cluster_status #查看群集状态
5.添加用户密码
在任意一个rabbit节点执行。
rabbitmqctl add_user admin admin #添加admin用户
rabbitmqctl set_user_tags admin administrator #给admin用户管理员权限
rabbitmqctl add_user openstack 1q2w3e4r #添加openstack用户
rabbitmqctl set_permissions openstack ".*" ".*" ".*" #设置权限
rabbitmqctl set_user_tags openstack administrator #给openstack用户管理员权限
netstat -antp|grep '5672'
三、haproxy部署rabbitmq
本节中的1、2、3在所有节点执行。
1.haproxy配置rabbitmq后端服务
echo '#RabbitMQ
listen RabbitMQ-Server
bind vip:5673
mode tcp
balance roundrobin
option tcpka
timeout client 3h
timeout server 3h
option clitcpka
server rabbit节点1的ip rabbit节点1的ip:5672 check inter 5s rise 2 fall 3
server rabbit节点2的ip rabbit节点2的ip:5672 check inter 5s rise 2 fall 3
'>>/etc/haproxy/haproxy.cfg
2.haproxy配置rabbitmq web
echo '#RabbitMQ
listen RabbitMQ-Web
bind vip:15673
mode tcp
balance roundrobin
option tcpka
server rabbit节点1的ip rabbit节点1的ip:15672 check inter 5s rise 2 fall 3
server rabbit节点2的ip rabbit节点2的ip:15672 check inter 5s rise 2 fall 3
'>>/etc/haproxy/haproxy.cfg
3.重启服务并访问
启动服务
systemctl restart haproxy.service
netstat -antp|grep 567
web访问
http://vip:15672
4.启动异常处理
处理方案如下:
ps -aux | grep "rabbit"
kill -9 杀掉进程
然后重启rabbit