简介
本文介绍RabbitMQ镜像队列的配置方法。
假设现在mq里有两个队列:mirror_queue和normal_queue,想为mirror_queue创建镜像队列,mornal_queue不创建镜像队列。
第1步:启动3台集群节点
略
第2步:配置镜像策略
法1:管理页面配置
按此步骤创建镜像策略,该策略为所有mirror_开头的队列创建 3个 副本镜像。
法2:命令行
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
示例:对队列名称以“mirror_”开头的所有队列进行镜像,并在集群的两个节点上完成进行:
rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue "^mirror_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
法3:HTTP API
见:Classic Queue Mirroring — RabbitMQ
PUT /api/policies/%2f/ha-two { "pattern":"^mirror_", "definition": { "ha-mode":"exactly", "ha-params":3, "ha-sync-mode":"automatic" } }
第3步:查看结果
配置完 Policy 后,创建新的队列或者原有的的队列,如果队列名称符合 Policy 的匹配规则,则该队列自动成为镜像队列,会自动为它生成副本队列。
下图中 mirror_queue 匹配第2步创建的镜像策略,为镜像队列。normal_queue 为普通队列
镜像队列显示的蓝色 +2 表示同步副本数为 2 个。
mirror-policy 为该队列应用的镜像策略。
点击队列名称可以进入查看队列详细信息,从中可以看出队列的主节点、从节点和镜像策略:
命令行配置参数详解
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
参数
-p Vhost: 可选参数,针对指定vhost下的queue进行设置 Name: policy的名称 Pattern: queue的匹配模式(正则表达式) Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes all:表示在集群中所有的节点上进行镜像 exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定 nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定 ha-params:ha-mode模式需要用到的参数 ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual priority:可选参数,policy的优先级
镜像策略
ha-mode | ha-params | 结果 |
exactly | count | 集群中队列副本的数量(主队列加上镜像)。count值为1表示一个副本:只有主节点。如果主节点不可用,则其行为取决于队列是否持久化。count值为2表示两个副本:一个队列主队列和一个队列镜像。换句话说:“镜像数=节点数-1”。如果运行队列主服务器的节点变得不可用,队列镜像将根据配置的镜像提升策略自动提升到主服务器。如果集群中的可用节点数少于count,则将队列镜像到所有节点。如果集群中有多个计数节点,并且一个包含镜像的节点宕机,那么将在另一个节点上创建一个新镜像。使用’ exactly ‘模式和’ ha-promot-on-shutdown ‘: ’ always ‘可能是危险的,因为队列可以跨集群迁移,并在停机时变得不同步。 |
all | 不设置 | 表示在集群中所有的节点上进行镜像。这个设置非常保守。建议设置的副本值为大多数节点N / 2 + 1。镜像到所有节点会给所有集群节点带来额外的负担,包括网络I/O、磁盘I/O和磁盘空间的使用。 |
nodes | 节点名称 | 队列被镜像到节点名中列出的节点。节点名是在rabbitmqctl cluster_status中出现的Erlang节点名;它们的形式通常是“rabbit@hostname”。如果这些节点名中有任何一个不是集群的一部分,则不构成错误。如果在声明队列时列表中的节点都不在线,则将在声明客户机连接的节点上创建队列。 |
新镜像同步策略
ha-sync-mode | 说明 |
---|---|
manual | 这是默认模式。新队列镜像将不接收现有消息,它只接收新消息。一旦使用者耗尽了仅存在于主服务器上的消息,新的队列镜像将随着时间的推移成为主服务器的精确副本。如果主队列在所有未同步的消息耗尽之前失败,则这些消息将丢失。您可以手动完全同步队列,详情请参阅未同步的镜像部分。 |
automatic | 当新镜像加入时,队列将自动同步。值得重申的是,队列同步是一个阻塞操作。如果队列很小,或者您在RabbitMQ节点和ha-sync-batch-size之间有一个快速的网络,那么这是一个很好的选择。 |
从节点晋升策略
镜像队列主节点出现故障时,最老的从节点会被提升为新的主节点。如果新提升为主节点的这个副本与原有的主节点并未完成数据的同步,那么就会出现数据的丢失,而实际应用中,出现数据丢失可能会导致出现严重后果。
rabbitmq 提供了 ha-promote-on-shutdown,ha-promote-on-failure 两个参数让用户决策是保证队列的可用性,还是保证队列的一致性;两个参数分别控制正常关闭、异常故障情况下从节点是否提升为主节点,其可设置的值为 when-synced 和 always。
ha-promote-on-shutdown /ha-promote-on-failure | 说明 |
when-synced | 从节点与主节点完成数据同步,才会被提升为主节点 |
always | 无论什么情况下从节点都将被提升为主节点 |
主队列选择策略
RabbitMQ中的每个队列都有一个主队列。该节点称为队列主服务器。所有队列操作首先经过主队列,然后复制到镜像。这对于保证消息的FIFO排序是必要的。
通过在策略中设置 queue-master-locator 键的方法可以定义主队列选择策略,这是常用的方法。
此外,也可以用队列参数 x-queue-master-locator 或配置文件中定义 queue_master_locator 的方式指定,此处不再赘述。
下面是该策略的可选参数列表
queue-master-locator | 说明 |
min-masters | 选择承载最小绑定主机数量的节点 |
client-local | 选择客户机声明队列连接到的节点 |
min-masters | 随机选择一个节点 |
请先
!