前言:上一篇搭建的仅仅是普通集群,虽然交换机、绑定关系、对列等可以复制到集群的其他节点,但是队列内容不会复制,如果队列宕机将会导致队列无法使用,不能保证队列的高可用性。
详情参考:http://next.rabbitmq.com/ha.html
集群模式:
对于queue来说,message data只存在于集群中的一个节点上,而message metadata则存在于集群中的所有节点。当message进入A节点的queue后,consumer从B节点拉去时,rabbitmq会临时在A、B之间进行消息传输,把A中的message data取出来发送给链接在B上的consumer。这样就存在A这个瓶颈,无论链接A还是B,出口总是在A。还有如果A节点故障后,在B节点无法取到A节点中还未消费的消息,如果做了消息持久化,则A节点恢复后,仍然可以被消费,但是如果没做消息持久化,即使A恢复了,消息也丢失了。
镜像模式:
该模式和集群模式的区别在于,message data会在镜像节点间主动同步,而不是在consumer取数据时临时拉取,当然由于在节点间主动同步数据,副作用也很明显,降低系统性能,一但大量消息进入,则同步的消息非常多。
RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将所有数据放在内存,磁盘节点将数据放在磁盘。如果在投递消息时,打开了消息的持久化,那么即使是内存节点,数据还是安全的放在磁盘。
1.设置镜像队列策略
- 在任意一个节点上执行
- rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
- 将所有队列设置为镜像队列,队列会被复制到各个节点,状态保持一致
- 在rabbitmq的web控制台上可以看到
- 输入rabbitmqctl查看帮助
- set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition> //设置策略
- clear_policy [-p <vhost>] <name> //清除策略
- list_policies [-p <vhost>] //策略列表
- rabbitmqctl详情查看:https://blog.youkuaiyun.com/mlym521/article/details/81990265
-
[-p <vhost>]: 可选参数,针对指定vhost下的queue进行设置
[--priority <priority>]:可选参数,policy的优先级
[--apply-to <apply-to>]:应用到 exchanges或者queue或者 all
<name>: policy的名称
<pattern>: 对列(queue)或者转换器(exchange)的正则匹配模式
<definition>:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
2.Haproxy的安装
- 上传haproxy-1.7.8.tar.gz包到服务器上
- tar -zxvf haproxy-1.7.8.tar.gz -C /usr/local
- 将源码解压之后,需要运行make来将HAProxy编译为可执行程序。在执行make之前需要先选择目标平台,通常对于UNIX系的操作系统可以选择TARGET=generic
- make TARGET=generic //编译
- export PATH=$PATH:/usr/local/haproxy-1.7.8 //配置环境变量
-
source /etc/profile //source一下就OK了
-
mkdir conf //在haproxy-1.7.8目录下创键conf目录
-
配置haproxy.cfg
-
haproxy -f ./conf/haproxy.cfg -d //启动haproxy -d表示debug模式
-
该图显示我的rabbitmq第二个节点没有启动DOWN,启动之后显示UP
-
-
两个rabbitmq节点启动完成之后
-
重新启动haproxy显示为
-
-
访问haproxy的web端,绑定端口为8100
-
-
通过haproxy访问rabbitmq的web管理控制台,绑定端口为8004
-
客户端连接haproy就OK了,这里haproxy绑定的端口为5671
-
-
haproxy.cfg配置文件配置
-
#全局配置 global #日志输出配置,所有日志都记录在本机,通过local0输出 log 127.0.0.1 local0 info #最大连接数 maxconn 4096 #改变当前的工作目录 chroot /usr/local/haproxy-1.7.8 #以指定的UID运行haproxy进程 uid 99 #以指定的GID运行haproxy进程 gid 99 #以守护进程方式运行haproxy #debug #quiet daemon #debug #当前进程pid文件 pidfile /usr/local/haproxy-1.7.8/haproxy.pid #默认配置 defaults #应用全局的日志配置 log global #默认的模式mode{tcp|http|health} #tcp是4层,http是7层,health只返回OK mode tcp #日志类别tcplog option tcplog #不记录健康检查日志信息 option dontlognull #3次失败则认为服务不可用 retries 3 #每个进程可用的最大连接数 maxconn 2000 #连接超时 timeout connect 5s #客户端超时 timeout client 120s #服务端超时 timeout server 120s #绑定配置 listen rabbitmq_cluster bind 0.0.0.0:5671 #配置TCP模式 mode tcp #简单的轮询 负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数) balance roundrobin #RabbitMQ集群节点配置 server rmq_node1 192.168.184.129:5672 check inter 5000 rise 2 fall 3 weight 1 server rmq_node2 192.168.184.131:5672 check inter 5000 rise 2 fall 3 weight 1 ###############我把RabbitMQ的管理界面也放在HAProxy后面了################# listen rabbitmq_admin bind 0.0.0.0:8004 server rmq_node1 192.168.184.129:15672 server rmq_node2 192.168.184.131:15672 #haproxy监控页面地址 listen monitor bind 0.0.0.0:8100 mode http option httplog stats enable stats uri /stats stats refresh 5s