RabbitMQ 集群部署详解
一、主机名解析各 MQ 服务器配置本地主机名解析10.0.0.31 mq1.example.local mq110.0.0.32 mq1.example.local mq110.0.0.33 mq1.example.local mq1二、安装RabbitMQsudo apt-get install curl gnupg debian-keyring debian-archive-keyring a
一、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 -y
sudo 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
EOF
sudo apt-get update -y
sudo 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-xmerl
sudo apt-get install rabbitmq-server -y --fix-missing
四、启动服务
systemctl enable --now rabbitmq-server
五、创建 RabbitMQ 集群
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起erlang 的集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个 cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信。
5.1 第一步:各服务器关闭 RabbitMQ
systemctl stop rabbitmq-server
5.2 第二步:在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 第三步:各服务器启动 RabbitMQ
systemctl start rabbitmq-server
5.4 第四步:查看当前集群状态
root@mq1:/var/lib/rabbitmq# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
Basics
Cluster name: rabbit@mq1.example.local #集群名称
Disk Nodes #磁盘节点
rabbit@mq1
Running Nodes #运作中节点
rabbit@mq1
Versions #版本
rabbit@mq1: RabbitMQ 3.9.0 on Erlang 24.0.4
5.5 第五步:创建 RabbitMQ 集群
在 mq-server2 作为内存节点添加到 mq-server1,并作为内存节点,在 mq-server2 执行以下命令
rabbitmqctl stop_app #停止 app 服务
rabbitmqctl reset #清空元数据
rabbitmqctl join_cluster rabbit@mq1 --ram #将rabbitmq-server2添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点
rabbitmqctl start_app #启动 app 服务
在 mq-server3 作为内存节点添加到 mq-server1,并作为内存节点,在 mq-server3 执行以下命令
rabbitmqctl stop_app #停止 app 服务
rabbitmqctl reset #清空元数据
rabbitmqctl join_cluster rabbit@mq1 --ram #将rabbitmq-server2添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点
rabbitmqctl start_app #启动 app 服务
5.6 第六步:将集群设置为镜像模式
只要在其中一台节点执行以下命令即可
rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
5.7 第七步:验证当前集群状态
root@mq1:/var/lib/rabbitmq# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
Basics
Cluster name: rabbit@mq1.example.local
Disk Nodes
rabbit@mq1
RAM Nodes
rabbit@mq2
rabbit@mq3
Running Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3
Versions
rabbit@mq1: RabbitMQ 3.9.0 on Erlang 24.0.4
rabbit@mq2: RabbitMQ 3.9.0 on Erlang 24.0.4
rabbit@mq3: RabbitMQ 3.9.0 on Erlang 24.0.4
5.8 第八步:web 界面验证集群状态
各 RabbitMQ 服务器安装
rabbitmq-plugins enable rabbitmq_management
5.9 第九步:创建账号并授权
rabbitmqctl add_user xiaoming 123456
rabbitmqctl set_user_tags xiaoming administrator
rabbitmqctl set_permissions xiaoming ".*" ".*" ".*"
5.10 第十步:开启 web 插件后的集群状态
更多推荐
所有评论(0)