RabbitMQ应用场景与高可用集群搭建

非最新版RabbitMQ(3.7)下载链接,提取码:rk2l


一、RabbitMQ的应用场景

1、异步处理
  • 串行方式:用户将请求写入数据库之后,还需要发送注册邮件、发送注册短信,等上面三个任务结束后才响应给客户端。
    Alt

  • 并行方式:用户将信息写入数据库后,同时发送注册邮件和注册短信,上面三个任务结束后响应给客户端。
    Alt

  • 消息队列异步处理:假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并行已经加快了处理时间,但是其实邮件和短信对我正常使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,应该是写入数据库后就返回.。引入消息队列后,把发送邮件、短信不是必须的业务逻辑异步处理。
    Alt

2、应用解耦

场景:商城购物的时候,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。但是这样做有个很明显的弊端:当库存系统出现故障时,订单就会失败。订单系统和库存系统高耦合,可引入消息队列解耦

Alt

  • 订单系统:用户下单后,订单系统完成入库操作,之后将消息写入消息队列,写完后返回下单成功给用户。

  • 库存系统:订阅下单的消息,获取下单消息,并进行库存的更新操作。即使库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。


3、流量削峰

场景: 秒杀活动因为短时间内流量巨大,容易导致应用挂掉。为了解决这个问题,一般在应用前端加入消息队列控制活动人数,超过这一定阈值的订单直接丢弃,从而可以缓解短时间里高流量压垮应用的问题。

  • 用户请求发到服务端之后,首先写入消息队列,若加入消息队列的消息数量超过最大值,则直接抛弃用户请求或跳转到秒杀失败等错误页面。之后秒杀业务根据消息队列中的请求消息再做后续处理。



二、RabbitMQ的集群

1、主备模式

       这里需要区分主备模式和主从模式的区别

       主备模式:主节点负责读写,从节点不提供任何的读写服务

       主从模式:主节点负责读写,从节点只读


       RabbitMQ的主备模式中,从节点只负责提供备份服务,备份节点的主要功能是在主节点宕机时,完成自动切换 从–>主。其中原理图如下所示,该模式通过HaProxy组件达到高可用的目的。

Alt


2、远程模式

       RabbitMQ的远程模式中,两个mq集群间可以远距离通信和复制,所谓Shovel就是我们可以把消息进行不同数据中心的复制工作,我们可以跨地域的让两个mq集群互联。我们下面看一下Shovel架构模型:

Alt


3、镜像模式

       集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,Mirror镜像队列,目的是为了保证RabbitMQ数据的高可靠性解决方案,主要就是实现数据的同步,集群架构如下:

Alt


4、多活模式

       RabbitMQ的多活模式也是实现异地数据复制的主流模式,因为Shovel模式(之前的远程模式)配置比较复杂,所以一般来说实现异地集群都是使用双活或者多活模式来实现的。这种模式需要依赖RabbitMQ的federation插件,可以实现继续的可靠AMQP数据通信,多活模式在实际配置与应用非常的简单。Federation插件是一个不需要构建Cluster,而在Brokers之间传输消息的高性能插件。多活集群架构如下:

Alt




三、RabbitMQ集群搭建

       在这里我自己使用的是三台虚拟机,IP分别为192.168.255.200(mq1)、192.168.255.201(mq2)、192.1468.255.202(mq3)。

Alt

1、RabbitMQ普通集群(主备模式)

       安装步骤不再赘述,可参考之前写的博客 - - >链接确保三个节点的RabbitMQ服务能正确启动


① 停止各个节点的服务

	rabbitmqctl stop

② 配置主机名
       因为从节点加入RabbitMQ集群的时候只能用主机名标志主节点所在的集群,而不能用IP标志。

	# 将三台机器的主机名依次改为mq1、mq2、mq3
	vi /etc/hosts

③ 拷贝Cookie
       要想搭建集群,必须要保证三个节点同步cookie文件。

	scp /var/lib/rabbitmq/.erlang.cookie root@mq2:/var/lib/rabbitmq/
	scp /var/lib/rabbitmq/.erlang.cookie root@mq3:/var/lib/rabbitmq/

④ 启动RabbitMQ的所有节点
       mq1、mq2、mq3都开启服务。

	rabbitmq-server -detached

       主节点运行结果如下图:

Alt

       从节点会报如下错误,eaccess 错误就是权限问题,新复制过来的cookie ,当前不可用,需要授权。

Alt

解决办法为:
       如果是通过rpm安装的RabbitMQ,执行:

	chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

       如果是通过解压缩方式安装的,执行:

	chown rabbitmq:rabbitmq ~/.erlang.cookie

⑤ 集群操作
       停止从节点(mq2和mq3节点)的服务。

	rabbitmqctl stop_app

       将从节点(mq2和mq3节点)都加入mq1的集群。

	rabbitmqctl join_cluster rabbit@mq1

Alt

       问题不大,在mq1节点上开放4369端口

	# 开放4369端口
	firewall-cmd --add-port=4369/tcp --permanent
	
	# 重启防火墙服务
	firewall-cmd --reload

	# 查看端口是否开放成功
	firewall-cmd --list-all

Alt

       别慌,继续在主节点上面开放25672端口,其实5672是用于java客户端连接的端口,15672是管理界面端口,25672是集群通信的tcp端口。

	# 开放4369端口
	firewall-cmd --add-port=25672/tcp --permanent
	
	# 重启防火墙服务
	firewall-cmd --reload

	# 查看端口是否开放成功
	firewall-cmd --list-all

       在集群中的任意一个节点下,使用下面的指令可以查看集群的状态。

	rabbitmqctl cluster_status

Alt


       由上图可以看出,mq1主节点和两个从节点(mq2和mq3)已经处在同一个集群中,但是从节点之前停掉了服务,现在使用下面的指令重新开启服务。

	rabbitmqctl start_app

       TM这个主备模式只能启两个节点!
Alt


⑥ 集群常用指令

	# 将mq3节点从该集群中移除
	rabbitmqctl forget_cluster_node rabbit@mq3

	# 将运行该指令的节点从集群中移除
	rabbitmqctl stop_app
	rabbitmqctl reset
	
	# 将运行该指令的节点加入mq1的集群
	rabbitmqctl join_cluster rabbit@mq1

2、配置镜像队列
	rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

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的优先级



       RabbitMQ中的数据都是保存在下图中的mnesia文件夹中的。

Alt


3、Haproxy实现单负载均衡
	# 解压文件
	tar -zxvf haproxy-1.6.5

	cd haproxy-1.6.5
	make TARGET=linux31 PREFIX=/usr/haproxy
	make install PREFIX=/usr/haproxy

	# 创建配置文件的路径
	mkdir /etc/haproxy
	
	# 赋权
	groupadd -r -g 149 haproxy
	useradd -g haproxy -r -s /sbin/nologin -u 149 haproxy

配置文件下载链接,提取码:vqt5

下载配置文件放入/etc/haproxy/目录下面。

如果报下面这个错,那就修改一下集群的监听端口即可,
Alt
Alt

启动指令:/usr/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg。关闭指令:killall haproxy

使用这个指令查看haproxy进程状态:ps -ef | grep haproxy

Alt


       开启配置文件中所指定监控界面的端口之后,监控界面如下图:

Alt


4、KeepAlived实现高可用

       在线安装KeepAlived

	yum install keepalived -y

       配置文件下载链接,提取码:mgi5

       下载配置文件放在/etc/keepalived/目录下面。主的state用MASTER从的state用BACKUP

Alt

       操作KeepAlived的指令:service keepalived start | stop | status | restart

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值