千家信息网

centos7.3 rabbitmq集群

发表于:2025-02-12 作者:千家信息网编辑
千家信息网最后更新 2025年02月12日,RabbitMQ集群概述通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接
千家信息网最后更新 2025年02月12日centos7.3 rabbitmq集群

RabbitMQ集群概述

通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收。

这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制。本方案中搭建 3 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务。


安装 Erlang、RabbitMQ

http://yanconggod.blog.51cto.com/1351649/1933009

修改 /etc/hosts

加入集群 3 个节点的对应关系:

10.0.0.231 node1

10.0.0.232 node2

10.0.0.233 node3


设置 Erlang Cookie

RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过yum源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。

本文演示的实例是用源码安装,由于这个文件权限是 400,所以需要先修改 node2、node3 中的该文件权限为 777:

node1:yancongadmin@node1:~$ chmod 777 .erlang.cookienode2:yancongadmin@node2:~$ chmod 777 .erlang.cookieyancongadmin@node2:~$ scp -r node1:/home/yancongadmin/.erlang.cookie ~/yancongadmin@node1's password:.erlang.cookie                                                                                     100%   20     0.0KB/s   00:00node3:yancongadmin@node3:~$ chmod 777 .erlang.cookieyancongadmin@node3:~$ scp -r node1:/home/yancongadmin/.erlang.cookie ~/yancongadmin@node1's password:.erlang.cookie                                                                                     100%   20     0.0KB/s   00:00

分别在node1、node2、node3将权限恢复过来:

yancongadmin@node1:~$ chmod 400 .erlang.cookie

最后分别在确认三台机器上的.erlang.cookie的值是一致的

yancongadmin@node1:~$ cat .erlang.cookieVORMVSAAOFOFEQKTNWBByancongadmin@node2:~$ cat .erlang.cookieVORMVSAAOFOFEQKTNWBByancongadmin@node3:~$ cat .erlang.cookieVORMVSAAOFOFEQKTNWBB

使用detached参数,在后台启动Rabbit Node

yancongadmin@node1:~$ rabbitmqctl stopStopping and halting node rabbit@node1 ...Gracefully halting Erlang VMyancongadmin@node1:~$ rabbitmq-server -detached

通过rabbitmqctl cluster_status命令,可以查看和个节点的状态,节点的名称是rabbit@shorthostname,

node1:yancongadmin@node1:~$ rabbitmqctl cluster_statusCluster status of node rabbit@node1 ...[{nodes,[{disc,[rabbit@node1]}]}, {running_nodes,[rabbit@node1]}, {cluster_name,<<"rabbit@node1">>}, {partitions,[]}, {alarms,[{rabbit@node1,[]}]}]node2:yancongadmin@node2:~$ rabbitmqctl cluster_statusCluster status of node rabbit@node2 ...[{nodes,[{disc,[rabbit@node2]}]}, {running_nodes,[rabbit@node2]}, {cluster_name,<<"rabbit@node2">>}, {partitions,[]}, {alarms,[{rabbit@node2,[]}]}]  node3:yancongadmin@node3:~$ rabbitmqctl cluster_statusCluster status of node rabbit@node3 ...[{nodes,[{disc,[rabbit@node3]}]}, {running_nodes,[rabbit@node3]}, {cluster_name,<<"rabbit@node3">>}, {partitions,[]}, {alarms,[{rabbit@node3,[]}]}]

将node1、node2、node3组成集群

因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。如果使用./rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。

node2:yancongadmin@node2:~$ rabbitmqctl stop_appStopping node rabbit@node2 ...yancongadmin@node2:~$ rabbitmqctl join_cluster rabbit@node1Clustering node rabbit@node2 with rabbit@node1 ...yancongadmin@node2:~$ rabbitmqctl start_appStarting node rabbit@node2 ...node3:yancongadmin@node3:~$ rabbitmqctl stop_appStopping node rabbit@node3 ...yancongadmin@node3:~$ rabbitmqctl join_cluster rabbit@node1Clustering node rabbit@node3 with rabbit@node1 ...yancongadmin@node3:~$ rabbitmqctl start_appStarting node rabbit@node3 ...

此时 node2 与 node3 也会自动建立连接。


如果要使用内存节点,则可以使用以下命令:

yancongadmin@node2:~$ rabbitmqctl join_cluster --ram rabbit@node1

集群配置好后,可以在 RabbitMQ 任意节点上执行 rabbitmqctl cluster_status 来查看是否集群配置成功。

node1:yancongadmin@node1:~$ rabbitmqctl cluster_statusCluster status of node rabbit@node1 ...[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}, {running_nodes,[rabbit@node1]}, {cluster_name,<<"rabbit@node1">>}, {partitions,[]}, {alarms,[{rabbit@node1,[]}]}]node2:yancongadmin@node2:~$ rabbitmqctl cluster_statusCluster status of node rabbit@node2 ...[{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},{alarms,[{rabbit@node1,[]}]}]node3:yancongadmin@node3:~$ rabbitmqctl cluster_statusCluster status of node rabbit@node3 ...[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]}, {alarms,[{rabbit@node1,[]}]}]

RabbitMQ镜像功能

使用Rabbit镜像功能,需要基于RabbitMQ策略来实现,策略是用来控制和修改群集范围的某个vhost队列行为和Exchange行为

yancongadmin@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'

这行命令在vhost名称为hrsystem创建了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 "^" 表示所有匹配所有队列名称。

例如下面的命令,^message 这个规则要根据自己修改,这个是指同步"message"开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"^"。

yancongadmin@node2:~$ rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'

在任意一个节点上执行:

yancongadmin@node2:#  rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'Setting policy "ha-all" for pattern "^" to "{\"ha-mode\":\"all\"}" with priority "0"

将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。

我使用过的例子,仅供参考:

rabbitmqctl set_policy ha-xxx "^cn\.xxx" \   '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic","ha-promote-on-shutdown":"always","ha-sync-batch-size":20}'   rabbitmqctl set_policy queue-xxx "^queue" \   '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic","ha-promote-on-shutdown":"always","ha-sync-batch-size":20}'


如果需要负载均衡器,需要安装并配置 HAProxy

例如:

listen rabbitmq_cluster 0.0.0.0:5672 mode tcpbalance roundrobin server   node1 10.0.0.231:5672 check inter 2000 rise 2 fall 3 server   node2 10.0.0.232:5672 check inter 2000 rise 2 fall 3server   node3 10.0.0.233:5672 check inter 2000 rise 2 fall 3

参考:http://idoall.org/blog/post/lion/15

节点 队列 集群 策略 应用 名称 命令 文件 状态 镜像 服务 配置 权限 一致 功能 模式 消息 源码 行为 表达式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 胶州商城软件开发公司有哪些 萍乡手机软件开发 中国解决网络安全问题的办法 软件开发属于注册商标第几类 图片存数据库什么类型 学历低能做软件开发吗 网络安全等级防护应包括什么内容 即墨区app定制软件开发公司 乐高无限不用连接服务器版下载 云时代服务器租赁的优势 赣州哪个软件开发好 星际2服务器 200台服务器亏损 政府单位网络安全的背景 服务器怎么调节分辨率 上海综合软件开发价格大全 数据库中查询指定条件的人数 中山市钻淘网络技术有限公司 软件开发方向及职业规划 国人steam用哪里的服务器 千牛服务器响应不安全 2022年国产数据库排行榜 腾讯云服务器技术服务电话 有计算机网络技术专业的本科 贪婪洞窟2服务器怎么不能换 水星服务器推荐 崩坏三一个号可以有两个服务器吗 mysql数据库自动消息提示 域服务器 域名 金山区网络技术转让推荐咨询
0