【高可用篇】
做高可用的目的:允许个别节点崩溃的情况下继续平稳运行,可以通过动态扩容来增加吞吐量。
RabbitMQ的Cluster集群分为两种情况:普通集群模式 和 镜像模式;
一、普通模式
默认的集群模式,以两个rabbit01和rabbit02为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01,rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的queue后,如果consumer从rabbit02节点进行消费,broker会临时在rabbit01和rabbit02之间进行消息传输,把rabbit01节点的消息实体取出后,经过rabbit02发送给consumer。所以consumer应尽量连接每一个节点,从中拉取消息。
上述过程存在一个明显的缺点,即consumer无论是连接rabbit01还是rabbit02,如果入口总是在rabbit01,那么瓶颈就在rabbit01上面,如果rabbit01挂掉的话,则会造成消费者无法消费到消息,此类问题属于单节点依赖问题。
要避免该模式的缺陷,合理的方式是对于同一个逻辑队列,在多个节点建立物理Queue,从而避免掉单节点的依赖问题。
二、镜像模式
将需要消费的队列变为镜像队列,存在于多个节点,这样就实现了HA,消息实体会主动在镜像节点之间同步,而不像普通模式那样,在consumer消费时才临时读取。
镜像模式的缺点就是在集群内部的同步通讯会占用额外的带宽。
三、设置镜像模式
设置镜像队列的命令:“rabbitmqctl set_policy 名称 匹配模式(正则) 镜像定义”
例如:rabbitmqctl set_policy hapolicy "^" '{"ha-mode":"exactly","ha-params":2}'
可以看出,设置镜像模式一共需要三个参数,参数之间用空格分割
四、镜像参数解读
1 参数一:hapolicy 代表策略名称,内容自定义;
2 参数二:"^" 队列名称的匹配规则,使用正则表达式表示,^代表匹配所有;
3 参数三:为镜像队列的主体规则,是个json字符串,分为三个属性,ha-mode | ha-params | ha-sync-mode,详细解释如下:
ha-mode:镜像模式,分类:all/exactly/nodes,all存储在所有节点;exactly存储x个节点,节点的个数由ha-params指定;nodes指定存储的节点上名称,通过ha-params指定;
ha-params:作为参数,为ha-mode的补充;
ha-sync-mode:镜像消息同步方式:automatic(自动),manually(手动);