RabbitMQ集群,镜像队列,Federation Exchange(四)

发布于 2021-10-12  2.1k 次阅读


一,RabbitMQ集群搭建

准备好三台或者三台以上的机器(我准备三台,以我的为例),这几台机器必须安装好了RabbitMQ

我准备了三台机器
节点类型
IP
HostName
主节点
192.168.68.133
rabbitmq1
从节点
192.168.68.152
rabbitmq2
从节点
192.168.68.153
rabbitmq3
安装步骤:

① 机器分别安装RabbitMQ:省略

② 修改机器的主机名

修改方式:

  • 短暂修改(重启失效):hostname 主机名
  • 修改/etc/hostname文件和/etc/hosts文件(持久修改)
  • hostnamectl set-hostname 主机名(持久修改)

③ 添加主机名和IP地址映射(机器都必须配置)

#加下面内添加到/etc/hosts文件中
192.168.68.133 rabbitmq1
192.168.68.152 rabbitmq2
192.168.68.153 rabbitmq3

④ 从主节点远程拷贝/var/lib/rabbitmq/.erlang.cookie到两个从节点(确保几个节点的cookic值是一样的)

scp /var/lib/rabbitmq/.erlang.cookie rabbitmq2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie rabbitmq3:/var/lib/rabbitmq/.erlang.cookie
⑤ 启动RabbitMQ服务,服务包括Erlang虚拟机和RabbitMQ应用服务(在三个节点分别启动)
rabbitmq-server -detached
⑥ 将从节点加入集群(RabbitMQ是以主节点为集群的,从节点加入主节点就是加入集群或者一个从节点加入集群另一个从节点加入这个从节点)

1,从节点rabbitmq2加入集群

#将RabbitMQ服务关闭(rabbitmqctl stop会将Erlang虚拟机关闭,stop_app只关闭RabbitMQ服务)
rabbitmqctl stop_app
#重置RabbitMQ服务
rabbitmqctl reset
#加入到以主节点为准的集群中(rabbit@主机名的形式)
rabbitmqctl join_cluster rabbit@rabbitmq1
#启动RabbitMQ服务
rabbitmqctl start_app

2,从节点rabbitmq3加入集群

#将RabbitMQ服务关闭(rabbitmqctl stop会将Erlang虚拟机关闭,stop_app只关闭RabbitMQ服务)
rabbitmqctl stop_app
#重置RabbitMQ服务
rabbitmqctl reset
#加入到以主节点为准的集群中(rabbit@主机名的形式)
rabbitmqctl join_cluster rabbit@rabbitmq1
#启动RabbitMQ服务
rabbitmqctl start_app

注:执行执行命令前如果MQ是开启的状态必须先关闭掉,rabbit@必须加在主机名前面

⑦ 查看集群状态

rabbitmqctl cluster_status

一,设置集群用户

将单台RabbitMQ设置为集群之后,就必须添加一个新的集群用户,原来单RabbitMQ的用户是不能使用的,必须注册新的集群用户

用户的创建方式和单RabbitMQ是一样的

1,创建一个web账号

命令:rabbitmqctl add_user 用户名 密码

2,设置用户角色

命令:rabbitmqctl set_user_tags 用户名 角色

3,设置用户权限

命令:rabbitmqctl set_permissions [-p <vhostpath>] <user> <conf> <write> <read>

4,查看用户列表

命令:rabbitmqctl list_users

注:上图从节点Node statistics not available(节点统计信息不可用)是因为没有安装web插件,安装插件就好了

二,集群机器的解除

从节点机器脱离集群的步骤(从节点执行):

  • 关闭RabbitMQ的服务:rabbitmqctl stop_app
  • 重置RabbitMQ信息:rabbitmqctl reset

当从节点脱离集群主节点忘记该从节点(主节点执行):rabbitmqctl forget_cluster_node rabbit@主机名

注:当RabbitMQ处于集群状态时,启动和关闭不能再用systemctl stop|start rabbitmq-servre命令了,需要用rabbitmqctl stop_app |start_app

二,RabbitMQ镜像队列

一,镜像队列的概述

RabbitMQ集群的问题:RabbitMQ集群与Redis集群和Zookeeper集群不一样,默认RabbitMQ集群中的单个节点队列和交换机信息是不会和其他节点进行共享和备份的,这就意味着你再集群中的节点A创建了一个队列,如果A挂掉这个队列不能用了

 镜像队列出现的目的:由于上述原因,一个节点的失效将会导致整个服务的临时不可用,并且有可能造成数据丢失,引用镜像队列,可以将队列镜像到其他集群的节点中,如果集群中的一个节点失效,队列能切换到镜像中的另一个节点上,保障服务的可用性

简单的说镜像队列其实就是一个备份队列或同步队列,当主队列失效后,可以立即进行切换,这样来实现集群的高可用

二,镜像队列的创建

镜像队列操作很节点在web可视化界面操作即可

参数:

  • ha-mode:备份的模式,exactly为指定模式
  • ha-params:备份的个数,一般2~3份都可以
  • ha-sync-mode:同步方式,automatic为自动同步automatic,manual为手动同步

Pattern:需要填写正则表达式,它会和新创建队列的队列名进行匹配,如果匹配成功就创建镜像队列,匹配失败就不创建

Priority:优先级,不需要就不用设置

例:^FQ表示,以FQ为开头的队列名就创建镜像队列

三,Federation Exchange和Federation Queue

一,使用Federation Exchange和Federation Queue的原因

一般大型公司中的大型项目都是服务器分区域部署,这样可以增强容错性,假如一个地区的服务器由于自然灾害比如暴雨,地震导致服务器集群集体宕掉,还有其他区域的服务器存活不至于服务整体停掉

因为服务器的分区域部分也会到一些问题,如服务器数据的共享问题,业务数据的容错备份问题……

例如:现在有一个项目在分别部署在深圳和大连,用户按照距离远近优先访问那台服务器,大连的人肯定优先访问大连的服务器,假如访问深圳的服务器由于距离,网络等原因是会有延迟的,用户体验不好,现在用户访问的访问在深圳的服务器上,则会被迫访问深圳的服务器,有没有一种方法使用使用服务器的数据服务进行同步?

Federation Exchange和Federation Queue就是解决服务数据消息的共享问题,例如:把深圳的服务器数据通过联邦队列或联邦交换机同步给大连,那么用户访问大连也会有该服务

二,Federation Exchange的配置

① 开启Federation设置
rabbitmq-plugins enable rabbitmq_federation_management
② 注册Federation上游服务
③ 进行规则绑定
④ 创建一个以wql开头的交换机,并查看Federation Status