RabbitMQ集群搭建
RabbitMQ 集群
RabbitMQ 是实现了高级消息队列协议(AMQP, Advanced Message Queuing Protocol)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ 服务器是用 Erlang 语言编写的。
RabbitMQ 由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
RabbitMQ大概有 3 种模式:
单一模式:即单机情况不做集群,就单独运行一个 RabbitMQ 而已;
普通模式:默认的普通集群模式,意思就是在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。你创建的 queue,只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(元数据可以认为是 queue 的一些配置信息,通过元数据,可以找到 queue 所在实例)。你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从 queue 所在实例上拉取数据过来。
这种方式确实很麻烦,也不怎么好,没做到所谓的分布式
,就是个普通集群。因为这导致你要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个 queue 所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。
而且如果那个放 queue 的实例宕机了,会导致接下来其他实例就无法从那个实例拉取,如果你开启了消息持久化,让 RabbitMQ 落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个 queue 拉取数据。
所以这个事儿就比较尴尬了,这就没有什么所谓的高可用性,这方案主要是提高吞吐量
的,就是说让集群中多个节点来服务某个 queue 的读写操作。
镜像模式 :经典的 Mirror 镜像模式,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用,保证数据不丢失:
- 高可靠性解决方案,主要就是实现数据的同步,一般来讲是 2 - 3 个节点实现数据同步。
- 对于 100% 数据可靠性解决方案,一般是采用 3 个节点。
- 在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集群模式。
- 要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。
RabbitMQ集群特点
RabbitMQ的集群节点包括内存节点、磁盘节点。RabbitMQ支持消息的持久化 也就是数据写在磁盘上,最合适的方案就是既有内存节点,又有磁盘节点。
环境规划
IP地址 | 主机名 | 用途 |
---|---|---|
199.188.166.111 | node1 | 磁盘节点 |
199.188.166.112 | node2 | 内存节点 |
199.188.166.113 | node3 | 内存节点 |
环境依赖
RabbitMQ的依赖包:
erlang
socat
logrotate
erlang安装
rabbitmq是由erlang语言开发的,所以安装rabbitmq之前要先安装erlang,rabbitmq和erlang对应的版本关系可以参考:https://www.rabbitmq.com/which-erlang.html
erlang依赖于ncurses,若缺失请下载安装:Index of /pub/gnu/ncurses
1 |
|
erlang下载地址:Downloads - Erlang/OTP
erlang源码方式安装(可非root用户安装):
1 |
|
确认是否安装成功:
1 |
|
配置环境变量:
1 |
|
常见错误:
解决方案,只有没有APPLICATIONS DISABLED
即可:
1 |
|
socat安装
- 通过源码方式安装
1 |
|
- 通过包安装
Centos
1 |
|
Debian/Ubuntu
1 |
|
logrotate安装
logrotate 程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。Linux系统默认安装logrotate工具,可自行检查:
1 |
|
集群安装
RabbitMQ下载
下载地址:Releases · rabbitmq/rabbitmq-server (github.com)
RabbitMQ安装
3台服务器均如此操作
rabbitmq是解压即用的,解压后只需通过在配置文件指定自定义配置即可:
1 |
|
配置环境变量:
1 |
|
启动服务
3台服务器均如此操作
1 |
|
如下图所示,启动成功:
查看服务状态
1 |
|
安装管理界面插件
3台服务器均如此操作
1 |
|
安装后默认端口位15672,若需修改,可在配置文件中进行配置:
1 |
|
账号密码默认是:guest/guest,登录如图所示:
用户管理
查看所有用户
1 |
|
添加用户
1 |
|
设置用户权限
1 |
|
添加vhost
1 |
|
配置远程访问权限
1 |
|
查看用户权限
1 |
|
删除用户
1 |
|
停止服务
无问题后停止服务,开始进行后续集群的配置:
1 |
|
HOSTS配置
3台服务器均如此操作
分别修改服务器的/etc/hosts
文件,增加ip和主机名映射
1 |
|
cookie同步
将一台主机上的 .erlang.cookie
文件拷贝到其他两台主机上。该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,
因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。
RabbitMQ 服务启动时,erlang VM 会自动创建该 cookie 文件,默认的存储路径为:
1 |
|
默认的.erlang.cookie权限是400,需要先进行权限的更改:
1 |
|
登陆第一台rabbit-1机器node1,拷贝cookie至另外2台机器node2、node3:
1 |
|
从节点加入集群
将node2服务器加入集群
1 |
|
将node3服务器加入集群
1 |
|
注:如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应用
1 |
|
命令查看rabbitmq集群的信息
1 |
|
管理界面查看集群信息
三台服务器组成集群后,登录任意一台的管理界面均能进行查看,可以看到已经是集群状态,node1是disk磁盘节点,node2和node3是ram内存节点:
配置镜像模式
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。
把队列做成镜像队列,让各队列存在于多个节点中,属于RabbitMQ的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。
方式一
通过管理界面进行配置
name:自定义,策略名称
Pattern:^ 匹配符,只有一个^代表匹配所有
Definition:ha-mode=all 为匹配类型,分为3种模式:all
(mirror to all nodes in the cluster), exactly
(mirror to a set number of nodes) or nodes
(mirror to an explicit list of nodes). If you choose one of the latter two, you must also set ha-params
.
方式二
通过命令行进行配置:
1 |
|
蚂蚁🐜再小也是肉🥩!
“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付