赞
踩
目前有3台虚拟机已安装了rabbitmq 参考 rabbitmq安装
修改主机名以便统一管理
192.168.8.128 yzm1
192.168.8.129 yzm2
192.168.8.130 yzm3
# 修改主机名
hostnamectl set-hostname yzm1
# 重启使新主机名生效
reboot
修改主机名导致rabbitmq数据丢失的处理方式,请参考 这一篇
修改hosts文件
vim /etc/hosts
# 内容
192.168.8.128 yzm1
192.168.8.129 yzm2
192.168.8.130 yzm3
.erlang.cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。
rabbitmq启动后, 会在路径 /var/lib/rabbitmq/ 或 $HOME/创建一个隐藏文件.erlang.cookie,通过 ls -al 命令查看。
ls -al /var/lib/rabbitmq/
同步.erlang.cookie文件前,关闭每台机器的rabbitmq服务
systemctl stop rabbitmq-server
通过scp同步
scp /var/lib/rabbitmq/.erlang.cookie root@yzm2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@yzm2:/var/lib/rabbitmq/
查看yzm2、yzm3的.erlang.cookie文件内容跟yzm1的一致。
当前.erlang.cookie只有可读权限,新增可写权限
chmod 600 /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/
开通 EPMD 端口 epmd进程使用的端口。用于RabbitMQ节点和CLI工具的端点发现服务。
#开启防火墙 4369 端口
firewall-cmd --zone=public --add-port=4369/tcp --permanent
firewall-cmd --reload
# 或直接关闭防火墙
systemctl stop firewalld
开启服务(每台机器)
systemctl start rabbitmq-server
集群搭建,以yzm1为主节点,yzm2、yzm3作为副节点加入到yzm1主节点中
在yzm2、yzm3机器上执行以下命令:
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态(会删除用户数据)
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@yzm1
# 4.启动服务
rabbitmqctl start_app
查看集群状态,在任意一台机器上输入以下命令
rabbitmqctl cluster_status
在页面上查看
所有队列开启镜像配置
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
符合正则匹配的队列开启镜像配置(以下配置只会对 ha 开头的队列进行镜像)
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
复制系数
在上面我们指定了 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"}'
join_cluster 命令有一个可选的参数 --ram ,该参数代表新加入的节点是内存节点,默认是磁盘节点。如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,如果是磁盘节点,则存储在磁盘中。内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。
更改yzm2的节点类型disk 为 ram
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态(删除用户数据)
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@yzm1 --ram
# 4.重启服务
rabbitmqctl start_app
# 查看集群状态
rabbitmqctl cluster_status
还可以通过change_cluster_node_type命令修改
修改yzm3为ram
# 1.停止服务
rabbitmqctl stop_app
# 2.变更类型 ram disc
rabbitmqctl change_cluster_node_type ram
# 3.重启服务
rabbitmqctl start_app
没有可以直接关闭整个集群的命令,需要逐一进行关闭。
yzm3节点自动退出
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset
yzm2节点(需要先rabbitmqctl stop_app)被yzm1(正常运行的节点)踢出
rabbitmqctl forget_cluster_node rabbit@yzm2
关闭顺序:先内存节点 后磁盘节点
启动顺序:先磁盘节点 后内存节点
重启需要确保第一个启动的是最后一个关闭的节点,如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败
重启过程可以发生的 一些故障问题,请参考 这篇
# 正常退出
systemctl stop rabbitmq-server
# 如果遇到不能正常退出直接kill进程,查看进程
ps aux|grep rabbitmq
kill -9 端口
# 清楚节点rabbitmq配置
rm -rf /var/lib/rabbitmq/mnesia/*
# 确保mnesia目录的用户和组都是rabbitmq
chown rabbitmq:rabbitmq /var/lib/rabbitmq/mnesia
rabbitmqctl stop_app
表示终止RabbitMQ的应用,但是Erlang节点还在运行。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之前,例如 reset
rabbitmqctl reset
表示设置RabbitMQ节点为原始状态。会从该节点所属的cluster中删除,从管理数据库中删除所有数据,例如配置的用户和vhost,还会删除所有的持久消息。
rabbitmqctl force_reset
表示强制性地设置RabbitMQ节点为原始状态。它和reset的区别在于,可以忽略目前管理数据库的状态和cluster的配置,无条件的reset。该方法的使用,应当用在当数据库或者cluster配置损坏的情况下作为最后的方法。
要想reset和force_reset操作执行成功,RabbitMQ应用需要处于停止状态,即执行过 stop_app
rabbitmqctl start_app
表示启动RabbitMQ的应用。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之后,例如 reset
rabbitmqctl join_cluster {clusternode} [–ram]
表示结合到指定的集群,如果有参数 --ram 表示作为RAM节点结合到该集群中。
集群节点有两种类型: disc 和 ram。disc类型,复制数据在磁盘上,在节点失效的情况下,提供了冗余保证,也能从一些全局事件中恢复,例如所有节点失效。ram类型,复制数据在内存上,主要表现在伸缩性上,特别是在管理资源(例如:增加删除队列,交换器,或者绑定)上表现突出。
一个集群必须至少含有一个disc节点,但通常都多余一个。
rabbitmqctl cluster_status
表示显示集群中的所有节点信息
rabbitmqctl change_cluster_node_type {disc|ram}
表示改变节点的类型。该操作的正确执行,必定会停止该节点。并且在调整一个node为ram类型时,该节点不能为该集群的唯一node
rabbitmqctl forget_cluster_node [–offline]
表示远程移除一个集群节点。要删除的节点必须脱机,如果没有脱机,需要使用 --offline 参数。当使用 --offline 参数时,rabbitmqctl不会去连接节点,而是暂时变成节点,以便进行变更。这在节点不能正常启动时非常有用。在这种情况下,节点会成为集群元数据的规范来源(例如哪些队列存在)。因此如果可以的话,应该使用此命令在最新的节点上关闭。
–offline 参数使节点从脱机节点上移除。使用场景主要是在所有节点脱机,且最后一个节点无法联机时,从而防止整个集群启动。在其他情况不应该使用,否则会导致不一致。
例如 rabbitmqctl -n A forget_cluster_node B
上述命令将从节点 A 中移除节点 B
rabbitmqctl force_boot
表示强制确保节点启动,即使该节点并不是最后down的。
一般情况下,当你同时shut down了RabbitMQ集群时,第一个重启的节点应该是最后一个down掉的,因为它可能已经看到了其他节点发生的事情。但是有时候这并不可能:例如当整个集群lose power,那么该集群的所有节点会认为他们不是最后一个关闭的。
如果最后down的节点永久的lost,那么应该优先使用 rabbitmqctl forget_cluster_node --offline ,因为这将确保在丢失节点上的镜像队列得到优先处理。
rabbitmqctl update_cluster_nodes {clusternode}
表示指示已经集群的节点在唤醒时联系 {clusternode} 进行集群。这与 join_cluster 命令不同,因为它不加入任何集群,它是检查节点是否已经在具有 {clusternode} 的集群中。
该命令的需求,是在当一个节点offline时,修改了集群节点的情形下。例如:节点A和B聚群,节点A offline了,节点C和B集群,并且B节点离开了该集群,那么当节点A起来的时候,A会尝试连接B,但是由于B节点已经不在该集群中,所以会失败。
通过 rabbitmqctl -n A update_cluster_nodes C 将会解决上述问题。
rabbitmqctl sync_queue [-p vhost] {queue}
{queue} 表示待同步的队列名称
指引含有异步slaves的镜像队列去同步自身。当队列执行同步化时,其将会被锁定(指所有publishers发送出去的和consumers获取到的队列都会被锁定)。为了成功执行此命令,队列必须要被镜像。
注意,排除消息的异步队列将最终被同步化,此命令主要运用于未被排除完全消息的队列。
rabbitmqctl cancel_sync_queue [-p vhost] {queue}
指引一个正在同步的镜像队列停止此操作。
rabbitmqctl purge_queue [-p vhost] {queue}
{queue} 表示待清空消息的队列名称
该命令表示清空队列(即删除队列中的所有消息)
rabbitmqctl set_cluster_name {name}
设置集群的名称。在连接中,集群的名称被声明在客户端上,被同盟和插件用来记录一个消息所在的位置。集群的名称默认来自于集群中第一个节点的主机名,但是可以被修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。