RabbitMQ集群
1.0 集群介绍与思路
- 推荐RabbitMQ镜像集群模式,
-
集群中有两种节点类型:
内存节点:只将数据保存到内存
磁盘节点:保存数据到内存和磁盘。 -
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们,否则所有数据消息在服务器全部停机之后都会丢失。
-
推荐设计架构:
在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作为数据备份使用。
1.1 环境准备
节点名称 | 节点名称 | ip地址 |
---|---|---|
rabbitmq1 | rabbitmq1 | 10.0.0.110 |
rabbitmq2 | rabbitmq2 | 10.0.0.111 |
rabbitmq3 | rabbitmq3 | 10.0.0.112 |
1.2 安装
- 三台机器要安装版本一致
参考官网编写安装脚本
rabbit官网安装方法 https://www.rabbitmq.com/install-debian.html
#!/usr/bin/sh
HOST=`hostname -I|awk '{print $1}'`
GREEN="echo -e \E[32;1m"
END="\E[0m"
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
## rabbit官网安装方法 https://www.rabbitmq.com/install-debian.html
install_base() {
apt update -y
##安装基本依赖项和apt HTTPS 传输
apt -y install curl gnupg apt-transport-https
}
add_key() {
## -------------------
## 添加存储库签名密钥
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
curl -1sLf "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xf77f1eda57ebb1cc" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg > /dev/null
curl -1sLf "https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.packagecloud.rabbitmq.gpg > /dev/null
## -------------------
}
add_list() {
## 添加源列表文件
tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
## "bionic" as distribution name should work for any reasonably recent Ubuntu or Debian release.
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
deb-src [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
## Provides RabbitMQ
##
## "bionic" as distribution name should work for any reasonably recent Ubuntu or Debian release.
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
deb-src [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
EOF
## 更新软件源
apt update -y
}
install_erlang() {
## 安装erlang
apt 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
}
install_rabbitmq() {
## 安装rabbitmq-server
apt install rabbitmq-server -y --fix-missing
## 启用可视化web操作界面
rabbitmq-plugins enable rabbitmq_management
## 启动rabbitmq服务
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
if [ $? -eq 0 ] ;then
color "rabbitmq 安装成功!" 0
echo "-------------------------------------------------------------------"
echo -e "访问rabbitmq链接: \c"
${GREEN}"http://$HOST:15672/"${END}
else
color "rabbitmq 安装失败!" 1
exit 1
fi
}
install_base
add_key
add_list
install_erlang
install_rabbitmq
1.3 主机名解析
- 三台机器都要做解析
root@rabbitmq1:~# vi /etc/hosts
10.0.0.110 rabbitmq1
10.0.0.111 rabbitmq2
10.0.0.112 rabbitmq3
1.4 复制erlang.cookie
Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信。
#三台机器停止服务
root@rabbitmq1:~# systemctl stop rabbitmq-server
root@rabbitmq2:~# systemctl stop rabbitmq-server
root@rabbitmq3:~# systemctl stop rabbitmq-server
#任意一台erlang.cookie拷贝到其他两台机器
```bash
root@rabbitmq1:~# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 57 Dec 31 12:39 /var/lib/rabbitmq/.erlang.cookie
#拷贝到其他两台机器
root@rabbitmq1:~# scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.111:/var/lib/rabbitmq/.erlang.cookie
root@rabbitmq1:~# scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.112:/var/lib/rabbitmq/.erlang.cookie
#三台机器启动服务
root@rabbitmq1:~# systemctl start rabbitmq-server
root@rabbitmq2:~# systemctl start rabbitmq-server
root@rabbitmq3:~# systemctl start rabbitmq-server
1.5 查看单节点状态
rabbitmqctl cluster_status
1.6 创建 RabbitMQ 集群
磁盘节点: rabbitmq3
内存节点: rabbitmq1、rabbitmq2
各节点名称:rabbit@rabbitmq1、 rabbit@rabbitmq2、 rabbit@rabbitmq3
10.0.0.110 rabbitmq1 机器上操作
# 停止app写入服务
root@rabbitmq1:~# rabbitmqctl stop_app
#清空元数据
root@rabbitmq1:~# rabbitmqctl reset
#将 rabbitmq-server1 添加到集群当中,并成为内存节点,不加--ram 默认是磁盘节点
root@rabbitmq1:~# rabbitmqctl join_cluster rabbit@rabbitmq3 --ram
Clustering node rabbit@rabbitmq1 with rabbit@rabbitmq3
10.0.0.111 rabbitmq2 机器上操作
# 停止app写入服务
root@rabbitmq2:~# rabbitmqctl stop_app
#清空元数据
root@rabbitmq2:~# rabbitmqctl reset
#将 rabbitmq-server1 添加到集群当中,并成为内存节点,不加--ram 默认是磁盘节点
root@rabbitmq2:~# rabbitmqctl join_cluster rabbit@rabbitmq3 --ram
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq3
1.7 将集群设置为镜像模式
- 只要在其中一台节点执行以下命令即可:
root@rabbitmq1:~# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
1.8 验证集群状态
任意一台都行
如10.0.0.112 rabbitmq3 机器上操作
查看集群状态
rabbitmqctl cluster_status
1.9 web 界面验证集群状态
10.0.0.112 rabbitmq3 机器上操作
创建登录用户
root@rabbitmq3:~# rabbitmqctl add_user tom 123456
Adding user "tom" ...
Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
用户赋予管理员权限
root@rabbitmq3:~# rabbitmqctl set_user_tags tom administrator
Setting tags for user "tom" to [administrator] ...
各服务器启动 web 插件
root@rabbitmq1:~# rabbitmq-plugins enable rabbitmq_management
root@rabbitmq2:~# rabbitmq-plugins enable rabbitmq_management
root@rabbitmq3:~# rabbitmq-plugins enable rabbitmq_management
- 浏览器输入10.0.0.112:15672,用户名tom,密码123456