晓夏

YoungCheung

Zhang Sir's technical way

RabbitMQ集群部署

浏览量:56

一、简介

1.1. 概述

        RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。、


1.2 工作原理示意图

image.png

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(简单模式)

image.png

一个消费者消费一个生产者生产的东西。


1.5.2 Work queues(工作模式)

image.png

 一个生产者生产信息,多个消费者进行消费,但是一条消息只能消费一次

1.5.3 Publish/Subscribe(发布订阅模式)

image.png

生产者首先投递消息到交换机,订阅了这个交换机的队列就会收到生产者投递的消息

1.5.4 Routing(路由模式)

image.png

 生产者生产消息投递到direct交换机中,扇出交换机会根据消息携带的routing Key匹配相应的队列

1.5.5 Topics(主题模式)

image.png

 生产者生产消息投递到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 主机规划

image.png


2.2 下载软件包

安装二进制rabbitmq需要安装erlang语言包,每个rabbitmq版本需要的erlang版本也不一样,要注意

比对地址:http://www.rabbitmq.com/which-erlang.html

image.png

  • 安装Erlang环境,注意版本要与RabbitMQ版本对应。这里演示我们选择以下版本下载:

  • wget https://github.com/erlang/otp/releases/download/OTP-25.0/otp_src_25.0.tar.gz
    wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.4/rabbitmq-server-generic-unix-3.11.4.tar.xz

    2.3 安装依赖

  • sudo yum install make gcc gcc-c++ build-essential openssl openssl-devel unixODBC unixODBC-devel kernel-devel m4 ncurses-devel -y

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

image.png

此报错可忽略,若想要解决参考:

在编译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并创建用户

image.png

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

image.png

2.11 指定用户权限

rabbitmqctl set_user_tags zhangsir administrator
rabbitmqctl set_user_tags operation administrator

image.png


2.12 用户角色类型

用户角色5种类型:
none:无任何角色。新创建的用户的角色默认为none。
management:可以访问Web管理页面。
policymaker:包含management的所有权限,并且可以管理策略(policy)和参数(parameter)。
monitoring:包含management的所有权限,并且可以看到所有连接(connections)、信道(channels)以及节点相关的信息。
administartor:包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等等。
administator代表了最高的权限。

2.13 用户授权

命令格式:rabbitmqctl set_permissions [-p vhosts] {user} {conf} {write} {read}
[-p vhost]:授予用户访问权限的 vhost 名称,如果不写默认为 /。
user:指定哪个用户可以访问该vhost的权限。
conf:用户在哪些资源上拥有可配置权限(支持正则表达式)。
write:用户在哪些资源上拥有写权限(支持正则表达式)。
read:用户在哪些资源上拥有读权限(支持正则表达式)。

$ rabbitmqctl set_permissions -p "/"  operation ".*" ".*" ".*"
  1. 2.14 登录

  2. image.png


如果业务使用单节到此结束,接下来我们继续配置集群。


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查看集群情况

image.png



三、配置镜像队列


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上

image.png

队列开始同步

image.png

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





神回复

发表评论:

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