rabbitmq单机模式、集群、镜像集群+负载均衡

RabbitMQ 有 3 种运行模式,集群模式有 2 种。详细如下:

单机模式:

即单机情况不做集群,就单独运行一个 RabbitMQ 而已。

普通模式:

默认模式,以两个节点(node-1、node-2)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 node-1(或者 node-2),node-1 和 node-2 两个节点仅有相同的元数据,即队列的结构。当消息进入 node-1 节点的 Queue 后,consumer 从 node-2 节点消费时,RabbitMQ 会临时在 node-1、node-2 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 node-1 或 node-2,出口总在 node-1,会产生瓶颈。当 node-1 节点故障后,node-2 节点无法取到 node-1 节点中还未消费的消息实体。如果做了消息持久化,那么得等 node-1 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

镜像模式:

一般配合HAProxy配置为高可用集群,把需要的队列做成镜像队列,存在与多个节点属于 RabbitMQ 的 HA 方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。

http://1987.name/1730.html

主从集群的不足: 默认情况下,队列只位于主节点上,尽管他们可以从所有节点看到和访问,也就是说整个集群与主节点共存亡。
因此,当主节点宕机时,无法进行自动的故障转移,下面的队列镜像集群可以解决这个问题。

1、镜像集群
镜像集群的特点:所有节点的消息都会进行同步。RabbitMQ是没有中心的。

镜像集群就是在主从集群的基础上,添加相应策略,将主节点消息队列中的信息备份到其它节点上,主节点宕机时,对整个集群不产生影响,使集群可以高可用。

添加策略(可以在创建队列之前添加,也可以创建队列之后添加)

参考官方文档: https://www.rabbitmq.com/parameters.html#policies

Rabbit镜像功能,需要基于rabbitmq策略来实现,政策是用来控制和修改群集范围的某个vhost队列行为和Exchange行为,在cluster中任意节点启用策略,策略会自动同步到集群节点。

策略的修改可以通过命令也可以通过WEB,如果我是通过WEB来修改的,非常简单。
Pattern:“^” 表示所有匹配所有队列名称。”^log” 是指同步”log”开头的队列名称。
ha-mode:“all”代表同步到所有节点。

镜像队列是用于节点之间同步消息的机制,避免某个节点宕机而导致的服务不可用或消息丢失,且针对排他性队列设置是无效的。另外很重要的一点,镜像队列机制不是负载均衡

2、启动2个rabbitmq容器
1、节点一启动命令

1
2
3
4
docker run -d --hostname node1 --name rabbitmq-01 -p 15672:15672 \
-p 5672:5672 -e RABBITMQ_DEFAULT_USER=rabbitmq -e \
RABBITMQ_DEFAULT_PASS=rabbitmq -e RABBITMQ_ERLANG_COOKIE='aabbccddeeffgg' \
-v rabbitmq-01:/var/lib/rabbitmq rabbitmq:3.8.0-management

2、节点二启动命令

1
2
3
4
5
docker run -d --hostname node2 --name rabbitmq-02 -p 15673:15672 \
-p 5673:5672 -e RABBITMQ_DEFAULT_USER=rabbitmq \
-e RABBITMQ_DEFAULT_PASS=rabbitmq \
-e RABBITMQ_ERLANG_COOKIE='aabbccddeeffgg' --link rabbitmq-01:node-1 \
-v rabbitmq-02:/var/lib/rabbitmq rabbitmq:3.8.0-management

3、将 node2 加入到 node1 集群中
1、node1 下执行如下命令

1
2
3
4
docker exec -it rabbitmq-01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

2、node2 下执行如下命令

1
2
3
4
5
docker exec -it rabbitmq-02 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@node1
rabbitmqctl start_app

4、配置镜像队列
在任何一个节点上执行如下命令:

1
rabbitmqctl set_prolich ha-all "^" '{"ha-mode":"all"}'

表示在默认的vhout(/)上队列/交换机/绑定等数据都是同步的。

5、镜像队列配置规则参考
https://www.rabbitmq.com/ha.html

参考地址:

https://blog.csdn.net/fu_huo_1993/article/details/102986327

https://www.jianshu.com/p/3924357da9a0

https://blog.csdn.net/fqydhk/article/details/80624547

https://www.cnblogs.com/yloved/p/12868892.html

-------------本文结束-------------
0%