集群
介绍
RabbitMQ 的集群分为两种模式,一种时默认集群模式,另一种时镜像集群模式;在 RabbitMQ 集群中所有节点(一个节点就是一个 RabbitMQ 的 Borker 服务器)被归为两类:内存结点和磁盘节点
磁盘节点:它会把集群的所有信息(交换机、绑定、队列等信息)持久化到磁盘中
内存结点:它会把集群的所有信息保存到内存中,加入此时服务器宕机或者重启内存节点会全部丢失
默认集群模式
默认集群模式别称普通集群模式、内置集群模式
默认集群模式只会把交换机、队列、虚拟主机等元数据信息在各个节点同步;而具体队列中的消息内容不会再各个节点中同步

元数据
队列元数据:队列名称和属性(是否可持久化是否自动删除)
交换机元数据:交换机名称、类型和属性
绑定元数据:交换机和队列的绑定列表
vhost元数据:vhost内的相关属性,如安全等
集群中队列的具体信息数据只在队列的拥有者节点保存,其他队列只知道队列的元数据和指向该节点的指针。所起其他节点接收到不属于该节点队列的消息时会将该消息传递给该队列的拥有者节点上
好处:节省磁盘空间、性能
坏处:当某一个节点突然宕机了,那么该节点上的信息数据由于不会同步那么就会造成暂时不可用
镜像集群模式
镜像集群模式和默认集群模式相像,但是镜像集群模式会把信息数据也给同步过来,这样当某一台节点突然宕机了也不会造成消息暂时不可用
搭建集群
假设现在有两台(A和B)服务器,搭建集群需要保证这两台服务器的 .erlang.cookie
文件内容保持一致,如果使用解压缩的方式安装RabbitMQ那么这个文件会在 ${用户名}
目录下也就是 ${用户名}/.erlang.cookie
,Docker安装的话也是在这个目录内;如果使用 rpm
的方式安装,那么这个文件会在 /var/lib/rabbitmq
目录下
注意:
.erlang.cookie
文件的权限为400且集群之间文件内容必须一致
启动机器,使用 rabbitmqctl cluster_status
命令查看集群的状态
开始搭建集群:
- 首先停止B节点
rabbitmqctl stop_app
这个只停止rabbitmq但是不会停止erlang
虚拟机 - 然后使用
rabbitmqctl reset
命令把该节点的虚拟机、队列、交换机重置 - 再使用
rabbitmqctl join_cluster [节点] [--ram]
向A节点添加B节点(节点名可以使用rabbitmqctl cluster_status
查看,后面的ram
参数表示添加的这个节点是一个内存节点,默认时 disk 磁盘节点) - 最后再使用
rabbitmqctl start_app
开启这个节点即可
Docker 搭建
正常的拉取镜像然后创建容器:
# 创建首节点
docker run -d --name rabbitmq --hostname rabbitmq -p 5672:5672 -p 15672:15672 -v /tools/rabbitmq:/var/lib/rabbitmq rabbitmq
# 创建附节点
docker run -d --name rabbitmq-1 --hostname rabbitmq-1 -p 5673:5672 -p 15673:15672 --link rabbitmq:rabbitmq rabbitmq
参数详解:
- -d:表明再后台运行
- --name:指定容器名
- --hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)
- -p:指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号),控制台端口用于管理rabbitmq,应用访问端口号为rabbitclient等应用访问
- -v:映射目录或文件
- --link:用于容器之间的链接,可以有多个
创建完成容器之后进入一个容器内去完成搭建集群的操作;节点可以通过再容器内使用命令 rabbitmqctl cluster_status
得到