消息队列 / 系统运维

RabbitMQ 集群高可用部署

浅时光博客 · 3月7日 · 2022年 4.3w 次已读

一、环境规划和初始化

1、环境规划

主机名服务器IP应用程序模式
RabbitMQ01192.168.66.140RebbitMQ磁盘节点、管理节点
RabbitMQ02192.168.66.141RebbitMQ内存节点
RabbitMQ03192.168.66.142RebbitMQ内存节点
HAProxy192.168.66.143HAProxy集群负载均衡

2、配置主机名

  • 所有节点执行,注意主机名不要太长,后面创建集群时有可能会因为主机名称太长导致加入集群失败
[root@localhost ~]# hostnamectl set-hostname xxxx

3、关闭防护墙

systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager && systemctl status NetworkManager

4、关闭SELinux

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0 && getenforce

二、RabbitMQ集群部署

集群模式

  • RabbitMQ 的 Cluster 集群模式一般分为两种,普通模式和镜像模式。

普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 rabbit01(或者 rabbit02),rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 rabbit01 或 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么得等 rabbit01 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。

镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现 RabbitMQ 的 HA 高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在 consumer 消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

节点类型

RAM node内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。

Disk node将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。

RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。

认证方式

通过Erlang Cookie,相当于共享秘钥的概念,长度任意,只要所有节点都一致即可。rabbitmq server在启动的时候,erlang VM会自动创建一个随机的cookie文件。cookie文件的位置: /var/lib/rabbitmq/.erlang.cookie 或者/root/.erlang.cookie。我们的为保证cookie的完全一致,采用从一个节点copy的方式,实现各个节点的cookie文件一致。

1、HOST解析

  • 在部署之前需要确保RebbitMQ各节点可以通过主机名解析
cat >> /etc/hosts <<EOF
192.168.66.140  rabbitmq01
192.168.66.141  rabbitmq02
192.168.66.142  rabbitmq03
EOF

2、安装依赖

  • 所有节点都需要安装
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.3.4.8/erlang-23.3.4.8-1.el7.x86_64.rpm

yum install erlang-23.3.4.8-1.el7.x86_64.rpm -y

3、安装服务

  • 所有节点都需要安装
#加速下载地址
wget https://github.91chifun.workers.dev/https://github.com//rabbitmq/rabbitmq-server/releases/download/v3.9.8/rabbitmq-server-3.9.8-1.el7.noarch.rpm

#yum安装服务
yum install rabbitmq-server-3.9.8-1.el7.noarch.rpm -y

三、R原文链接:https://dqzboy.comabbitMQ集群组建

1、集群启动

  • 所有节点执行以下操作,启动集群;都需要先启动服务,让其生成.e原文链接:https://dqzboy.comrlang.cookie文件
systemctl start rabbitmq-server.service

2、同步文件

  • 同步.erlang.cookie文件;该文件在安装了RebbitMQ后会在机器上随机生成 将rebbitmq01节点的.erlang.cookie文件同步给其他节点,注意同步之后检查文件的权限
#拷贝文件之前,先把节点2和3上的rabbitmq服务停止
systemctl stop rabbitmq-server.service

scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq02:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@rabbitmq03:/var/lib/rabbitmq/

#拷贝过去之后节点2和3一定要重新启动服务,然后再进行加入集群
systemctl restart rabbitmq-server.service

3、加入集群

  • rebbitmq02和rebbitmq03节点加入rebbitmq01集群
  • 以下操作在rebbitmq02和rebbitmq03节点上分别执行
注意:默认是磁盘节点,如果是内存节点的话,需要加--ram参数
rabbitmqctl stop_app
# --ram是以内存方式加入
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app

4、验证集群

  • 在任意节点上执行下面的命令查看集群状态
rabbitmqctl cluster_status

5、安装可视化

  • 所有节点都安装,这样界面才会显示收集到的数据,安装完成后通过IP:15672进行访问
rabbitmq-plugins enable rabbitmq_management
  • 账号、密码,默认为guest

6、创建账号

  • 只需要在任意节点上执行即可
(1)添加一个新的/新用户,比如admin和密码admin
rabbitmqctl add_user admin admin

(2)为新用户授予管理访问权限:
rabbitmqctl set_user_tags admin administrator

(3)为新创建的用户设置权限:
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

(4)再次访问页面,输入上面创建的账号密码就可以正常登入进去了

四、RabbitMQ镜像模式

[root@rabbitmq01 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
  • 参数详细介绍:
    • ha-all:为策略名称
    • ^:为匹配符,只有一个 ^ 代表匹配所有
    • ha-mode:为匹配类型,他分为 3 种模式:all:所有(所有的 queue),exctly:部分,nodes:指定

五、RabbitMQ集群负载

1、HAProxy安装

  • 单独部署在一台服务器上,通过如下命令即可安装完成!
yum install haproxy

2、HAProxy配置

vim /etc/haproxy/haproxy.cfg
我们只需要在文件末尾加上如下配置即可!将默认配置文件中global和defaults保留之外,其他的默认配置删除掉


##监控查看本地状态#####
listen admin_stats
    bind *:80
    mode http
    option httplog
    option httpclose
    log 127.0.0.1 local0 err
    stats uri  /haproxy
    stats auth admin:admin     #登录haproxy的用户名和密码
###反代监控
frontend server
    bind *:5670
    log global
    mode tcp
    default_backend rabbitmq
    maxconn 3
backend rabbitmq
    mode        tcp
    log         global
    balance     roundrobin
    server      rabbitmq1 192.168.66.140:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq2 192.168.66.141:5672 check inter 2000s rise 2 fall 3
    server      rabbitmq3 192.168.66.142:5672 check inter 2000s rise 2 fall 3

3、HAProxy访问

#启动服务
systemctl start haproxy
systemctl enable haproxy
  • 浏览器输入:192.168.66.143:80访问;账号密码admin

本文作者:浅时光博客
原文链接:https://www.dqzboy.com/9309.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。