相关概念
RabbitMQ集群里有内存节点
与磁盘节点
。
内存节点
(ram),就是将元数据(metadata)都放在内存里,磁盘节点
(disc),数据放在磁盘上,如果RabbitMQ是单节点运行,默认就是磁盘节点。
在RabbitMQ集群里,至少有一个磁盘节点,它用来持久保存元数据。新的节点加入集群后,会从磁盘节点上拷贝数据。但是,集群里也不必要每个节点都是磁盘节点,这主要是性能问题。例如,压力大的RPC服务,每秒都要创建和销毁数百个队列,如果集群里都是磁盘节点,意味着队列定义在每个节点上,都要写入磁盘才算成功,这样就会非常慢。
什么是镜像集群?
普通集群默认情况下,RabbitMQ集群中队列的内容存在于单个节点(声明该队列的节点)上,集群中的队列仅仅是结构相同,而镜像集群不仅结构相同,数据也可以同步。
每个镜像队列由一个主服务器和一个或多个镜像组成。对队列的所有操作首先应用于队列的主节点,然后传播到镜像的其他节点;已在主服务器上确认的消息,镜像都会丢弃。因此,队列镜像可提高可用性,但不会在节点之间分配负载。
如何实现镜像集群?
有4种方式实现,这里使用第一种。
在任意一个cluster中的节点下执行下面格式的语句进行构建镜像集群。
rabbitmqctl set_policy ha-nodes “^nodes.” ‘{“ha-mode”:“nodes”,“ha-params”:[“rabbit@nodeA”, “rabbit@nodeB”],“ha-sync-mode”:“automatic”}’
ha-nodes
:策略名称;
^nodes\.
:匹配符,匹配名字前缀是“nodes.”的queues and exchanges;
ha-mode
:为匹配类型,分为3种模式,all-所有(所有的queue,不需要需配置ha-params参数);exactly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器);nodes-指定(需配置ha-params参数,是node名字的集合,例如 “ha-params”:[“rabbit@nodeA”, “rabbit@nodeB”]})。
ha-sync-mode
:分为两种模式,manual/automatic;手动模式(manual默认模式:表示新的队列镜像将不会接收已有消息,只会接收新消息;自动(automatic):加入新镜像后,队列将自动同步。需要注意的是,队列同步是一项阻塞操作。
如何判断镜像集群?
通过管理UI的队列界面上可以看到策略名称和旁边的其他副本(镜像)数。
[root@node1 ~]# rabbitmqctl set_policy ha-two “^” \ ‘{“ha-mode”:“nodes”,“ha-params”:[“rabbit@node2”],“ha-sync-mode”:“automatic”}’
执行下面这句之后
[root@node1 ~]# rabbitmqctl set_policy ha-two “^” \ ‘{“ha-mode”:“nodes”,“ha-params”:[“rabbit@node1”,“rabbit@node2”],“ha-sync-mode”:“automatic”}’