RabbitMQ集群部署
浏览量:56
一、简介
1.1. 概述
RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。、
1.2 工作原理示意图

1.3 名词介绍
1、Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker
2、Connection: publisher / consumer和 broker之间的TCP连接
3、Channel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP
Connection的开销将是巨大的,效率也较低。Channel是在connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id 帮助客户端和message broker识别 channel,所以channel 之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建TCP connection的开销
4、Exchange: message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue 中去。常用的类型有: direct (point-to-point), topic(publish-subscribe) and fanout
(multicast)
5、Routing Key:生产者将消息发送到交换机时会携带一个key,来指定路由规则
6、binding Key:在绑定Exchange和Queue时,会指定一个BindingKey,生产者发送消息携带的RoutingKey会和bindingKey对比,若一致就将消息分发至这个队列
7、vHost 虚拟主机:每一个RabbitMQ服务器可以开设多个虚拟主机每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的 "交换机exchange、绑定Binding、队列Queue",更重要的是每一个vhost拥有独立的权限机制,这样就能安全地使用一个RabbitMQ服务器来服务多个应用程序,其中每个vhost服务一个应用程序。
1.4 交换机类型
1.direct Exchange(直接交换机)
匹配路由键,只有完全匹配消息才会被转发
2.Fanout Excange(扇出交换机)
将消息发送至所有的队列
3.Topic Exchange(主题交换机)
将路由按模式匹配,此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“匹配不多不少一个词。因此“abc.#”能够匹配到“abc.def.ghi”,但是“abc.” 只会匹配到“abc.def”。
4.Header Exchange
在绑定Exchange和Queue的时候指定一组键值对,header为键,根据请求消息中携带的header进行路由
1.5 工作模式
1.5.1 simple(简单模式)

一个消费者消费一个生产者生产的东西。
1.5.2 Work queues(工作模式)

一个生产者生产信息,多个消费者进行消费,但是一条消息只能消费一次
1.5.3 Publish/Subscribe(发布订阅模式)

生产者首先投递消息到交换机,订阅了这个交换机的队列就会收到生产者投递的消息
1.5.4 Routing(路由模式)

生产者生产消息投递到direct交换机中,扇出交换机会根据消息携带的routing Key匹配相应的队列
1.5.5 Topics(主题模式)

生产者生产消息投递到topic交换机中,上面是完全匹配路由键,而主题模式是模糊匹配,只要有合适规则的路由就会投递给消费者
1.6 保证消息的稳定性
1.消息持久化
RabbitMQ的消息默认存在内存中的,一旦服务器意外挂掉,消息就会丢失。
消息持久化需做到三点
A、Exchange设置持久化
B、Queue设置持久化
C、Message持久化发送:发送消息设置发送模式deliveryMode=2,代表持久化消息
2.ACK确认机制
多个消费者同时收取消息,收取消息到一半,突然某个消费者挂掉,要保证此条消息不丢失,就需要acknowledgement机制,就是消费者消费完要通知服务端,服务端才将数据删除这样就解决了,及时一个消费者出了问题,没有同步消息给服务端,还有其他的消费端去消费,保证了消息不丢的case。
3.设置集群镜像模式
我们先来介绍下RabbitMQ三种部署模式:
1)单节点模式:最简单的情况,非集群模式,节点挂了,消息就不能用了。业务可能瘫痪,只能等待。
2)普通模式:默认的集群模式,某个节点挂了,该节点上的消息不能用,有影响的业务瘫痪,只能等待节点恢复重启可用(必须持久化消息情况下)。
3)镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案
4.消息补偿机制
持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?
产线网络环境太复杂,所以不知数太多,消息补偿机制需要建立在消息要写入DB日志,发送日志,接受日志,两者的状态必须记录。然后根据DB日志记录check 消息发送消费是否成功,不成功,进行消息补偿措施,重新发送消息处理。
1.7 如何实现延迟队列
RabbitMQ本身没有延迟队列,需要靠TTL和DLX模拟出延迟的效果
1、 TTL(Time To Live)
RabbitMQ可以针对Queue和Message设置 x-message-tt,来控制消息的生存时间,如果超时,则消息变为dead letter
RabbitMQ针对队列中的消息过期时间有两种方法可以设置。
A: 通过队列属性设置,队列中所有消息都有相同的过期时间。
B: 对消息进行单独设置,每条消息TTL可以不同。
如果同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准。消息在队列的生存时间一旦超过设置的TTL值,就成为dead letter
2、DLX (Dead-Letter-Exchange)
RabbitMQ的Queue可以配置x-dead-letter-exchange 和x-dead-letter-routing-key(可选)两个参数,如果队列内出现了dead letter,则按照这两个参数重新路由。
x-dead-letter-exchange:出现dead letter之后将dead letter重新发送到指定exchange
x-dead-letter-routing-key:指定routing-key发送
队列出现dead letter的情况有:
A、消息或者队列的TTL过期
B、队列达到最大长度
C、消息被消费端拒绝(basic.reject or basic.nack)并且requeue=false
D、利用DLX,当消息在一个队列中变成死信后,它能被重新publish到另一个Exchange。这时候消息就可以重新被消费。
二、Rabbitmq部署
2.1 主机规划

2.2 下载软件包
安装二进制rabbitmq需要安装erlang语言包,每个rabbitmq版本需要的erlang版本也不一样,要注意
比对地址:http://www.rabbitmq.com/which-erlang.html

2.4 解压安装erlang环境
tar xf otp_src_25.0.tar.gz -C /data cd otp_src_25.0/ ./configure --prefix=/data/erlang make && make install

此报错可忽略,若想要解决参考:
在编译rabbitmq过程中报错:rabbitmq wxWidgets must be installed on your system.
[root@linux-node001]# otp_src_25.0]# yum -y install bzip2 [root@linux-node001 otp_src_25.0]# tar -jxvf wxWidgets-3.0.5.tar.bz2 [root@linux-node001t otp_src_25.0]# cd wxWidgets-3.0.5 [root@linux-node001 otp_src_25.0]# ./configure && make && sudo make install
2.5 添加环境变量
$ vi /etc/profile export ERLANG_HOME=/data/erlang export PATH=$ERLANG_HOME/bin:$PATH $ source /etc/profile
2.6 安装rabbitmq依赖
sudo yum install socat -y
2.7 解压rabbitmq并配置环境变量
tar xf rabbitmq-server-generic-unix-3.11.4.tar.xz -C /data/ mv rabbitmq_server-3.11.4 rabbitmq $ vi /etc/profile export ERLANG_HOME=/data/rabbitmq export PATH=$ERLANG_HOME/sbin:$PATH $ source /etc/profile
2.8 后台启动rabbitmq
rabbitmq-server -detached
2.9 开启管理页面插件
rabbitmq-plugins enable rabbitmq_management
2.10 修改默认guest并创建用户

rabbitmqctl add_user zhangsir Admin@123 rabbitmqctl add_user operation Admin@123

2.11 指定用户权限
rabbitmqctl set_user_tags zhangsir administrator rabbitmqctl set_user_tags operation administrator

2.12 用户角色类型
用户角色5种类型: none:无任何角色。新创建的用户的角色默认为none。 management:可以访问Web管理页面。 policymaker:包含management的所有权限,并且可以管理策略(policy)和参数(parameter)。 monitoring:包含management的所有权限,并且可以看到所有连接(connections)、信道(channels)以及节点相关的信息。 administartor:包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等等。 administator代表了最高的权限。
命令格式:rabbitmqctl set_permissions [-p vhosts] {user} {conf} {write} {read}
[-p vhost]:授予用户访问权限的 vhost 名称,如果不写默认为 /。
user:指定哪个用户可以访问该vhost的权限。
conf:用户在哪些资源上拥有可配置权限(支持正则表达式)。
write:用户在哪些资源上拥有写权限(支持正则表达式)。
read:用户在哪些资源上拥有读权限(支持正则表达式)。
$ rabbitmqctl set_permissions -p "/" operation ".*" ".*" ".*"如果业务使用单节到此结束,接下来我们继续配置集群。
2.16 配置rabbitmq集群
2.16.1 停止服务并拷贝erlang cookie
/data/rabbitmq/sbin/rabbitmqctl stop cat /home/operation/.erlang.cookie (每台机器复制内容保持一致) rsync -av /home/operation/.erlang.cookie 节点的ip:/home/operation/.erlang.cookie(支持rsync复制下) #启动 /data/rabbitmq/sbin/rabbitmq-server -detached (每台机器启动服务)
2.16.2 将rabbitmq节点加入集群
#192.168.1.11 rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@node1 --ram rabbitmqctl start_app rabbitmqctl cluster_status #192.168.1.12 rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@node1 --disc rabbitmqctl start_app rabbitmqctl cluster_status
2.16.2 查看集群状态
rabbitmqctl cluster_status
2.16.3 访问IP:15672查看集群情况

三、配置镜像队列
3.1 设置镜像队列策略
# 任意节点
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致,RabbitMQ高可用集群就已经搭建好了,我们可以重启服务,查看其队列是否在从节点同步
3.2 移除集群节点[拓展]
rabbitmqctl forget_cluster_node rabbit@linux-node002
3.3 修改集群名称(默认为第一个node名称)[拓展]
# 任意节点 rabbitmqctl set_cluster_name rabbitmq_cluster1
3.4 测试队列同步
在node1上

队列开始同步

登录其他两个node查看,镜像队列已经同步。


神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。