RabbitMQ 的集群架构模式主要有四种,分别是主备模式、远程模式、多活模式和镜像模式,本篇博客将依次介绍这四种架构模式,其中的镜像模式使用范围最广,我们将对其进行重点介绍。


主备模式

主备模式是指,主节点负责提供读写服务,从节点只负责提供备份服务,当主节点宕机时,备份节点会自动切换为主节点提供读写服务。

如上图所示,在主备架构模式下,我们使用 HaProxy 进行健康检测和负载均衡,也就是说,主备切换由 HaProxy 完成,对于 Consumer 消费端来说是完全透明的。这里需要注意的是,主备模式和我们经常提起的主从模式是不一样的,主从模式中的从节点并不是用来备份的,它会提供只读服务。

一般在并发和数据量不高的情况下多使用这种架构模式,简单好用,易于维护。

Haproxy 配置如下

需要特别关注的是图中关于 server 的配置:

第一行是配置主节点,第二行的 backup 表明是对备份节点的配置。

inter 5000 rise 2 fall 2 则表示:每隔 5 秒对 MQ 集群做一次健康检查, 2 次正确证明服务可用,2 次失败证明服务器不可用;


远程模式

远程模式就是一种实现双活的模式,简称 shovel 模式,能够让消息在不同数据中心之间进行复制,可以跨地域的让两个 MQ 集群互联,从而实现远距离通信。

如图所示,有两个异地的 MQ 集群(可以是更多的集群),当用户在地区 1 下单,系统发消息到 1 区的 MQ 服务器,发现 MQ 服务已超过设定的阈值,负载过高,这条消息就会被转到地区 2 的 MQ 服务器上,由 2 区的 MQ 服务器去执行后面的业务逻辑,相当于分摊了 1 区的服务压力。

它是 RabbitMQ 比较早期的架构模型,现在很少使用了,在这里不做过多介绍,了解即可。


多活模式

多活模式是实现异地数据复制的主流模式,因为 shovel 模式配置比较复杂,实现异地集群多采用这种模式。


如上图所示,在多活模式的每个数据中心中,都会各部署一套 RabbitMQ 集群,集群中的各个节点数据是一样的,通过镜像队列来保证数据一致性。不同数据中心的数据复制则需要依赖 RabbitMQ 的 Federation 插件来完成,Federation 插件可以实现持续可靠的 AMQP 数据通信。

Federation 插件是一个不需要构建 Cluster ,可以直接在 Brokers 之间传输消息的高性能插件。当它在 Brokers 或者 Cluster 之间传输消息时,连接的双方可以使用不同的 users 和 virtual hosts,甚至可以使用不同版本的 RabbitMQ 和 Erlang。

Federation 插件使用 AMQP 协议进行通信,可以接受不连续的传输。它的通信不建立在集群上的,而是建立在单个节点上的,比如图上黄色的 node 3 就可以利用 Federation 插件与绿色的 node1、node2、node3 中的任意一个节点进行数据的同步操作。

Federation 插件配置过程可以参考如下博客:

https://blog.csdn.net/yisuyanyu/article/details/106055000


镜像模式

镜像模式(Mirror)是一个非常经典的集群模式,它能保证 100% 数据不丢失,在实际工作中使用广泛,而且实现简单,互联网大厂一般都会使用这种模式来构建集群,所以本篇博客会以这个模式为重点进行详细介绍。

镜像模式实际上就是在主备模式的基础上进行了扩展,集群中所有的节点设备都是同步的。

消息的发布与消费都是通过 master 节点完成的,master 节点对消息进行处理的同时会将消息的处理动作广播给所有的 slave 节点,slave 节点收到消息后,通过回调交由 mirror_queue_slave进行实际处理。

镜像模式流程

程序(Springboot Application)通过访问 KeepAlived 提供的 VIP(虚拟 ip)指定到其中一个Haproxy,然后 Haproxy 将访问请求代理到其管理的多个 Rabbitmq Server 中的一个,从而实现了高可用、负载均衡的功能。

镜像集群模式搭建过程

1. 准备 5 台服务器节点用来搭建集群
如图所示,我们选择在 76 - 78 节点上安装部署对应的 RabbitMQ 服务,79 和 80 节点用来部署 Haproxy 和 Keepalived 来对 3 个消息队列节点进行负载均衡和健康检测。

2. 复制 Erlang Cookie

消息队列在启动的时候,Erlang VM 会在/var/lib/rabbitmq/目录下自动创建一个随机的 cookie 文件:.erlang.cookie。.erlang.cookie 是 Erlang 分布式的 token 文件,集群内所有设备要持有相同的.erlang.cookie 文件才允许彼此通信。

在这里,我们选择 76、77、78 任意一个节点为 Master(这里选择 76 为 Master),也就是说我们需要把76的 Cookie 文件同步到 77、78 节点上去。

进入 /var/lib/rabbitmq 目录下,把.erlang.cookie文件 copy 到 77、78 节点下:

scp /var/lib/rabbitmq/.erlang.cookie root@192.168.11.77:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.11.78:/var/lib/rabbitmq/

之后分别把 77、78 节点上的 cookie 文件权限改为 400:

chmod 400 /var/lib/rabbitmq/.erlang.cookie

3. 构建集群

启动 3 个节点上的 RabbitMQ 应用:

rabbitmq-server -detached

将 slave 加入集群(注意需要提前配置 /etc/hosts,让节点可以相互寻址到对方):

# 在 bhz77 和 bhz78 节点分别运行如下命令
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@bhz76
rabbitmqctl start_app

修改集群名称(默认为第一个 node 名称):

rabbitmqctl set_cluster_name rabbitmq_cluster1

查看集群状态:

rabbitmqctl cluster_status

查看管控台界面(访问任意一个管控台节点:http://192.168.11.77:15672 ):

设置镜像队列策略(在任意一个节点上执行):

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

安装与配置 Haproxy

1.下载依赖包

yum install gcc

2.下载 Haproxy

yum install haproxy -y

3.编辑 Haproxy 配置文件

vi /etc/haproxy/haproxy.cfg

新增 listen 内容,根据实际情况,修改 default 内容:

#logging options
globallog 127.0.0.1 local0 infomaxconn 5120chroot /usr/local/haproxyuid 99gid 99daemonquietnbproc 20pidfile /var/run/haproxy.piddefaultslog global#使用4层代理模式,”mode http”为7层代理模式mode tcpoption tcplogoption dontlognullretries 3option redispatchmaxconn 2000contimeout 5s##客户端空闲超时时间为 60秒 则HA 发起重连机制clitimeout 60s##服务器端链接超时时间为 15秒 则HA 发起重连机制srvtimeout 15s  #front-end IP for consumers and producterslisten rabbitmq_clusterbind 0.0.0.0:5672#配置TCP模式mode tcp#balance url_param userid#balance url_param session_id check_post 64#balance hdr(User-Agent)#balance hdr(host)#balance hdr(Host) use_domain_only#balance rdp-cookie#balance leastconn#balance source //ip#简单的轮询balance roundrobin#rabbitmq集群节点配置 #inter 每隔五秒对 mq 集群做健康检查,2次正确证明服务器可用,2次失败证明服务器不可用,并且配置主备机制server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 2server bhz77 192.168.11.77:5672 check inter 5000 rise 2 fall 2server bhz78 192.168.11.78:5672 check inter 5000 rise 2 fall 2#配置haproxy web监控,查看统计信息
listen statsbind *:8100mode httpoption httplogstats enable#设置 haproxy 监控路径stats uri /rabbitmq-statsstats refresh 5s

4.启动 Haproxy

haproxy -f /etc/haproxy/haproxy.cfg

至此,Haproxy 配置成功,访问:http://192.168.11.79:8100/rabbitmq-stats,就可以看到对应的监控信息了。

以上是 79 机器的安装和配置步骤,80 机器按照此步骤执行即可。

安装与配置 Keepalived

1.安装所需软件包

yum install -y openssl openssl-devel

2.下载 keepalived

wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

3.解压、编译、安装

tar -xvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make install

4.创建文件夹,将 keepalived 配置文件进行复制

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig

5.创建软连接,如果存在则进行删除

ln -s /usr/local/sbin/keepalived /usr/sbin
ln -s /usr/local/keepalived/sbin/keepalived /sbin

6.设置开机启动

chkconfig keepalived on

7.编辑 keepalived 配置文件

vi /etc/keepalived/keepalived.conf

79 节点配置如下:

! Configuration File for keepalivedglobal_defs {router_id bhz79  ##标识节点的字符串,通常为hostname
}vrrp_script chk_haproxy {script "/etc/keepalived/haproxy_check.sh"  ##执行脚本位置interval 2  ##检测时间间隔weight -20  ##如果条件成立则权重减20
}vrrp_instance VI_1 {state MASTER  ## 主节点为MASTER,备份节点为BACKUPinterface eth0 ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth0)virtual_router_id 79  ## 虚拟路由ID号(主备节点一定要相同)mcast_src_ip 192.168.11.79 ## 本机ip地址priority 100  ##优先级配置(0-254的值)nopreemptadvert_int 1  ## 组播信息发送间隔,俩个节点必须配置一致,默认1sauthentication {  ## 认证匹配auth_type PASSauth_pass bhz}track_script {chk_haproxy}virtual_ipaddress {192.168.11.70  ## 虚拟ip,可以指定多个}
}

80 节点配置如下:

! Configuration File for keepalivedglobal_defs {router_id bhz80  ##标识节点的字符串,通常为hostname}vrrp_script chk_haproxy {script "/etc/keepalived/haproxy_check.sh"  ##执行脚本位置interval 2  ##检测时间间隔weight -20  ##如果条件成立则权重减20
}vrrp_instance VI_1 {state BACKUP  ## 主节点为MASTER,备份节点为BACKUPinterface eno16777736 ## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eno16777736)virtual_router_id 79  ## 虚拟路由ID号(主备节点一定要相同)mcast_src_ip 192.168.11.80  ## 本机ip地址priority 90  ##优先级配置(0-254的值)nopreemptadvert_int 1  ## 组播信息发送间隔,俩个节点必须配置一致,默认1sauthentication {  ## 认证匹配auth_type PASSauth_pass bhz}track_script {chk_haproxy}virtual_ipaddress {192.168.1.70  ## 虚拟ip,可以指定多个}
}

8.添加执行脚本 haproxy_check.sh

vi /etc/keepalived/haproxy_check.sh

内容如下(79 和 80 一样):

#!/bin/bash
COUNT=`ps -C haproxy --no-header |wc -l`
if [ $COUNT -eq 0 ];then/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfgsleep 2if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];thenkillall keepalivedfi
fi

9.赋予脚本执行权限

chmod +x haproxy_check.sh

10.启动 keepalived

service keepalived start

至此,镜像模式的高可用架构搭建完成。


本篇博客参考了以下内容,非常感谢:

https://www.jianshu.com/p/588e1c959f03
https://www.jianshu.com/p/5b2879fba25b

消息队列专题(架构篇):RabbitMQ 的集群架构模式相关推荐

  1. 【分布式应用】消息队列之卡夫卡 + EFLFK集群部署

    文章目录 前言 一.Zookeeper 概述 1.1 Zookeeper 定义 1.2 Zookeeper 工作机制 1.3 Zookeeper 特点 1.4 Zookeeper 数据结构 1.5 Z ...

  2. RabbitMQ分布式集群架构

    RabbitMQ分布式集群架构和高可用性(HA) (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配 ...

  3. mysql 集群架构_mysql企业常用集群架构

    转自 https://blog.csdn.net/kingice1014/article/details/76020061 1.mysql企业常用集群架构 在中小型互联网的企业中.mysql的集群一般 ...

  4. DAY 75 【分布式应用】消息队列之卡夫卡 + EFLFK集群部署

    pache公司的软件包官方下载地址:archive.apache.org/dist/ 注:kafka从3.0版本之后,不再依赖zookeeper Zookeeper 概述 官方下载地址:https:/ ...

  5. 【菜鸟教程】Kafka消息队列入门上(安装、集群搭建、基本命令行操作)

    概述 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 什么是消息队列呢? 例如在网站注册时,一般是同步的,当接收到 ...

  6. 消息中间件—RabbitMQ(集群原理与搭建篇)

    一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本身的可靠性.并发性.吞吐量和消息堆积能力等问题的考虑,在生产 ...

  7. RocketMQ一:快速入门和集群架构

    文章目录 RocketMQ快速实战和集群架构 RocketMQ快速实战 下载安装 快速运行RocketMQ RocketMQ集群架构 配置RocketMQ主从集群 搭建管理控制台 RocketMQ消息 ...

  8. Memcached 集群架构方面的问题

    Memcached 集群架构方面的问题 *  集群架构方面的问题 o memcached是怎么工作的? o memcached最大的优势是什么? o memcached和MySQL的query cac ...

  9. RabbitMQ 镜像集群队列_集群高可用篇_03

    文章目录 一.普通集群搭建 1. 停止 全部 MQ服务节点 2. 文件(.erlang.cookie)同步 3. 组成集群操作 3. slave 加入集群操作 4. 查看集群状态 5. 访问管控台界面 ...

最新文章

  1. linux 命令 —-— vi编辑器
  2. CV之IC:计算机视觉之图像分类(Image Classification)方向的简介、使用方法、案例应用之详细攻略
  3. SCUT个人整理的常见问题
  4. python中*args和**args的不同
  5. mysql与jmeter环境变量配置_Java开发技术大杂烩(一)之Redis、Jmeter、MySQL的那些事...
  6. ajax,jsonp,axios面试题
  7. 无盘服务器pnp,无盘系统PNP方法详细说明
  8. 专利案件管理软件 唯德系统
  9. 【flink】Flink-Cep实现规则动态更新
  10. kb3042553显示不适用计算机,KB3042553补丁打不上,怎么办?
  11. Why do people love certain websites and web products?
  12. Xamarin字体设置
  13. 【文化课每周学习记录】2019.4.14——2019.4.20
  14. 服务器瘦身linux,Linux系统桌面瘦身加速工具组trans-purge
  15. SharePoint传出电子邮件配置
  16. 光伏电站智慧运维辅助系统解决方案 助力光伏运维监控智能化
  17. 编程累了进来听听音乐
  18. AI绘画与虚拟人生成实践(二):智能不智障!用chatgpt自动写爆款内容
  19. 柠檬ban软件测试之python高级测试开发学习笔记
  20. 如何判断一个文件的编码格式是gb2312还是gbk等

热门文章

  1. 使用FLEX3开发大型多人在线游戏
  2. 【狂神Spring笔记】Spring整理笔记(附代码)(共13章)
  3. android鼠标滚轮事件坐标,Android触摸滑动全解(四)——MotionEvent详解
  4. 为什么有些公司不招大龄程序员?其实公司是有定海神针的
  5. python表情代码_Python实现表情包的代码实例
  6. 胡莱三国2服务器维护,不想说再见《胡莱三国2》安卓首测完美收官
  7. cacti mysql 详解,cacti详解和基本配置
  8. windows PCHunter 系统信息查看 手工杀毒
  9. 2022云栖现场|体验阿里巴巴工作数字化实践
  10. 基于STM32控制的数字BUCK电路及程序编写