RabbitMQ2/4---集群和高可用方案

1.常用管理命令

(1)应用管理

查看节点状态
rabbitmqctl status

rabbitmqctl stop [pid_file]
停止运行RabbitMQ的Erlang虚拟机和RabbitMQ服务应用

如果指定了pid_file,还需要等待指定进程的结束。pid_file是通过调用rabbitmq-server命令启动RabbitMQ服务时创建的,
默认情况下存放于Mnesia目录中。
如果使用abbitmq-server -detach这个带有-detach后缀的命名来启动RabbitMQ服务则不会生成pid_file文件。


rabbitmqctl stop_app
停止RabbitMQ服务应用,但是Erlang虚拟机还是处于运行状态。
此命令的执行优先于其他管理类操作(这些管理操作需要先停止RabbitMQ应用),比如rabbitmqctl reset

rabbitmqctl start_app
启动RabbitMQ应用。此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的RabbitMQ应用,比如rabbitmqctl reset

rabbitmqctl reset
将RabbitMQ节点重置还原到最初状态

包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如已配置的用户、vhost等,以及删除所有的持久化消息。
执行rabbitmqctl reset 命令前必须停止RabbitMQ应用(比如先执行rabbitmqctl stop_app)。

(2)集群管理

rabbitmqctl force_reset
强制将RabbitMQ节点重置还原到最初状态。此命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点,
只能在数据库或集群配置已损坏的情况下使用。

rabbitmqctl [-n nodename] join_cluster {cluster_node} [--ram]
将节点加入指定集群中。在这个命令执行前需要停止RabbitMQ应用并重置节点。

-n nodename:指定需要操作的目标节点,列如:rabbit@node1
cluster_node:需要加入的集群节点名,格式同上
--ram:集群节点类型,有两种类型:ram|disc,默认为disc
* ram:内存节点,所有的元数据都存储在内存中。
* disc:磁盘节点,所有的元数据都存储在磁盘中

rabbitmqctl cluster_status
查看集群状态

rabbitmqctl change_cluster_node_type {disc|ram}
修改集群节点的类型,使用此命令前要停止RabbitMQ应用。

rabbitmqctl forget_cluster_node [--offline]
将节点从集群中删除,允许离线执行。

rabbitmqctl update_cluster_nodes {--clusternode}
在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息。这个和join_cluster不同,
它不加入集群。

rabbitmqctl_foece_boot
确保节点可以启动,即使它不是最后一个关闭的节点

rabbitmqctl_set_cluster_name {name}
设置集群名称。集群名称在客户端连接时会通报给客户端。
集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置。

2.RabbitMQ高可用集群方案

RabbitMQ的Cluster模式分为两种:普通模式、镜像模式

(1)Cluster普通模式

在这里插入图片描述
元数据包含以下内容:

队列元数据:队列的名称及属性。
交换器:交换器的名称及属性。
绑定关系元数据:交换器与队列或者交换器与交换器。
vhost元数据:为vhost内部的队列、交换器和绑定提供空间命名以及安全属性之间的绑定关系。

(2)Cluster多机多节点部署

在这里插入图片描述
部署步骤

  • 环境准备

准备三台安装好RabbitMQ 的机器,安装方法见 安装步骤
10.10.1.41
10.10.1.42
10.10.1.43

提示:如果使用虚拟机,可以在一台VM上安装好RabbitMQ后,创建快照,从快照创建链接克隆,会节省很多磁盘空间

  • 修改配置文件

Ⅰ修改10.10.1.41机器上的/etc/hosts文件

sudo vim /etc/hosts

Ⅱ 添加IP和节点名

10.10.1.41 node1
10.10.1.42 node2
10.10.1.43 node3

Ⅲ 将10.10.1.41上的hosts文件复制到另外两台机器上

sudo scp /etc/hosts root@node2:/etc/
sudo scp /etc/hosts root@node3:/etc/

说明:命令中的root是目标机器的用户名,命令执行后,可能会提示需要输入密码,输入对应用户的密码就行了。

Ⅳ 将10.10.1.41上的/var/lib/rabbitmq/.erlang.cookie文件复制到另外两台机器上

scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/

提示:如果是通过克隆的VM,可以省略这一步

  • 防火墙添加端口

给每台机器的防火墙添加端口

Ⅰ 添加端口

sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent

Ⅱ 重启防火墙

sudo firewall-cmd --reload
  • 启动RabbitMQ

Ⅰ启动每台机器的RabbitMQ

sudo systemctl start rabbitmq-server

或者

rabbitmq-server -detached

Ⅱ 将10.10.1.42加入到集群

# 停止RabbitMQ 应用
rabbitmqctl stop_app

# 重置RabbitMQ 设置
rabbitmqctl reset

# 加入到集群
rabbitmqctl join_cluster rabbit@node1 --ram

# 启动RabbitMQ 应用
rabbitmqctl start_app

Ⅲ 查看集群状态,看到running_nodes,[rabbit@node1,rabbit@node2]表示节点启动成功

rabbitmqctl cluster_status

提示:在管理界面可以更直观的看到集群信息

Ⅳ 将10.10.1.43加入到集群:步骤同将10.10.1.42加入到集群方式。

(3)Cluster单机多节点部署

由于某些因素限制,有时候不得不在单台物理机器上去创建一个多RabbitMQ服务节点的集群。或者只想要实验性地验证某些特性,也不需要浪费过多的物理机器去实现。
在这里插入图片描述
部署步骤

  • 环境准备

准备一台已经安装好RabbitMQ 的机器 10.10.1.41

  • 启动RabbitMQ

Ⅰ 在启动前,先修改RabbitMQ 的默认节点名(非必要),在/etc/rabbitmq/rabbitmq-env.conf增加以下内容

# RabbitMQ 默认节点名,默认是rabbit
NODENAME=rabbit1

Ⅱ RabbitMQ 默认是使用服务的启动的,单机多节点时需要改为手动启动,先停止运行中的RabbitMQ 服务

sudo systemctl stop rabbitmq-server

Ⅲ 启动第一个节点

rabbitmq-server -detached

Ⅳ 启动第二个节点

RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server -detached

Ⅴ 启动第三个节点

RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 rabbitmq-server -detached

Ⅵ 将rabbit2加入到集群
( 将rabbit3加入到集群,步骤同)

# 停止 rabbit2 的应用
rabbitmqctl -n rabbit2 stop_app

# 重置 rabbit2 的设置
rabbitmqctl -n rabbit2 reset

# rabbit2 节点加入到 rabbit1的集群中
rabbitmqctl -n rabbit2 join_cluster rabbit1 --ram

# 启动 rabbit2 节点
rabbitmqctl -n rabbit2 start_app

Ⅶ 查看集群状态,看到{running_nodes,[rabbit3@node1,rabbit2@node1,rabbit1@node1]}说明节点已启动成功。

rabbitmqctl cluster_status

提示:在管理界面可以更直观的看到集群信息

  • 防火墙添加端口

需要将每个节点的端口都添加到防火墙

Ⅰ 添加端口

sudo firewall-cmd --zone=public --add-port=4369/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5673/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25673/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15673/tcp --permanent
sudo firewall-cmd --zone=public --add-port=5674/tcp --permanent
sudo firewall-cmd --zone=public --add-port=25674/tcp --permanent
sudo firewall-cmd --zone=public --add-port=15674/tcp --permanent

Ⅱ 重启防火墙

sudo firewall-cmd --reload

(4)Cluster镜像模式

根据策略同步数据。例如:5台服务器,同步3台。

在普通模式的基础上,通过policy来实现,使用镜像模式可以实现RabbitMQ的高可用方案。
在这里插入图片描述
•镜像队列属于RabbitMQ 的高可用方案,见:Queue Arguments that Control Mirroring
•通过前面的步骤搭建的集群属于普通模式集群,是通过共享元数据实现集群

•开启镜像队列模式需要在管理页面添加策略,添加方式:
a.进入管理页面 -> Admin -> Policies(在页面右侧)-> Add / update a policy

b.在表单中填入:

name: ha-all
Pattern: ^
Apply to: Queues
Priority: 0
Definition: ha-mode = all

在这里插入图片描述
参数说明

name: 策略名称,如果使用已有的名称,保存后将会修改原来的信息
Apply to:策略应用到什么对象上
Pattern:策略应用到对象时,对象名称的匹配规则(正则表达式)
Priority:优先级,数值越大,优先级越高,相同优先级取最后一个
Definition:策略定义的类容,对于镜像队列的配置来说,只需要包含3个部分: ha-modeha-paramsha-sync-mode。其中,ha-sync-mode是同步的方式,自动还是手动,默认是自动。ha-modeha-params 组合使用。组合方式如下:

ha-modeha-params说明
all(empty)队列镜像到集群类所有节点
exactlycount队列镜像到集群内指定数量的节点。如果集群内节点数少于此值,队列将会镜像到所有节点。如果大于此值,而且一个包含镜像的节点停止,则新的镜像不会在其它节点创建。
nodesnodename队列镜像到指定节点,指定的节点不在集群中不会报错。当队列申明时,如果指定的节点不在线,则队列会被创建在客户端所连接的节点上。

•镜像队列模式相比较普通模式,镜像模式会占用更多的带宽来进行同步(相同数据存储在不同节点),所以镜像队列的吞吐量会低于普通模式

•但普通模式不能实现高可用,某个节点挂了后,这个节点上的消息将无法被消费,需要等待节点启动后才能被消费。

ha-sync-mode
队列中消息的同步方式,有效值为automatic和manual,默认是automatic

3.插件

(1)Federation

Federation插件的设计目的是使RabbitMQ在不同的Broker节点之间进行消息传递而无须建立集群,该功能在以下场景下非常有用:

  • 各个节点运行在不同版本的Erlang和RabbitMQ上
  • 网络环境不稳定,比如广域网当中。
    类似于代理
    在这里插入图片描述

(2)Shovel插件

Shovel与Federation具备的数据转发功能类似,Shovel能够可靠、持续地从一个Broker中的队列(作为源端,即source)拉去数据并转发至另一个Broker中的交换器(作为目的端,即destination)。
Shovel可以翻译为“铲子”,是一种比较形象的比喻。这个“铲子”可以将消息从乙方“挖到”另一方。

Shovel的主要优势:

松耦合,Shovel可以移动位于不同管理域中的Broker或者集群上的消息,这些Broker或者集群可以包含不同的用户和vhost,也可以使用不同的RabbitMQ和Erlang版本。

支持广域网,Shovel插件同样基于AMQP协议在Broker之间进行通信,被设计成可以容忍时断时续的连通情形,并且能够保证消息的可靠性。

高度定制,当Shovel成功连接后,可以对其进行配置以执行相关的AMQP命令。
在这里插入图片描述

  • 插件和集群方式对比
Federation/ShovelCluster
各个Broker节点之间逻辑分离逻辑上是Broker节点
各个Broker节点可以运行在不同版本的Erlang和RabbitMQ各个Broker节点必须运行在相同同版本的Erlang和RabbitMQ
各个Broker节点之间可以在广域网中相连,当然必须要授予适当的用户和权限各个Broker节点之间必须在可信赖的局域网中相连,通过Erlang内部节点传递消息,但节点间需要有相同的Erlang cookie
各个Broker节点之间能以任何拓扑逻辑部署,连接可以是单向的或者是双向的所有Broker节点都双向连续所有其他节点
从CAP理论中选择可用性和分区耐受性,即AP从CAP理论中选择一致性和可用性,即CA
一个Broker中的交换器可以是Federation生成的或者本地的集群中所有的Broker节点中的交换器都是一样的,要么全都有要么全无
客户端能看到它所连接的Broker节点上的队列客户端连接到集群中的任何Broker节点都可以看到所有的队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值