1.集群的目的
- 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
- 通过增加更多的节点来扩展消息通信的吞吐量
2.修改.erlang.cookie文件,RabbitMQ集群通信是建立在Erlang通信上的,Erlang通信是通过.erlang.cookie文件通信的
- 修改主机hosts文件
- vim /etc/hosts
- 关闭防火墙,这里就不废话了。。。
- 之后两个机器相互ping通就OK了
- 搭建RabbitMQ集群需要把Erlang Cookie文件修改为相同的
- 该文件在home目录下让两台机器上的.erlang.cookie文件相同,为了防止出错,直接覆盖另一个机器上(rabbitmq02)的.erlang.cookie文件
- 用跨ip复制命令,-r表示要复制的文件下有多个子文件
- scp -r .erlang.cookie root@xxx.xxx.xxx.131:/root
- 修改完后,重启服务器。
3.搭建集群RabbitMQ集群
- 启动两台机器上的RabbitMQ服务
- rabbitmq-server -detached,用ps -ef|grep rabbitmq查看下就行了
- 查看各服务器的集群状态使用命令
- rabbitmqctl cluster_status
-
rabbimtq01
目前只有一个节点。
-
rabbitmq02
目前只有一个节点
-
添加(join)节点
-
现在要将rabbitmq02 join到节点rabbitmq01上。在rabbitmq02上执行
-
rabbitmqctl stop_app
-
rabbitmqctl join_cluster rabbit@rabbitmq01 //rabbit@rabbitmq01为rabbitmq01集群的名字,在rabbitmq01上查看rabbitmq01集群的名字
-
rabbitmqctl start_app
-
操作完成之后如上图,启动rabbitmq02服务
-
再次查看服务器的集群状态,使用命令:rabbitmqctl cluster_status
-
服务器rabbitmq01:
服务器rabbitmq02:
到此rabbitmq集群搭建完成
解释:
Erlang集群
rabbitmqctl首先会启动erlang节点,然后会从erlang分布式系统尝试连接RabbitMQ,而这时候需要erlang cookie和合适的节点名称,erlang节点通过交换作为秘密令牌的erlang cookie以获得认证,.erlang.cookie中存储的就是此令牌信息,所以集群所以erlang节点的erlang.cookie令牌信息必须一致
由于RabbitMQ的集群依赖erlang的集群,所以需要构建erlang集群,erlang集群之间是通过magic cookie实现的,这个cookie存放在$HOME/.erlang.cookie,随便选取一个节点的cookie复制到另外两个节点使三台保持一致
scp .erlang.cookie root@rabbitmq02:/root
设置好之后即可重启rabbitmq
如果需要将rabbitmq02作为内存节点与rabbitmq01连接起来,则在rabbitmq02上执行以下命令
- rabbitmqctl stop_app
- rabbitmqctl join_cluster --ram rabbit@rabbitmq01
- rabbitmqctl start_app
其中--ram代表是内存节点,如果希望是磁盘节点则不用加--ram,在rabbitmq集群中,至少需要一个磁盘节点
然后可以使用ip:15672即可访问,可以查看到三台节点的信息
集群节点可以是两种类型: 磁盘节点(Disc Node) 或 内存节点(RAM Node).磁盘节点会在RAM和磁盘中复制数据, 通过冗余可以防止节点失效事件,并可从断电这种全局事件中进行恢复. RAM节点只在RAM中复制数据(除了队列的内容外,还依赖于队列是否是持久化的或者内容对于内存来说是否过大) ,并主要用于可伸缩性. RAM节点只有当管理资源(如,增加/删除队列,交换机,或绑定)的时候才具有更高的性能.一个集群必须至少有一个磁盘节点,通常来说还不止一个.
默认情况下,节点是磁盘节点.如果你想要创建内存节点,需要提供--ram 标志
rabbitmq命令详解参考
- https://www.cnblogs.com/wuzhiyuan/p/6856985.html
- http://www.blogjava.net/qbna350816/archive/2016/07/30/431394.html
- http://www.rabbitmq.com/man/rabbitmqctl.1.man.html
如果在加入集群的时候没有指定内存节点(RAM Node),可以使用命令将某个RabbitMQ节点修改为内存节点
修改节点为ram模式
- rabbitmqctl stop_app
- rabbitmqctl change_cluster_node_type ram
- rabbitmqctl start_app
- rabbitmqctl cluster_status
退出集群
- rabbitmqctl stop_app
- rabbitmqctl reset
- rabbitmqctl start_app
注意事项
- cookie在所有节点上必须完全一样,同步时一定要注意。
- Erlang是通过主机名来连接服务的,必须保证各个主机名之间可以ping通。可以通过编辑/etc/hosts来手工添加主机名和IP对应关系。如果主机名ping不通,rabbitmq服务启动会失败。
- 如果queue是非持久化queue,则如果创建queue的那个节点失败,发送方和接收方可以创建同样的queue继续运作。但如果是持久化queue,则只能等创建queue的那个节点恢复后才能继续服务。
- 在集群元数据有变动的时候需要有disk node在线,但是在节点加入或退出的时候所有的disk node必须全部在线。如果没有正确退出disk node,集群会认为这个节点当掉了,在这个节点恢复之前不要加入其它节点。
- RabbitMQ只要求集群中至少有一个磁盘节点,其他节点都可以是内存节点。当节点加入或者离开集群时,它们必须要将变更通知到至少一个磁盘节点。如果只有一个磁盘节点,磁盘节点奔溃后,集群可以继续路由消息(即保持运行),但是直到该节点恢复之前,无法更改任何东西。通常在集群中设置两个磁盘节点
- cluster中的node可以被随意的停止和启动,他们并不影响cluster中的其他node的运行,node重启后会自动的和cluster中的其他node进行联系的。当cluster不能工作时,最后一个失效的node必须是重建后第一个开始工作的node,如果这种情况不满足,则所有的node则会为最后一个disk node的恢复等待30秒,如果最后一个失效的node无法重新工作,我们需要通过命令将其从cluster中移除。