RabbitMQ 镜像集群 宕机恢复、负载均衡、跨机房多活

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ 镜像集群 宕机恢复、负载均衡、跨机房多活相关的知识,希望对你有一定的参考价值。

参考技术A

起因:在实际项目开发过程中,需要使用RabbitMQ来实现消息队列的功能,但仅仅实现功能之后并不能对自己满足,既然学一次,就要更深的了解她,吃一吃架构方面的相关内容,提升自己。

RabbitMQ在镜像集群中,机器其实是平行关系,所有的节点都是互相复制的

场景描述:

A是Master

B是Slave

A正常运行,B宕机了,只需要启动B即可,B就会自动加入集群

A和B都宕机了,只要A在B之前启动就可以了

A和B都宕机了,A启动不起来了,即便是B启动了,有可以B直接启动不了啦

B和C都加入了A为Master的集群,这个时候都需要将B和C从A的集群中forget,B和C启动不起来了

RabbitMQv3.2版本以后提供了一个离线清除集群节点的命令参数,也就是节点无法启动状态下

HAProxy是一款提供高可用的负载均衡器(之前大家都是使用的nginx居多,upstream反向代理实现负载均衡非常容易),HAProxy可以基于TCP四层(Lvs也是TCP四层的),HTTP七层(Nginx是HTTP七层)的负载均衡应用代理软件,免费高速可靠的一种LBS解决方案

HAProxy的并发连接完全可以支持以万为单位的

Nginx

优点:

1、工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行。

2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能。

3、Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。

4、可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量。

5、Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。

6、不仅仅是优秀的负载均衡器/反向代理软件,同时也是强大的Web应用服务器。可作为静态网页和图片服务器,在高流量环境中稳定性也很好。

7、可作为中层反向代理使用。

缺点:

1、适应范围较小,仅能支持http、https、Email协议。

2、对后端服务器的健康检查,只支持通过端口检测,不支持url来检测

3、负载均衡策略比较少:轮询、权重、IP_hash、url_hash

HAProxy

优点:

1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段)

2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。

3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。

4、HAProxy支持TCP协议的负载均衡转发,可以对mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。

5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种

缺点:

1、不支持POP/SMTP协议

2、不支持SPDY协议

3、不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。

4、重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。

5、多进程模式支持不够好

HAProxy+Keepalived(负载均衡节点的高可用)

将上面的配置文件内容放入 /etc/haproxy/haproxy.cfg中

启动HAProxy

启用成功后可以到控制台进行验证

通过federation的配置来进行数据通道搭建

这个时候你需要自己定义一个上游节点upstream(166节点),一个下游节点downstream(167节点),federation是单向发送的,相当于消息发送到upstream的一个exchange上,然后转发到downstream的queue上

1、 在下游节点创建一个exchage和一个queue和binding的routingkey,用来进行数据接收

2、 在下游节点建立federation upstream规则和上游节点进行数据同步

3、 进入下游节点的federation status没有任何数据,需要建立策略来保证通道连通

4、 进入下游节点的Policy菜单,Pattern是个正则表达式,这里表示以down开头的exchange和queue都匹配

5、 这个时候看exchange和queue,规则就应用上了

6、 这个时候去federation status看,发现上游连接已经连接上了

7、 这个时候我们先去看上游的overview

8、 再看上游的exchange和queue就已经根据下游配置的upstream和policy规则将exchange和queue创建好了

灰色的这个重定向exchange不能发送消息,如果要发送则在down-exchange上进行发送

9、 我们在上游的down-exchange发送一条消息,进行测试

可以在下游查看这条消息

10、 因为上游及节点只是一个中转,如果上游及诶单也要消息down-exchange里的消息怎么办?

只需要在本地建立一个binding关系就好

不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

RabbitMQ集群搭建

RabbiMQ简介

RabbiMQ是用Erang开发的,集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。

RabbiMQ模式

RabbitMQ模式大概分为以下三种:
(1)单一模式。
(2)普通模式(默认的集群模式)。
(3) 镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用)。
要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

RabbiMQ特点

RabbitMQ的集群节点包括内存节点、磁盘节点。RabbitMQ支持消息的持久化
也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。

环境:

IP地址 主机名 操作系统 防火墙和SELinux 用途
192.168.100.143 mq01 CentOS7.4(64位) 关闭 磁盘节点
192.168.100.144 mq02 CentOS7.4(64位) 关闭 内存节点
192.168.100.145 mq03 CentOS7.4(64位) 关闭 内存节点

注意,这里三台服务器都连接上互联网,另外RabbitMQ集群节点必须在同一网段里,如果是跨广域网,效果会变差。

RabbitMQ普通集群配置

1. 配置hosts文件

更改三台MQ节点的计算机名分别为mq01、mq02 和mq03,然后修改hosts配置文件

vim /etc/hostname    //其他两台相同
  mq01.localdomain

vi /etc/hosts
192.168.100.143 mq01  //注意不能带.注意-主机名称也要更改
192.168.100.144 mq02
192.168.100.145 mq03

2.三个节点配置yum源,安装rabbitmq软件

yum install -y epel-release

yum install -y rabbitmq-server

3.拷贝erlang.cookie

Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。所以必须保证各节点cookie一致,不然节点之间就无法通信。

[[email protected] ~]# cat /var/lib/rabbitmq/.erlang.cookie 
XAHPZVPYUQDWWJIOHUPQ

用scp的方式将mq01节点的.erlang.cookie的值复制到其他两个节点中。

scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie

scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie

4.分别查看三个节点并添加管理服务,最后启动rabbitmq服务

RabbitMQ提供了一个非常友好的图形化监控页面插件(rabbitmq_management),让我们可以一目了然看见Rabbit的状态或集群状态。

/usr/lib/rabbitmq/bin/rabbitmq-plugins list //查看插件安装情况

/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management //启用rabbitmq_management服务

service rabbitmq-server start

5.查看监听端口(插件监控的端口是15672)

技术分享图片

6.将mq02、mq03作为内存节点加入mq01节点集群中

在mq02、mq03执行如下命令:

rabbitmqctl stop_app    //停掉rabbit应用

rabbitmqctl join_cluster --ram [email protected] //加入到磁盘节点

rabbitmqctl start_app  //启动rabbit应用

技术分享图片
技术分享图片

(1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq02和mq03是内存节点,mq01是磁盘节点。
(2)如果要使mq02、mq03都是磁盘节点,去掉--ram参数即可。
(3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应用

7.查看集群状态

技术分享图片

8.登录rabbitmq web管理控制台,创建新的队列

打开浏览器输入http://192.168.100.143:15672, 输入默认的Username:guest,输入默认的Password:guest ,登录后出现如图所示的界面。
技术分享图片
根据界面提示创建一条队列
技术分享图片
技术分享图片

在RabbitMQ集群集群中,必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。

RabbitMQ镜像集群配置

上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。

设置的镜像队列可以通过开启的网页的管理端,也可以通过命令,这里说的是其中的网页设置方式。

1.创建rabbitmq策略

在mq01节点的控制台上创建策略

(1)点击admin菜单–>右侧的Policies选项–>左侧最下下边的Add/update a policy。

(2)按照图中的内容根据自己的需求填写。
技术分享图片

  • Name:策略名称
  • Pattern:匹配的规则,这里表示匹配a开头的队列,如果是匹配所有的队列,那就是^.
  • Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。

(3)点击Add policy添加策略
技术分享图片
此时分别登陆mq02、mq03两个节点的控制台,可以看到上面添加的这个策略,如图所示:
技术分享图片
技术分享图片

2.添加队列

在mq01节点的控制台上添加队列
(1)点击Queues菜单–>左侧下边的Add a new queue
(2)输入Name和Arguments参数的值,别的值默认即可
技术分享图片

  • Name:队列名称
  • Durability:队列是否持久化
  • Node:消息队列的节点
  • Auto delete:自动删除
  • Arguments:使用的策略类型

(3)点击Add queue
技术分享图片
将鼠标指向+2可以显示出另外两台消息节点。

3.创建消息

(1)点击ab队列按钮
(2)拖动滚动条,点击publish message
(3)填写相关内容
技术分享图片

  • 2-Persistent:表示持久化
  • Headers:随便填写即可
  • Properties:点击问号,选择一个消息ID号
  • Payload:消息内容

(4)点击Publish message按钮
技术分享图片
点击queue按钮,发现ab队列的Ready和Total中多了一条消息记录。
技术分享图片

4.做破坏性测试

(1)将mq01节点的服务关闭,再通过mq02和mq03查看消息记录是否还存在。

rabbitmqctl stop_app  //停掉mq01的rabbit应用

技术分享图片
技术分享图片
从中可以看到ab队列已经从之前的+2显示成+1了,而且消息记录是存在的。

(2)再将mq02节点的服务关闭,通过mq03查看消息记录是否还存在。

rabbitmqctl stop_app  //停掉mq02的rabbit应用

技术分享图片
从中可以看到ab队列和消息记录还是存在的,只是变成了一个节点了。

(3)将mq01和mq02的服务再启动起来

rabbitmqctl start_app   //启动mq01、mq02的rabbit应用

技术分享图片
从中可以看到ab队列后面+2变成了粉色,鼠标指上去显示镜像无法同步。如果这时候停掉mq03节点的服务,那么队列里面的消息将会丢失。

采取的解决办法是选择在mq02节点上执行同步命令。

rabbitmqctl sync_queue ab  //同步ab队列

技术分享图片
同步完成后,+2又变成了蓝色。

这样,我们就测试了rabbitmq集群的破坏性测试,说明集群配置成功。

以上是关于RabbitMQ 镜像集群 宕机恢复、负载均衡、跨机房多活的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ集群搭建镜像队列实现高可用负载均衡Federation ExchangeFederation QueueShovel

RabbitMQ---集群,Haproxy+Keepalive 实现高可用负载均衡,Federation Exchange和Federation Queue

? RabbitMQ3.6.3集群搭建+HAProxy1.6做负载均衡

RabbitMQ集群架构之使用Haproxy实现高可用负载均衡

使用Nginx解决跨域,防盗链,宕机,DDOS攻击

RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群