一、RabbitMQ 两种集群部署方式
1.1 普通集群模式
queue 创建之后,如果没有其它 policy,消息实体只存在于其中 一个节点,A、B 两个 Rabbitmq 节点仅有相同的元数据,即队列结构,但队列的 数据仅保存有一份,即创建该队列的 rabbitmq 节点(A 节点),当消息进入 A 节 点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行 消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer,所以 consumer 可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后, B 节点无法取到 A 节点中还未消费的消息实体。
1.2 镜像集群模式
把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案(镜 像模式是在普通模式的基础上,增加一些镜像策略)
该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消 息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取,该模 式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之 大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在 对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy, 然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集 群模式或镜像队列。
1.3 集群中有两种节点类型
内存节点:只将数据保存到内存
磁盘节点:保存数据到内存和磁盘
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们, 否则所有数据消息在服务器全部停机之后都会丢失。
推荐设计架构: 在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节 点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作 为数据备份使用。
二、主机名解析
各 MQ 服务器配置本地主机名解析
10.0.0.31 mq1.example.local mq1
10.0.0.32 mq2.example.local mq2
10.0.0.33 mq3.example.local mq3
三、安装RabbitMQ
sudo apt-get install curl gnupg debian-keyring debian-archive-keyring apt-transport-https -ysudo apt-key adv --keyserver "hkps://keys.openpgp.org" --recv-keys "0x0A9AF2115F4687BD29803A206B73A36E6026DFCA"curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key | sudo apt-key add -curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key | sudo apt-key add -sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main
deb-src https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main## Provides RabbitMQ
##
deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
deb-src https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
EOFsudo apt-get update -ysudo apt-get install -y erlang-base \erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \erlang-runtime-tools erlang-snmp erlang-ssl \erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerlsudo apt-get install rabbitmq-server -y --fix-missing
四、启动服务
systemctl enable --now rabbitmq-server
五、创建 RabbitMQ 集群
Rabbitmq 的集群是依赖于 erlang 的集群来工作的&#xff0c;所以必须先构建起erlang 的集群环境&#xff0c;而 Erlang 的集群中各节点是通过一个 magic COOKIE 来实现的&#xff0c;这个 COOKIE 存放在 /var/lib/rabbitmq/.erlang.COOKIE 中&#xff0c;文件是 400 的权限,所以必须保证各节点 COOKIE 保持一致&#xff0c;否则节点之间就无法通信。
5.1 第一步&#xff1a;各服务器关闭 RabbitMQ
systemctl stop rabbitmq-server
5.2 第二步&#xff1a;在mq-server1同步.erlang.COOKIE至其他两台服务器
scp /var/lib/rabbitmq/.erlang.COOKIE 10.0.0.32:/var/lib/rabbitmq/.erlang.COOKIE
scp /var/lib/rabbitmq/.erlang.COOKIE 10.0.0.33:/var/lib/rabbitmq/.erlang.COOKIE
5.3 第三步&#xff1a;各服务器启动 RabbitMQ
systemctl start rabbitmq-server
5.4 第四步&#xff1a;查看当前集群状态
root&#64;mq1:/var/lib/rabbitmq
Cluster status of node rabbit&#64;mq1 ...
BasicsCluster name: rabbit&#64;mq1.example.local Disk Nodes rabbit&#64;mq1Running Nodes rabbit&#64;mq1Versions rabbit&#64;mq1: RabbitMQ 3.9.0 on Erlang 24.0.4
5.5 第五步&#xff1a;创建 RabbitMQ 集群
在 mq-server2 作为内存节点添加到 mq-server1&#xff0c;并作为内存节点&#xff0c;在 mq-server2 执行以下命令
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit&#64;mq1 --ram
rabbitmqctl start_app
在 mq-server3 作为内存节点添加到 mq-server1&#xff0c;并作为内存节点&#xff0c;在 mq-server3 执行以下命令
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit&#64;mq1 --ram
rabbitmqctl start_app
5.6 第六步&#xff1a;将集群设置为镜像模式
只要在其中一台节点执行以下命令即可
rabbitmqctl set_policy ha-all "#" &#39;{"ha-mode":"all"}&#39;
5.7 第七步&#xff1a;验证当前集群状态
root&#64;mq1:/var/lib/rabbitmq
Cluster status of node rabbit&#64;mq1 ...
BasicsCluster name: rabbit&#64;mq1.example.localDisk Nodesrabbit&#64;mq1RAM Nodesrabbit&#64;mq2
rabbit&#64;mq3Running Nodesrabbit&#64;mq1
rabbit&#64;mq2
rabbit&#64;mq3Versionsrabbit&#64;mq1: RabbitMQ 3.9.0 on Erlang 24.0.4
rabbit&#64;mq2: RabbitMQ 3.9.0 on Erlang 24.0.4
rabbit&#64;mq3: RabbitMQ 3.9.0 on Erlang 24.0.4
5.8 第八步&#xff1a;web 界面验证集群状态
各 RabbitMQ 服务器安装
rabbitmq-plugins enable rabbitmq_management
5.9 第九步&#xff1a;创建账号并授权
rabbitmqctl add_user xiaoming 123456
rabbitmqctl set_user_tags xiaoming administrator
rabbitmqctl set_permissions xiaoming ".*" ".*" ".*"
5.10 第十步&#xff1a;开启 web 插件后的集群状态