rabbitmq消费者集群,activemq高可用集群
一.功能和原理1 .设计集群的目的
(1)允许消费者和生产者在RabbitMQ节点崩溃时继续运行
)2)通过添加更多节点来扩展消息通信的吞吐量。
2 .集群配置方式
Rabbitmq可以通过:集群、federation和shovel三种方法部署分布式集群系统
a )cluster:
不支持用于同一网段内LAN的交叉网段
可以自由动态地增加或减少
节点之间必须运行相同版本的Rabbitmq和Erlang
b )federation:
应用于广域网,允许一台服务器上的交换机或队列接收发布到另一台服务器上的交换机或队列的消息。 可以是一台机器或集群。 federation队列类似于单向点对点连接,可以在联盟队列之间多次传输消息,直到被消费者接受为止。 通常使用federation连接到internet上的中间服务器,并用作订阅分发消息或工作队列。
c )shovel:
连接方法与federation类似,只是在更低的级别上运行,可以在广域网上使用。
3 .节点类型
群集中的节点一般有内存节点和磁盘节点两种。 内存节点不读写磁盘,因此性能比磁盘节点好,磁盘节点可以将状态持久化为磁盘,可用性比内存节点好,需要权衡。 这次计划将一个磁盘节点作为数据备份,使用两个内存节点来提高性能。
Rabbitmq要求群集中至少有一个磁盘节点。 所有其他节点都可以是内存节点,当节点加入或退出群集时,必须至少通知一个磁盘节点对其所做的更改。 如果群集中唯一的磁盘节点崩溃,则群集可以正常工作,但在节点恢复之前不能执行其他操作(添加/删除检查)。
4 .集群模式
正常模式(默认) :对于Queue来说,消息实体只存在于其中一个节点中,而A/B这两个节点具有相同的元数据,即队列结构。 ) )交换机的所有元数据在所有节点上都一致,但队列的完整信息只存在于创建它的节点上,每个节点都有相同的元数据(即队列结构) )消息进入a节点的队列后,consoss RabbitMQ暂时在A.B之间进行消息传输,取出a中的消息实体,经由b发送给consumer . 因此,consumer应该尽量连接各个节点并从中检索消息。 也就是说,对于同一逻辑队列,必须在多个节点上建立物理队列。 否则,会出现consumer可以连接到a或b的瓶颈。 该模型存在以下问题: a节点发生故障后,b节点无法获取a节点上未消耗的消息实体。 消息持久化意味着a何时恢复再消费; 如果不持久化,则接下来.该模式最适合非持久化队列。 只有在此队列非持久化时,客户端才能重新连接到群集中的其他节点并重新创建队列。 如果此队列持久化,则唯一的方法是恢复出现故障的节点。
镜像模式(高可用性模式) :使所需队列处于镜像模式,并存在于多个节点的数据Rabbitmq的HA方案中。 该模式解决了上述问题,与通常模式的不同之处在于,consumer在检索数据时不临时拉入,消息实体在镜像节点之间积极同步。 此模式的副作用也很明显,不仅会降低系统性能,而且如果镜像队列太多,导致大量消息进入,此同步通信会占用群集内部的大量网络带宽,因此非常适合要求可靠性的情况
2 .构建过程hosts的配置
在几台安装了Rabbitmq的计算机上,必须分别修改/etc/hosts文件,使其处于相同状态。 例如:
172.17.0.1 rabbitmq1
172.17.0.2 rabbitmq2
172.17.0.3 rabbitmq3
2 .配置2.cookie3360
ErlangCookie是保证不同节点能够相互通信的私钥,集群中的不同节点需要共享同一ErlangCookie才能相互通信。/var/lib/rabbitmq/. Erlang.cookie .说明:这是存储在rabbitmqctl命令中的工作,因为rabbit MQ基础是通过Erlang体系结构实现的,所以rabitmqcct60 连接时需要正确的Erlang节点和节点名称,Erlang节点通过交换Erlang Cookie进行认证。
Erlang节点之间通过认证Erlang cookie来允许相互通信。 由于Rabbitmqctl使用Erlang OTP通信机制与Rabbit节点进行通信,因此与允许Rabbitmqctl的设备连接的Rabbit节点必须使用相同的Erlang cookie。 报告错误。 文件权限必须一致。 (400 ),每个节点通过此cookie进行通信。 可以将其中一个节点的. erlang.cookie值scp发送到其他节点。 具体方法是:
)首先备份原始cookie文件,以便原始节点可以启动和停止rabbitmq-service。
rabbit02
# cp /var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie.bakrabbit03# cp /var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie.bak
(2)修改cookie的值:
scp /var/lib/rabbitmq/.erlang.cookie 172.17.0.2:/var/lib/rabbitmq
scp /var/lib/rabbitmq/.erlang.cookie 172.17.0.3:/var/lib/rabbitmq
(3)在复制的时候需要临时修改cookie文件的权限:
chmod 777 /var/lib/rabbitmq/.erlang.cookie
(4)拷贝完毕后再把权限修改回来:
chmod 400 /var/lib/rabbitmq/.erlang.cookie
3.组建集群
停掉所有节点上的rabbitmq服务,然后使用-detached独立运行各个节点,这步很关键,尤其是增加节点停止节点后再次启动遇到无法启动时都可以参照这个顺序进行.
rabbitmqctl stop
rabbitmq-server -detached
查看集群状态:
rabbitmqctl cluster_status
此时都以单个节点的形式运行,{cluster_name,<<"rabbit@rabbitmq1">>},这是集群名字,其他节点可以 join 到这个集群中。所有节点都是平等的,可以加入到任意一个集群中,最终这些节点都会在同一个集群中.
停掉其他rabbitmq节点,执行加入集群的命令:
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq1(注意:以内存节点的形式加入集群的命令:
rabbitmqctl join_cluster --ram rabbit@rabbitmq1)
rabbitmqctl start_app
此时再次查看集群状态,可以看到,各节点处于一个由rabbit01(disc node)、rabbit02(ram node)、rabbit03(ram node)组成的集群
rabbitmqctl cluster_status
在管控台界面也可以查看到具体的集群信息.
注意:
(1)如果要将某个节点从集群中移除,使其变回独立节点,可以使用以下命令:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
(2)如果需要启停某个节点来进行维护,可以使用以下命令:
rabbitmqctl stop
rabbitmq-server -detached
(3)若要修改某个节点类型,可以使用以下命令:(使用之前先stop某个节点)
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
(4)当新的节点加入到集群之后,其用户信息也会被重置了(之前添加的admin账户不见了),需要重新配置管理员用户,以便访问到RabbitMQ管理界面(在任意节点添加用户,会自动同步到各个节点).
添加管理员并授权:
rabbitmqctl add_user admin 123456
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
rabbitmq-plugins enable rabbitmq_management(开启web管理界面)
(5)退出集群
假设把rabbit@live-mq-02退出集群,在rabbit@live-mq-02上执行:
rabbitmqctl stop_app
在集群主节点上执行:
rabbitmqctl forget_cluster_node rabbit@live-mq-02
4.设置镜像队列策略:
在任意一个节点上执行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
即所有的队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致.完成以上步骤以后,Rabbitmq高可用集群就已经搭建好了,最后一个步骤是是搭建负载均衡器.
补充说明:rabbitmqctl set_policy -p hrsystem ha-allqueue "^" '{"ha-mode":"all"}'
这一行命令是在vhost名称为hrsystem创建一个策略,策略名称为ha-allqueue,策略模式为all,即复制到所有节点,包含新增节点,策略表达式为"^",表示所有匹配所有队列名称.
查看策略:rabbitmqctl list_policies -p /
清除策略:rabbitmqctl clear_policy -p / ha-allweb3.0
5.RabbitMQ负载均衡配置---选择开源的HAProxy为RabbitMQ集群做负载均衡器
搭建过程可参考:http://blog.51cto.com/freeloda/1294094
关于配置文件/etc/haproxy/haproxy.cfg的简单说明:
server node1 192.168.1.1:5672 check inter 2000 rise 2 fall 3 //负载均衡中的节点配置,这里选择rabbit节点.
server node2 192.168.1.2:5672 check inter 2000 rise 2 fall 3
#server node2 192.168.1.3:5672 check inter 2000 rise 2 fall 3
负载均衡器会监听5672端口,轮询两个内存节点192.168.1.1和192.168.1.2的5672端口,第三台为磁盘节点,只做备份,不提供给生产者和消费者使用,当然服务器资源充足的情况下也可配置多个磁盘节点,这样磁盘节点出了故障也不会影响.
文末
1.关于集群恢复与故障转移:
从节点停机解决:在主节点执行rabbitmqctl forget_cluster_node slavenode ,然后再把从节点加入集群.
主节点停机恢复:rabbitmqctl forget_cluster_node --offline slavenode执行该命令,支持线下恢复.等主节点恢复,再把从节点加入进去.
2.重要文件存储位置:
/usr/local/rabbitmq_server/var/log/rabbitmq/rabbit@tms-sasl.log:rabbitmq的崩溃报告
/usr/local/rabbitmq_server/etc/rabbitmq/rabbitmq.config:rabbitmq的配置文件
/usr/local/rabbitmq_server/var/lib/rabbitmq/mnesia/rabbit@tms:rabbit消息持久化文件
/usr/local/rabbitmq_server/var/log/rabbitmq/rabbit@tms.log:记录rabbitmq运行日常的日志
3.参考链接:
https://blog.csdn.net/qq_22075041/article/details/78855708
https://88250.b3log.org/rabbitmq-clustering-ha
https://blog.csdn.net/qq_35246620/article/details/72473098
https://my.oschina.net/jiaoyanli/blog/822011
http://www.imooc.com/article/46311
http://chyufly.github.io/blog/2016/04/10/rabbitmq-cluster/
https://www.jianshu.com/p/97fbf9c82872
https://cloud.tencent.com/developer/article/1014974
http://blog.51cto.com/ghbsunny/2154269
http://www.voidcn.com/article/p-vlhrergj-bsb.html
https://mshk.top/2016/08/rabbitmq-haproxy/
http://www.ywnds.com/?p=4741
http://www.rabbitmq.com/rabbitmqctl.8.html
http://www.rabbitmq.com/ha.html
http://www.rabbitmq.com/install-debian.html
https://www.jusene.me/2018/02/28/rabbitmq-3/