vlambda博客
学习文章列表

智汇华云 | RabbitMQ集群揭秘

智汇华云 | RabbitMQ集群揭秘

RabbitMQ随着云计算的发展已经成为现在企业中使用最广泛的消息队列,而企业中使用Rabbitmq通常都采用集群模式,通过集群模式,可以相比单节点的rabbitmq提供高可用性,高吞吐量,数据安全。

 

本期“智汇华云”为您邀请到华云数据网络组高级云计算工程师张胜带来“RabbitMQ集群揭秘”,分享目前Rabbitmq集群模式的常见分区策略使用方式,以及探讨一下常见问题,同时给出解决办法。


本期嘉宾

智汇华云 | RabbitMQ集群揭秘

张胜

华云数据网络组

高级云计算工程师


Rabbitmq集群特点


集群中的所有节点都是平等的,意味着客户端可以连接到任意一个节点进行消息发送接收。


如图:

 

智汇华云 | RabbitMQ集群揭秘


发送者连接到Node1,而队列建立在Node2上,Rabbitmq可以自动把消息发送到Node2上的Queue中,客户端不需要知道消息具体存储在哪个节点。

 

Rabbitmq集群组成


Erlang虚拟机组成集群。Erlang作为天生支持分布式的语言,轻而易举


1. 所有节点设置同样的cookie,相当于认证。

2. 加入集群。

 

智汇华云 | RabbitMQ集群揭秘


Mnesia分布式数据库组成集群,所有运行时数据在集群内都是同步更新的,除了message queues。 

 

智汇华云 | RabbitMQ集群揭秘


Rabbitmq集群,在前面两个集群都正常的基础上,Rabbitmq对外提供服务。

 

Rabbitmq集群管理


使用rabbitmqctl命令来进行集群的管理。


创建集群

智汇华云 | RabbitMQ集群揭秘


离开集群

 

智汇华云 | RabbitMQ集群揭秘


Rabbitmq集群分区策略


分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。1998年,加州大学的计算机科学家 Eric Brewer 提出,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。

 

智汇华云 | RabbitMQ集群揭秘


CP:网络分区的时候某些数据会不可用,MongoDB,Hbase,Memcache,Redis


AP:网络分区的时候客户端读到不一致的数据,Cassandra,Riak,CouchDB


CA:网络分区的时候停止系统,传统MySQL

 

Rabbitmq集群也是逃不掉这个定理,使用的Mnesia分布式数据库属于AP类型。


Rabbitmq使用cluster_partition_handling参数对分区策略进行配置。


  • ignore(默认)不做任何处理,该怎么样就怎么样,就像没发生过。

  • autoheal 分区结束的时候自动从client数最多的分区恢复数据库。达到自动愈合的效果。

  • pause_minority 分区开始的时候自动停止少数派(小于n/2+1)

  • pause_if_all_down(复杂)还带两个额外参数

             · nodes 定义这些节点联系不上的时候本节点就停止工作

               · recover 定义节点重新连接上时执行什么策略恢复

                       · ignore 

                       · autoheal

 

这里我主要介绍一下pause_minority模式以及其中的坑。


代码文件rabbit_node_monitor.erl负责集群的状态监控,使用了OTP的gen_server behavior,直接定位到handle_info监听nodedown信息的地方。

 

智汇华云 | RabbitMQ集群揭秘


代码中最后对这个dead节点执行handle_dead_node操作:

 

智汇华云 | RabbitMQ集群揭秘


这里主要关注pause_minority分支,如果自己所在分区不是majority,就要等待集群恢复到majority才对外服务,调用rabbit:stop停止服务,然后等待。

 

智汇华云 | RabbitMQ集群揭秘


持续ping对方,每一秒ping一次。

 

智汇华云 | RabbitMQ集群揭秘


智汇华云 | RabbitMQ集群揭秘


少数方停止,多数方继续对外服务,网络恢复之后,erlang集群恢复正常,ping通过,执行rabbit:start启动服务。

 

程序逻辑看上去没有问题,但是实际使用中,经常会报出集群脑裂,少数方也开始对外提供服务了

 

经过调查,发现是当少数方等待集群回复正常的期间,被systemctl restart了,导致erlang虚拟机重启,而rabbitmq在erlang重启的时候不会认为自己是少数方,就开始对外服务了。


之后网络分区恢复,就出现了mnesia数据库不一致

 

所以在使用pause_minority模式时,不能随意重启rabbitmq-server,程序会在分区恢复的时候自动对外服务

 

另外pause_minority也不适用于双节点集群,还有不能让电脑休眠,大家想想是为什么呢?

 

模式的选择使用参考

 


Rabbitmq集群未来


Rabbitmq 4.0版本中预计会引入mnevis(mnesia分布式数据库的raft版本)。

An update from the RabbitMQ team (version 3.8)

 

利用Raft共识算法从数据库层面解决网络分区导致的数据一致性问题。


实验性的测试版本在:

https://github.com/rabbitmq/mnevis

https://github.com/rabbitmq/rabbitmq-server/tree/mnevis-experimental


感兴趣的可以自己玩玩看。最后问一下使用了Raft共识算法的Rabbitmq集群是CAP中的哪种呢?


相关阅读



点击原文链接,了解华云数据更多信息