通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。
这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 2 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。
Rabbitmq在Linux下安装再次不再赘述,回头我会单起一篇讲述Rabbitmq安装部署。
cd /etc/hosts 目录修改host文件
10.73.8.17 d5kl-slh1 10.72.8.17 d5kl-slh2
RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。
.erlang.cookie默认权限是400,所以需要先修改d5kl-slh1、d5kl-slh2中的该文件权限为 777 查看d5kl-slh1中cookie文件里的内容:
chmod 777 .erlang.cookie vi .erlang.cookie
然后将文件复制到 d5kl-slh2节点的.erlang.cookie文件中。修改完之后,将权限还原为400
chmod 400 .erlang.cookie
要先停止现有的Rabbitmq-server,再重新在后台支行
rabbitmqctl stop --停止rabbitmq-server rabbitmq-server -detached --添加detached参数 rabbitmqctl cluster_status -- 查看各节点状态 如d5kl-slh1节点 rabbitmqctl cluster_status Cluster status of node rabbit@d5kl-slh1... [{nodes,[{disc,[rabbit@d5kl-slh1]}]}, {running_nodes,[rabbit@d5kl-slh1]}, {cluster_name,<<"rabbit@d5kl-slh1">>}, {partitions,[]}, {alarms,[{rabbit@d5kl-slh1,[]}]}]
因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
d5kl-slh2节点配置
rabbitmqctl stop_app --关闭应用 rabbitmqctl join_cluster rabbit@d5kl-slh1 --将d5kl-slh2节点加入到d5kl-slh1集群 rabbitmqctl start_app --开启app
如果要使用内存节点,则可以使用以下命令:
将该命令rabbitmqctl join_cluster rabbit@d5kl-slh1修改为 rabbitmqctl join_cluster --ram rabbit@d5kl-slh1
集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。d5kl-slh1节点状态
rabbitmqctl cluster_status Cluster status of node 'rabbit@d5kl-slh1' ... [{nodes,[{disc,['rabbit@d5kl-slh1','rabbit@d5kl-slh2']}]}, {running_nodes,['rabbit@d5kl-slh2','rabbit@d5kl-slh1']}, {cluster_name,<<"rabbit@d5kl-slh2">>}, {partitions,[]}, {alarms,[{'rabbit@d5kl-slh2',[]},{'rabbit@d5kl-slh1',[]}]}]
d5kl-slh2节点状态
rabbitmqctl cluster_status Cluster status of node 'rabbit@d5kl-slh2' ... [{nodes,[{disc,['rabbit@d5kl-slh1','rabbit@d5kl-slh2']}]}, {running_nodes,['rabbit@d5kl-slh1','rabbit@d5kl-slh2']}, {cluster_name,<<"rabbit@d5kl-slh2">>}, {partitions,[]}, {alarms,[{'rabbit@d5kl-slh1',[nodedown]},{'rabbit@d5kl-slh2',[]}]}]
同时在Web管理工具中也可以看到效果
使用Rabbit镜像功能,需要基于RabbitMQ策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为
rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}' 这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示所有匹配所有队列名称。 例如下面的命令,^message 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"。 rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。HAProxy支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。
HAProxy的特点是:
现以10.74.8.17为例
yum install epel
yum install haproxy
vim /etc/haproxy/haproxy.cfg
Global settings
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats
Defaults Setting
defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000
haproxy 监控页面
listen private_monitoring :8100 mode http option httplog stats enable #设置haproxy监控地址为http://localhost:8100/stats stats uri /stats stats refresh 30s #添加用户名密码认证 stats auth admin:1234
将RabbitMQ的管理界面也放在HAProxy
listen rabbitmq_admin 0.0.0.0:15672 server node1 10.73.8.17:15672 server node2 10.72.8.17:15672
在HAProxy监听Rabbitmq5672端口
listen rabbitmq_cluster 0.0.0.0:5673 mode tcp option tcplog #timeout client 3h #timeout server 3h option clitcpka balance roundrobin --负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数) server node1 10.73.8.17:5672 check inter 5s rise 2 fall 3 #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用 server node2 10.72.8.17:5672 check inter 5s rise 2 fall 3