本文将系统的介绍一下RabbitMQ集群架构的特色、异常处理、搭建和使用中要注意的一些细节。html
知识点node
1、为何使用集群?正则表达式
2、集群的特色docker
3、集群异常处理json
4、集群节点类型安全
5、集群搭建方法bash
6、镜像队列服务器
内建集群做为RabbitMQ最优秀的功能之一,它的做用有两个:cookie
RabbitMQ的集群是由多个节点组成的,但咱们发现不是每一个节点都有全部队列的彻底拷贝。网络
RabbitMQ节点不彻底拷贝特性
为何默认状况下RabbitMQ不将全部队列内容和状态复制到全部节点?
有两个缘由:
因此其余非全部者节点只知道队列的元数据,和指向该队列节点的指针。
根据节点不无安全拷贝的特性,当集群节点崩溃时,该节点队列和关联的绑定就都丢失了,附加在该队列的消费者丢失了其订阅的信息,那么怎么处理这个问题呢?
这个问题要分为两种状况:
节点的存储类型分为两种:
磁盘节点就是配置信息和元信息存储在磁盘上,内次节点把这些信息存储在内存中,固然内次节点的性能是大大超越磁盘节点的。
单节点系统必须是磁盘节点,不然每次你重启RabbitMQ以后全部的系统配置信息都会丢失。
RabbitMQ要求集群中至少有一个磁盘节点,当节点加入和离开集群时,必须通知磁盘节点。
若是集群中的惟一一个磁盘节点,结果这个磁盘节点还崩溃了,那会发生什么状况?
若是惟一磁盘的磁盘节点崩溃了,不能进行以下操做:
总结:若是惟一磁盘的磁盘节点崩溃,集群是能够保持运行的,但你不能更改任何东西。
解决方案: 在集群中设置两个磁盘节点,只要一个能够,你就能正常操做。
本章咱们用Docker来建立RabbitMQ集群,一来是由于操做简便,二是由于能够更充分的利用服务器硬件资源,三来是Docker也是如今的主流部署方案,关于更多的Docker详情能够查看个人另外一篇:《使用Docker部署RabbitMQ集群)》 接下来,进入咱们的正文,集群搭建分为两步:
docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
复制代码
具体的参数含义,参见上文“启动RabbitMQ”部分。
注意点:
设置节点1:
docker exec -it myrabbit1 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit
设置节点2,加入到集群:
docker exec -it myrabbit2 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit1 rabbitmqctl start_app exit
参数“--ram”表示设置为内存节点,忽略次参数默认为磁盘节点。
设置节点3,加入到集群:
docker exec -it myrabbit3 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbit1 rabbitmqctl start_app exit
设置好以后,使用http://物理机ip:15672 进行访问了,默认帐号密码是guest/guest,效果以下图:
到此为止,咱们已经完成了RabbitMQ集群的创建,启动了3个节点,1个磁盘节点和2个内存节点。
若是你想更换节点类型能够经过命令修改,以下:
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type dist
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
若是想要把节点从集群中移除,可以使用以下命令实现:
rabbitmqctl stop_app
rabbitmqctl restart
rabbitmqctl start_app
集群重启的顺序是固定的,而且是相反的。 以下所述:
最后关闭必须是磁盘节点,否则可能回形成集群启动失败、数据丢失等异常状况。
镜像队列是Rabbit2.6.0版本带来的一个新功能,容许内建双活冗余选项,与普通队列不一样,镜像节点在集群中的其余节点拥有从队列拷贝,一旦主节点不可用,最老的从队列将被选举为新的主队列。
镜像队列的工做原理: 在某种程度上你能够将镜像队列视为,拥有一个隐藏的fanout交换器,它指示者信道将消息分发到从队列上。
设置镜像队列命令:“rabbitmqctl set_policy 名称 匹配模式(正则) 镜像定义”, 例如,设置名称为mypolicy的镜像队列,匹配全部名称是amp开头的队列都存储在2个节点上的命令以下:
rabbitmqctl set_policy mypolicy "^amp*" '{"ha-mode":"exactly","ha-params":2}'
能够看出设置镜像队列,一共有三个参数,每一个参数用空格分割。
设置好镜像队列存储2个节点的效果以下图:
rabbitmqctl list_policies
rabbitmqctl clear_policy
书籍:《RabbitMQ实战-高效部署分布式消息队列》——不建议程序猿购买,偏运维 www.cnblogs.com/luo-mao/p/5… www.jianshu.com/p/85543491a…
长按二维码,关注更多做者动态