配置集群前须知
主机名解析
RabbitMQ节点使用域名相互寻址,因此所有集群成员的主机名必须能够从所有集群节点解析,可以修改hosts文件或者使用DNS解析
如果要使用节点名称的完整主机名(RabbitMQ默认为短名称),并且可以使用DNS解析完整的主机名,则可能需要调查设置环境变量 RABBITMQ_USE_LONGNAME = true
创建集群的方法用多种
通过配置文件
rabbitmqctl手动配置
通过插件(如:AWS(EC2)实例发现,Kubernetes发现,基于Consul的发现,基于etcd的发现)
一个集群的组成可以动态改变,所有的RabbitMQ开始作为单个节点运行,这些节点可以加入到集群,然后也可以再次脱离集群转回单节点
RabbitMQ集群可以容忍单个节点的故障。节点可以随意启动和通知,只要它们可以与在关闭时已知的集群成员节点联系
集群意味着在局域网使用,不建议运行跨广域网的集群
节点可以是disk节点或RAM节点
RAM节点将内部数据库表存储在RAM中。这不包括消息,消息存储索引,队列索引和其他节点状态
RAM节点只将其元数据保存在内存中。由于RAM节点不必像光盘节点那样写入光盘,它们可以更好地执行。但是请注意,由于永久队列数据总是存储在磁盘上,因此性能改进将仅影响资源管理(例如添加/删除队列,交换或虚拟主机),但不会影响发布速度或消耗速度
RAM节点是高级用例; 设置你的第一个群集时,你应该不使用它们。您应该有足够的光盘节点来处理您的冗余要求,然后在需要时添加额外的RAM节点进行缩放
对性能改善不大,这里不使用,不建议使用
安装
rabbitmqctl配置集群 hostname ip rabbit1 192.168.170.10 rabbit2 192.168.170.14 rabbit1安装如下 [root@master ~]#hostname rabbit1 终端重新登录,使显示生效 主机名永久生效 [root@rabbit1 ~]#cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=rabbit1 [root@rabbit1 ~]#cat /etc/hosts 192.168.170.10 rabbit1 192.168.170.14 rabbit2 [root@rabbit1 ~]#yi rabbitmq-server [root@rabbit1 ~]#cd /var/lib/rabbitmq/ [root@rabbit1 /var/lib/rabbitmq]#ll -a total 8 drwxr-x--- 2 rabbitmq rabbitmq 4096 Aug 24 2013 . drwxr-xr-x. 22 root root 4096 Jul 21 22:42 .. [root@rabbit1 /var/lib/rabbitmq]#openssl rand -base64 20 > .erlang.cookie [root@rabbit1 /var/lib/rabbitmq]#chown rabbitmq.rabbitmq .erlang.cookie [root@rabbit1 /var/lib/rabbitmq]#chmod 400 .erlang.cookie [root@rabbit1 /var/lib/rabbitmq]#service rabbitmq-server restart Restarting rabbitmq-server: RabbitMQ is not running SUCCESS rabbitmq-server. [root@rabbit1 /var/lib/rabbitmq]#iptables -F rabbit2安装如下 [root@master ~]#hostname rabbit2 终端重新登录,使显示生效 主机名永久生效 [root@rabbit2 ~]#cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=rabbit2 [root@rabbit2 ~]#cat /etc/hosts 192.168.170.10 rabbit1 192.168.170.14 rabbit2 [root@rabbit2 ~]#yi rabbitmq-server [root@rabbit2 ~]#cd /var/lib/rabbitmq/ [root@rabbit1 ~]#scp -P 22222 /var/lib/rabbitmq/.erlang.cookie 192.168.170.14:/var/lib/rabbitmq/ [root@rabbit2 /var/lib/rabbitmq]#chown rabbitmq.rabbitmq .erlang.cookie [root@rabbit2 /var/lib/rabbitmq]#chmod 400 .erlang.cookie [root@rabbit2 /var/lib/rabbitmq]#service rabbitmq-server restart Restarting rabbitmq-server: RabbitMQ is not running SUCCESS rabbitmq-server. [root@rabbit2 /var/lib/rabbitmq]#iptables -F
注意
如果服务启动出错,可以查看启动日志:/var/log/rabbitmq
将所有相关的进程都杀掉,然后重启服务
集群通信应该是通过:36254端口进行通信的,这里将防火墙全部关闭了
设置节点互相验证:Erlang Cookie
RabbitMQ节点和CLI工具(例如rabbitmqctl)使用cookie来确定它们是否被允许相互通信,要使两个节点能够通信,它们必须具有相同的共享密钥,称为Erlang Cookie.
Cookie只是一个字符串,最多可以有255个字符。它通常存储在本地文件中。该文件必须只能由所有者访问(400权限)。每个集群节点必须具有相同的 cookie,文件位置/var/lib/rabbitmq/.erlang.cookie, 把rabbit2设置成和rabbit1一样的即可,权限是400,rabbit1的cookie是通过随机数生成的
集群的加入和移除
现在启动了2个独立的RabbitMQ,我们用cluster_status命令查看集群状态 [root@rabbit1 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1]}]}, {running_nodes,[rabbit@rabbit1]}, {partitions,[]}] ...done. [root@rabbit2 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2]}, {partitions,[]}] ...done. 为了连接集群中的2个节点,我们把rabbit@c2节点加入到rabbit@c1节点集群 首先,在rabbit@c1的簇中加入rabbit@c2 1、停止rabbir@c2的rabbitmq应用程序, 2、加入rabbit@c1集群 3、然后启动RabbitMQ程序 注意:加入集群会隐式重置节点,从而删除此节点上以前存在的所有资源和数据 [root@rabbit2 ~]#rabbitmqctl stop_app Stopping node rabbit@rabbit2 ... ...done. [root@rabbit2 ~]#rabbitmqctl join_cluster rabbit@rabbit1 Clustering node rabbit@rabbit2 with rabbit@rabbit1 ... ...done. [root@rabbit2 ~]#rabbitmqctl start_app Starting node rabbit@rabbit2 ... ...done. 现在我们在rabbit1、rabbit2任意一个节点上查看集群状态,我们可以看到这两个节点加入了一个集群 [root@rabbit1 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}, {partitions,[]}] ...done. [root@rabbit2 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}, {partitions,[]}] ...done. 通过遵循上述步骤,我们可以在集群正在运行的同时随时向集群添加新节点 已加入群集的节点可随时停止。他们也可以崩溃。在这两种情况下,群集的其余部分都会继续运行,并且节点在再次启动时会自动“跟上”(同步)其他群集节点。 我们关闭rabbit@rabbit2,并检查每一步中的集群状态 [root@rabbit2 ~]#rabbitmqctl stop_app Stopping node rabbit@rabbit2 ... ...done. [root@rabbit1 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit1]}, {partitions,[]}] ...done. [root@rabbit2 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}] ...done. 现在我们再次启动节点,在我们继续检查集群状态时 [root@rabbit2 ~]#rabbitmqctl start_app Starting node rabbit@rabbit2 ... ...done. [root@rabbit1 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}, {partitions,[]}] ...done. [root@rabbit2 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}, {partitions,[]}] ...done. 一些重要的警告: 当整个集群关闭时,最后一个关闭的节点必须是第一个要联机的节点。 如果要脱机的最后一个节点无法恢复,可以使用forget_cluster_node命令将其从群集中删除 如果所有集群节点同时停止并且不受控制(例如断电),则可能会留下所有节点都认为其他节点在其后停止的情况。在这种情况下,您可以在一个节点上使用force_boot命令使其再次可引导 集群移除节点 当节点不再是节点的一部分时,需要从集群中明确地删除节点。我们首先从集群中删除rabbit@rabbit3,并将其返回到独立操作 在rabbit@rabbit2上: 1、我们停止RabbitMQ应用程序, 2、重置节点 3、重新启动RabbitMQ应用程序 [root@rabbit2 ~]#rabbitmqctl stop_app Stopping node rabbit@rabbit2 ... ...done. [root@rabbit2 ~]#rabbitmqctl reset Resetting node rabbit@rabbit2 ... ...done. [root@rabbit2 ~]#rabbitmqctl start_app Starting node rabbit@rabbit2 ... ...done. [root@rabbit1 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1]}]}, {running_nodes,[rabbit@rabbit1]}, {partitions,[]}] ...done. [root@rabbit2 ~]#rabbitmqctl cluster_status Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2]}, {partitions,[]}] ...done.
注意
主机名更改
RabbitMQ节点使用主机名相互通信。因此,所有节点名称必须能够解析所有集群对等的名称。像rabbitmqctl这样的工具也是如此
除此之外,默认情况下RabbitMQ使用系统的当前主机名来命名数据库目录。如果主机名更改,则会创建一个新的空数据库。为了避免数据丢失,建立一个固定和可解析的主机名至关重要。每当主机名更改时,您应该重新启动RabbitMQ
如果要使用节点名称的完整主机名(RabbitMQ默认为短名称),并且可以使用DNS解析完整的主机名,则可能需要调查设置环境变量 RABBITMQ_USE_LONGNAME = true
从客户端连接到群集
客户端可以正常连接到群集中的任何节点。如果该节点出现故障,并且集群的其余部分仍然存在,那么客户端应该注意到已关闭的连接,并且应该能够重新连接到群集的一些幸存的成员。通常,将节点主机名或IP地址烧入客户端应用程序是不可取的:这会引入不灵活性,并且如果集群配置发生更改或集群中节点数发生更改,则需要编辑,重新编译和重新部署客户端应用程序。相反,我们推荐一个更抽象的方法:这可能是一个动态的DNS服务,它具有非常短的TTL配置,或者一个普通的TCP负载均衡器,或者用起搏器或类似技术实现的某种移动IP。一般来说
管理界面查看
只有两台设备都启用了web管理插件,管理界面才会有两个节点的具体情况信息,不然会显示一台机器状态不正常
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
–
–
–
评论前必须登录!
注册