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软件:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.9/rabbitmq-server-3.8.9-1.el7.noarch.rpm

 

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 节点需要通过交换密钥令牌以获得相互认证,
因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。

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进行设置为镜像队列,即队列会被复制到集群各个节点,各个集群节点交换机、队列、队列内容都保持一致。

  • 複製系統
在上面我们指定了 ha-mode 的值为 all ,代表消息会被同步到所有节点的相同队列中。这里我们之所以这样配置,因为我们本身只有三个节点,因此复制操作的性能开销比较小。
如果你的集群有很多节点,那么此时复制的性能开销就比较大,此时需要选择合适的复制系数。通常可以遵循过半写原则,即对于一个节点数为 n 的集群,只需要同步到 n/2+1 个节点上即可。
此时需要同时修改镜像策略为 exactly,并指定复制系数 ha-params,示例命令如下:
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

 

 

posted on 2021-02-24 18:13  曹伟雄  阅读(7230)  评论(1编辑  收藏  举报

导航