背景
项目需要用到 RabbitMQ
,同时要求做镜像集群。
实战
以下实验基于 Centos6
,RabbitMQ 3.8.3
系统版本 | ip | 主机名 |
---|---|---|
Centos 6 | 192.168.201.170 | mq1 |
Centos 6 | 192.168.201.171 | mq2 |
Centos 6 | 192.168.201.172 | mq3 |
三台服务器记得配置好 hosts
cat <<EOF>> /etc/hosts
192.168.201.170 mq1
192.168.201.171 mq2
192.168.201.172 mq3
EOF
安装
# 三台都要操作
wget https://mirrors.huaweicloud.com/rabbitmq-server/v3.8.3/rabbitmq-server-3.8.3-1.el6.noarch.rpm
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v22.3.2/erlang-22.3.2-1.el6.x86_64.rpm
yum localinstall erlang-22.3.2-1.el6.x86_64.rpm rabbitmq-server-3.8.3-1.el6.noarch.rpm -y
配置
# 三台都要操作
# 安装简单,配置比较麻烦
# 我这里需要修改 RabbitMQ 的默认数据目录
mkdir -p /data/rabbitmq/{mnesia,log}
chown -R rabbitmq.rabbitmq /data/rabbitmq/
cat <<EOF> /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/data/rabbitmq/log
EOF
#不知道为什么,只要修改过 /etc/rabbitmq 的文件,就要重新授权
chown -R rabbitmq.rabbitmq /etc/rabbitmq/
# 启动
/etc/init.d/rabbitmq-server start
# 启用 web 界面,此处必须,不然搭建集群会提示 “Node statistics not available”
rabbitmq-plugins enable rabbitmq_management
# 查看状态
/etc/init.d/rabbitmq-server status
搭建普通集群
前面我们在安装 RabbitMQ
的时候也装了 erlang
,装完以后本机会出现一个隐藏文件叫 .erlang.cookie
,路径在 $HOME
和 /var/lib/rabbitmq/.erlang.cookie
,但是官方文档说的是或,不清楚为什么我这里三个路径都有。
On UNIX systems, the cookie will be typically located in
/var/lib/rabbitmq/.erlang.cookie
(used by the server) and$HOME/.erlang.cookie
(used by CLI tools). Note that since the value of$HOME
varies from user to user, it's necessary to place a copy of the cookie file for each user that will be using the CLI tools. This applies to both non-privileged users androot
.
这玩意干嘛用的呢?RabbitMQ
的集群是依赖erlang
集群,而 erlang
集群是通过这个cookie
进行通信认证的,所以要保证所有机器的 .erlang.cookie
内容一致,且为只读权限。
所以可以把 mq1
的 .erlang.cookie
复制到 mq2
、mq3
机器,然后修改权限
# mq1 操作
scp /var/lib/rabbitmq/.erlang.cookie 192.168.201.171:/var/lib/rabbitmq
# mq2 操作
chmod 400 /var/lib/rabbitmq/.erlang.cookie
mq2
、mq3
加入集群
rabbitmqctl stop_app
# => Stopping node rabbit@mq2 ...done.
rabbitmqctl reset
# => Resetting node rabbit@mq2 ...
# 如果要设置为内存节点,则改为 rabbitmqctl join_cluster --ram rabbit@mq1
rabbitmqctl join_cluster rabbit@mq1
# => Clustering node rabbit@mq2 with [rabbit@mq1] ...done.
rabbitmqctl start_app
# => Starting node rabbit@mq2 ...done.
查看集群状态
rabbitmqctl cluster_status
...
Basics
Cluster name: rabbit@mq1
Disk Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3
Running Nodes
rabbit@mq1
rabbit@mq2
rabbit@mq3
...
镜像集群
J简单的说,镜像队列机制就是将队列在 N 个节点之间设置主从关系,消息会在 N 个节点之间进行自动同步,且如果其中一个节点不可用,并不会导致消息丢失或服务不可用的情况,提升 MQ 集群的整体高可用性。
配置
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'