前言:上一篇搭建的仅仅是普通集群,虽然交换机、绑定关系、对列等可以复制到集群的其他节点,但是队列内容不会复制,如果队列宕机将会导致队列无法使用,不能保证队列的高可用性。
详情参考: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.csdn.net/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