RabbitMQ——安装、集群搭建、镜像队列配置
一、环境说明
1、Centos7.7-64位
2、Erlang-OTP 23
3、RabbitMQ-3.8.9
操作系统 |
ip |
主机名 |
配置 |
centos 7.7 |
17.16.10.62 |
rabbit-1 |
4核8g |
centos 7.7 |
17.16.10.63 |
rabbit-2 |
4核8g |
centos 7.7 |
17.16.10.66 |
rabbit-3 |
4核8g |
二、下载安装文件
1、RabbitMQ软件:
2、erlang是RabbitMQ的依賴軟件,在erlang官网下载以下版本:
https://github.com/rabbitmq/erlang-rpm/releases/download/v23.2.1/erlang-23.2.1-1.el7.x86_64.rpm
3、把下载的文件分别上传到3台服务器的 /root/soft/rabbitmq 目录下。
三、安装RabbitMQ依赖包
-
安装基础依赖包
1. 配置yum源:
touch /etc/yum.repos.d/rabbitmq_erlang.repo vim /etc/yum.repos.d/rabbitmq_erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/23/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc repo_gpgcheck=0 enabled=1
2. 导入key:
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
注:安装 rabbitMQ 时需要key。
3. 安装socat:
yum -y install epel-release
yum -y install socat
注:安装 rabbitMQ 时需要依赖socat。
-
安装与配置erlang
1. erlang和rabbitmq的版本对应关系
2. 安装erlang
cd /root/soft/rabbitmq rpm -ivh erlang-23.2.1-1.el7.x86_64.rpm
3. 使用以下指令进入erlang如出现以下讯息表示成功安装:
shell>erl
用ctrl+c退出。
四、安装RabbitMQ
- 安装RabbitMQ
cd /root/soft/rabbitmq rpm -ivh rabbitmq-server-3.8.9-1.el7.noarch.rpm
- 在rabbit-1、rabbit-2、rabbit-3上分別配置RabbitMQ:
rabbit-1:
touch /etc/rabbitmq/rabbitmq-env.conf echo "NODENAME=rabbit@rabbit-1" > /etc/rabbitmq/rabbitmq-env.conf
rabbit-2:
touch /etc/rabbitmq/rabbitmq-env.conf echo "NODENAME=rabbit@rabbit-2" > /etc/rabbitmq/rabbitmq-env.conf
rabbit-3:
touch /etc/rabbitmq/rabbitmq-env.conf echo "NODENAME=rabbit@rabbit-3" > /etc/rabbitmq/rabbitmq-env.conf
- 启动RabbitMQ节点
systemctl start rabbitmq-server
注:该命令会同时启动 Erlang 虚拟机和 RabbitMQ 应用服务。而后文用到的 rabbitmqctl start_app
只会启动 RabbitMQ 应用服务, rabbitmqctl stop_app
只会停止 RabbitMQ 服务。
- 查看RabbitMQ节点状态
systemctl status rabbitmq-server
rabbitmqctl status
- 停止RabbitMQ节点
systemctl stop rabbitmq-server
- 开启RabbitMQ管理控制台
rabbitmq-plugins enable rabbitmq_management
五、配置RabbitMQ集群
1. 在3台机器上/etc/hosts文件中添加IP和节点名称的对应:
vi /etc/hosts 172.16.10.62 rabbit-1 172.16.10.63 rabbit-2 172.16.10.66 rabbit-3
2. 在各个RabbitMQ服务器中停止RabbitMQ服务:
rabbitmqctl stop rabbitmq-server
3. 拷贝 cookie
.erlang.cookie
文件拷贝到其他两台主机上。该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,RabbitMQ 服务启动时,erlang VM 会自动创建该 cookie 文件,默认的存储路径为:
/var/lib/rabbitmq/.erlang.cookie
或$HOME/.erlang.cookie
rabbit-1:
登陆第一台rabbit-1机器,拷贝cookie至另外2台机器rabbit-2、rabbit-3:
scp /var/lib/rabbitmq/.erlang.cookie root@172.16.10.63:/var/lib/rabbitmq/ scp /var/lib/rabbitmq/.erlang.cookie root@172.16.10.66:/var/lib/rabbitmq/
rabbit-2:
登录rabbit-2机器执行:
chown -R rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie chmod 600 /var/lib/rabbitmq/.erlang.cookie
rabbit-3:
登录rabbit-3机器执行:
chown -R rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie chmod 600 /var/lib/rabbitmq/.erlang.cookie
4. 启动3个节点上的RabbitMQ服务:
systemctl start rabbitmq-server
5. 在rabbit-2及rabbit-3服务器中使用以下指令把在rabbit-2及rabbit-3服务器中的RabbitMQ服务加入到rabbit-1服务器的rabbitmq集群中:
rabbit-2:
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset
# 3.节点加入 rabbitmqctl join_cluster rabbit@rabbit-1
# 4.启动服务 rabbitmqctl start_app
rabbit-3:
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@rabbit-1
# 4.启动服务
rabbitmqctl start_app
join_cluster
命令有一个可选的参数 --ram
,该参数代表新加入的节点是内存节点,默认是磁盘节点。
如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,如果是磁盘节点,则存储在磁盘中。
内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。
当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。
除非是将 RabbitMQ 用于 RPC 这种需要超低延迟的场景,否则在大多数情况下,RabbitMQ 的性能都是够用的,可以采用默认的磁盘节点的形式。
另外,如果节点以磁盘节点的形式加入,则需要先使用 reset
命令进行重置,然后才能加入现有群集,重置节点会删除该节点上存在的所有的历史资源和数据。
采用内存节点的形式加入时可以略过 reset
这一步,因为内存上的数据本身就不是持久化的。
6. 在rabbit-1服务器上确认rabbitmq集群的信息:
rabbitmqctl cluster_status
六、配置RabbitMQ管理控制面板
1. 创建用户
rabbitmqctl add_user zat zat123
2. 创建vhost
rabbitmqctl add_vhost zat
3. 分配权限
rabbitmqctl set_permissions -p zat zat ".*" ".*" ".*"
4. 赋予admin权限
rabbitmqctl set_user_tags zat administrator
5. 用户zat分配vhost zat的用户许可证
rabbitmqctl set_permissions -p zat zat '.*' '.*' '.*'
6. 登入RabbitMQ管理控制台
http:// 172.16.10.62:15672/#/ 用户zat 密码zat123
七、設置鏡像隊列策略
- 設置
在rabbit-1节点上执行:
rabbitmqctl set_policy -p zat ha-allqueue "^" '{"ha-mode":"all"}'
命令說明:针对指定vhost(zat)下的queue进行设置为镜像队列,即队列会被复制到集群各个节点,各个集群节点交换机、队列、队列内容都保持一致。
- 複製系統
rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
- 驗證
1、在rabbit-1節點增加一個隊列(在vhost下):mirror_queue_test
2、查看mirror_queue_test隊列的列表信息:
3、在列表信息點擊mirror_queue_test,查看它的詳細信息:
注:上圖中該隊列使用了策略(ha-allqueue),有2個鏡像節點(rabbit@rabbit63、rabbit@rabbit66)
4、驗證完成後,在詳細信息介面中,刪除mirror_queue_test隊列:
八、集群节点下线
以上介绍的集群搭建的过程就是服务扩容的过程,如果想要进行服务缩容,即想要把某个节点剔除集群,有两种可选方式:
第一种:可以先使用 rabbitmqctl stop 停止该节点上的服务,然后在其他任意一个节点上执行 forget_cluster_node
命令。
这里以剔除 rabbit-3 上的服务为例,此时可以在 rabbit-1 或 2 上执行下面的命令:
rabbitmqctl forget_cluster_node rabbit@rabbit-3
第二种:先使用 rabbitmqctl stop
停止该节点上的服务,然后再执行 rabbitmqctl reset
这会清空该节点上所有历史数据,并主动通知集群中其它节点它将要离开集群。
九、集群关闭与重启
没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。但是需要保证在重启时,最后关闭的节点最先被启动。
如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。
这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 node1,node2,node3,如果 node1 因为故障暂时没法恢复,此时 node2 和 node3 就无法启动。
想要解决这个问题,可以先将 node1 节点进行剔除,命令如下:
rabbitmqctl forget_cluster_node rabbit@node1 -offline
此时需要加上 -offline
参数,它允许节点在自身没有启动的情况下将其他节点剔除。
十、卸載
停止服务:
rabbitmqctl stop_app
停止进程:
systemctl stop rabbitmq-server
查看进程状态kill 掉erlang相关进程:
ps -ef |grep rabbit
卸载MQ:
yum list|grep rabbitmq
yum -y remove rabbitmq-server.noarch
卸载erlang:
yum list | grep erlang
yum -y remove erlang.x86_64
删除相关文件:
rm -rf /usr/lib64/erlang rm -rf /var/lib/rabbitmq rm -rf /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.9/ rm -rf /etc/rabbitmq/ rm -rf /var/log/rabbitmq