一、背景在上一章中,我们学习了如何搭建单节点的RabbitMQ服务器,但是单节点的RabbitMQ是不可靠的。如果单个节点挂了,会导致消息队列不可用。这里我们搭建一个3节点的RabbitMQ集群来解决这个问题。二、RabbitMQ集群介绍1.集群类型RabbitMQ集群默认是只同步元数据(metadata),不同步队列中的消息,这也是不安全的。需要配置成镜像队列,这样数据也可以冗余到其他节点,从而保证一个节点挂了,也可以对外提供服务。元数据:指队列信息、交换机信息、绑定信息等。2、节点名的重要性在集群中,节点名必须是唯一的,集群通过节点名连接。3、erlangcookie的重要性什么是用来对集群节点进行认证,使得集群节点之间可以相互通信的,这就依赖于erlangcookie,所以集群中erlangcookie的值必须保持一致。1、erlangcookie文件的位置对于不同的操作系统是不同的。这个位置一般在/var/lib/rabbitmq/.erlang.cookie。2.erlangcookie文件的权限。erlang.cookie的文件权限一般设置为600,不要设置得太高或太低,否则可能导致集群启动失败。4.集群节点类型RabbitMQ集群分为磁盘节点和内存节点。1、磁盘节点的所有数据都存储在磁盘上。2、内存节点的数据存储在内存中,但不是所有的数据都存储在内存中,例如:消息只存在于索引中等。3、至少需要一个磁盘(disc)节点在一个集群中。5.加入集群的节点新加入集群的节点必须是全新的节点,不能携带数据。如果存在,则需要在加入集群的节点上执行rabbitmqctlreset。3、搭建RabbitMQ集群这里使用三台Centos7服务器搭建RabbitMQ集群。hostnameipaddressnodetypeusernamepasswordmanagementportamqpportcentos01192.168.56.101磁盘节点(disk)adminadmin156725672centos02192.168.56.102磁盘节点(disk)adminadmin156725672centos03192.168.56.103内存节点(ram)adminadmin156725配置所有服务器可以访问他们各自的主机名。所有三台服务器都需要执行此操作。vim/etc/hostsbash192.168.56.101centos01192.168.56.102centos02192.168.56.103centos032.同步各个节点的erlangcookies。然后就可以启动一个RabbitMQ节点,然后将它复制过去。在复制过程中,需要保证RabbitMQ节点最好不要启动。在centos01服务器上运行scp/var/lib/rabbitmq/.erlang.cookieroot@192.168.56.102:/var/lib/rabbitmq/.erlang.cookiescp/var/lib/rabbitmq/.erlang.cookieroot@192.168.56.103:/var/lib/rabbitmq/.erlang.cookie3.创建集群1.在centos01服务器上运行rabbitmq-server-detached查看日志文件/var/log/rabbitmq/rabbit\@centos01.log是否启动成功。2.释放集群通信端口等firewall-cmd--zone=public--add-port=5672/tcp--permanentfirewall-cmd--zone=public--add-port=15672/tcp--permanentfirewall-cmd--zone=public--add-port=4369/tcp--permanentfirewall-cmd--zone=public--add-port=25672/tcp--permanent3,centos02加入centos01rabbitmq-server-detachedrabbitmqctlstop_apprabbitmqctlresetrabbitmqctljoin_clusterrabbit@centos01start_mqapp4,centos03加入centos02rabbitmq-server-detachedrabbitmqctlstop_apprabbitmqctlresetrabbitmqctljoin_clusterrabbit@centos02--ramrabbitmqctlstart_app5,检查集群是否搭建完成6、移除centos03集群1、停止需要移除的节点rabbitmqctlstop2,在另一个启动的节点上执行rabbitmqctlforget_cluster_noderabbit@centos033,重新加入集群时,启动时可能会报如下错误:“Noderabbit@centos03thinksit'sclusteredwithnoderabbit@centos02,butrabbit@centos02disagree”这时候我们需要删除rm-rvf/var/lib/rabbitmq/mnesia/这个目录,然后再次执行加入集群的命令。rabbitmq-server-detachedrabbitmqctlstop_apprabbitmqctlresetrabbitmqctljoin_clusterrabbit@centos02--ramrabbitmqctlstart_app四、配置镜像集群1、普通集群以上步骤形成的集群为普通集群,但是队列中的元数据是共享的,队列中的数据队列专门保存到一个节点。这不足以实现高可用性。如果节点挂了,这个队列中的数据就不能被消费,也不能向这个队列发送数据。所以如果解决这个问题,答案就是使用镜像队列集群。2.镜像队列集群默认虚拟主机(/)中的所有队列都配置为镜像队列。(ha-all只是取的名字)rabbitmqctlset_policy--vhost/ha-all"^"'{"ha-mode":"all"}'创建镜像队列后发现该队列存在于all节点。镜像队列的高级用法,参考官方文档https://www.rabbitmq.com/ha.html五、参考文档1、RabbitMQ官方集群搭建2、镜像队列的使用
