rabbitmq的集群

本文主要记录下rabbitmq消息队列的几种集群的优缺点以及搭建的方式!
1、普通集群

又称为标准集群,是一种分布式集群,将队列分散到集群的各个节点,从而提升整个集群的并发能力,有以下特点
a.会在集群的各个节点间共享部分数据。包括交换机,队列元信息(队列的描述信息,队列的名字,队列的节点等等),不包含消息本身。
b.当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回。
c.队列所在节点宕机,节点上的消息就会都丢失。

搭建方式如下:
首先查看2台服务器的主机名

cat /etc/hostname

获得2台主机的主机名称如下:
master:VM-0-11-centos
standby: VM-4-6-centos

将主机名称及解析地址添加到/etc/host文件中,2台机器都添加
echo 主机1ip VM-0-11-centos>>/etc/hosts
echo 主机2ip VM-0-11-centos>>/etc/hosts

关闭防火墙

systemctl stop firewalld

ping下对应的服务器,检查下网络是否通

启动主服务器和从服务器:

rabbitmq-server -detached
rabbitmqctl start_app

搭建集群需要/var/lib/rabbitmq/.erlang.cookie文件一致,这个文件是隐藏文件,需要通过ls -a 命令查看,-a表示查看隐藏文件。

将master上到.erlang/cookie文件拷贝到standby上,
同步之后standby启动rabbitmq会报错,原因是:eaccess 错误就是权限问题,新复制过来的cookie ,当前不可用,需要授权。
问题参考:https://blog.csdn.net/u014209205/article/details/106647229

通过 rpm 安装的 rabbitmq,执行:

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
即可。

如果是通过 解压缩方式安装的,执行:

chown rabbitmq:rabbitmq ~/.erlang.cookie
启动错误:.erlang.cookie must be accessible by owner only
解决方法chmod 600 /var/lib/rabbitmq/.erlang.cookie

重新启动master上的服务

rabbitmqctl stop_app
rabbitmq-server -detached
rabbitmqctl start_app

在standby上执行命令,将节点添加到集群中去

rabbitmqctl join_cluster rabbit@VM-0-11-centos

启动standby服务

rabbitmqctl stop_app
rabbitmq-server -detached
rabbitmqctl start_app

此时集群搭建完成
查询集群状态

rabbitmqctl cluster_status

在这里插入图片描述

在管理端查看如下:
在这里插入图片描述

1、镜像集群

镜像集群的一些特点参考:https://zhuanlan.zhihu.com/p/359687822

普通集群模式提高了系统的可靠性和吞吐量,但是没有做到高可用性,因为当某一个节点崩溃了,这个节点的数据就没有办法被消费到。镜像集群模式属于RabbitMq的高可用性的集群部署方案,把所需要的队列做成镜像队列,然后将镜像队列放在多个节点当中。

缺点:镜像队列需要为每个节点同步所有的消息体,所以会导致网络带宽压力很大,提供了数据的冗余备份,会导致存储IO压力变大。

镜像队列间的消息流转

当消费者与master队列建立连接,消费者可以直接从master队列上获取信息,当消费者与slave队列建立连接呢?消费者是从slave队列直接获取数据的吗?当然不是的,消息的流转顺序如下所示:

slave队列先将消费者的请求转发给master队列
然后再由master队列准备好数据返回给slave队列
最后由slave队列将消息返回给消费者
那这样就会有一个疑问?消费者的请求都是由master队列进行处理的,那么消息的负载是不是不能够做到有效的均衡呢?

负载均衡

Rabbit MQ的负载均衡是体现在物理机器层面上的,而不是体现在内存中的队列层面的。这样解释吧,现在有3台物理机,需要创建3个master队列和6个slave队列, 消息的请求负载都在3个master队列上,那么只需要将3个master队列和6个slave队列均匀的分布在3台物理机上,这样在很大程度上实现了每台机器的负载均衡。当然每个master队列消息请求的数量可能会有不同,无法保持绝对的负载均衡。

搭建方案:

接着第一中普通集群的前提下,单间镜像集群的HA方案

./rabbitmqctl set_policy <name> [-p <vhost>] <pattern> <definition> [--apply-to <apply-to>]
    name: 策略名称
    vhost: 指定vhost, 默认值 /
    pattern: 需要镜像的正则
    definition: 
        ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes 
            all     表示在集群所有的节点上进行镜像,无需设置ha-params
            exactly 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定 
            nodes   表示在指定的节点上进行镜像,节点名称通过ha-params指定 
        ha-params: ha-mode 模式需要用到的参数 
        ha-sync-mode: 镜像队列中消息的同步方式,有效值为automatic,manually
    apply-to: 可选值3个,默认all
        exchanges 表示镜像 exchange
        queues    表示镜像 queue
        all       表示镜像 exchange和queue

eg:

rabbitmqctl set_policy test "test" '{"ha-mode":"all","ha-sync-mode":"automatic"}'

也可以通过页面配置:
点击 Admin 选项卡,然后点击右边的 Policies,再点击 Add/update a policy,如下图在这里插入图片描述
此时在页面上随机创建一个queue或者exchange,发现已经添加了镜像,如下所示

exchange:

在这里插入图片描述

queue:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值