参考:https://www.cnblogs.com/caoweixiong/p/14371487.html
环境:
centos7
这里使用两台,生产环境建议使用三台
ip | 主机名 | 安装软降 |
---|---|---|
192.168.137.126 | node01 | erlang、rabbitmq,jdk |
192.168.137.125 | node02 | erlang、rabbitmq,jdk |
修改主机名并写入hosts文件
vim /etc/hosts
192.168.137.126 node01
192.168.137.125 node02
hostnamectl set-hostname node01 #修改主机名
这里采用的离线部署,下载的tar.gz二进制包直接拿来启动
rabbitmq-server -detached #启动Erlang node和Rabbit应用
rabbitmqctl stop #停止mq跟erlang节点
rabbitmq-plugins enable rabbitmq_management rabbitmq_web_stomp rabbitmq_stomp rabbitmq_web_stomp_examples #重启后生效
rabbitmqctl -detached
rabbitmqctl status
RabbitMQ的集群是依赖erlang集群,而erlang集群是通过这个cookie进行通信认证的,将一台主机上的
.erlang.cookie
文件拷贝到其他两台主机上。该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。
一般这个文件在 $HOME/.erlang.cookie ,也可能在/var/lib/rabbitmq/.erlang.cookie下视安装方式而定
/var/lib/rabbitmq/.erlang.cookie
或
$HOME/.erlang.cookie
rabbitmqctl stop
cd
scp .erlang.cookie root@node02:/root/
chmod 600 .erlang.cookie #这步可以省略
rabbitmqctl -detached
rabbitmqctl stop_app #只停止mq服务
rabbitmqctl reset #重置状态
rabbitmqctl join_cluster rabbit@node01 #加入集群
rabbitmqctl start_app #重新开启mq服务
join_cluster
命令有一个可选的参数 --ram
,该参数代表新加入的节点是内存节点,默认是磁盘节点。
如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,如果是磁盘节点,则存储在磁盘中。
内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。
当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。
除非是将 RabbitMQ 用于 RPC 这种需要超低延迟的场景,否则在大多数情况下,RabbitMQ 的性能都是够用的,可以采用默认的磁盘节点的形式。
另外,如果节点以磁盘节点的形式加入,则需要先使用 reset
命令进行重置,然后才能加入现有群集,重置节点会删除该节点上存在的所有的历史资源和数据。
采用内存节点的形式加入时可以略过 reset
这一步,因为内存上的数据本身就不是持久化的。
rabbitmqctl cluster_status
rabbitmqctl add_user admin password
rabbitmqctl add_vhos admin
rabbitmqctl set_user_tags admin administrator
rabbitmq set_permissions -p admin admin ".*" ".*" ".*"
没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。但是需要保证在重启时,最后关闭的节点最先被启动。
如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。
这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 node01,node02,node03,如果 node1 因为故障暂时没法恢复,此时 node2 和 node3 就无法启动。
想要解决这个问题,可以先将 node1 节点进行剔除,命令如下:
rabbitmqctl forget_cluster_node rabbit@node01 -offline
此时需要加上 -offline
参数,它允许节点在自身没有启动的情况下将其他节点剔除。
可以先使用 rabbitmqctl stop
停止该节点上的服务,然后在其他任意一个节点上执行 forget_cluster_node
命令。这里以剔除 node02上的服务为例,此时可以在 node01上执行下面的命令:
rabbitmqctl forget_cluster_node rabbit@node02 #要记得先停止node02节点上的服务
先使用 rabbitmqctl stop
停止该节点上的服务,然后再执行 rabbitmqctl reset
这会清空该节点上所有历史数据,并主动通知集群中其它节点它将要离开集群。
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群中所有的节点上进行镜像
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:ha-mode模式需要用到的参数
ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
priority:可选参数,policy的优先级
示例:
rabbitmqctl set_policy -p admin ha-all "^" ‘{"ha-mode":"all"}‘
rabbitmqctl list_policies -p admin
网页界面添加一条队列,并查看详情
原文:https://www.cnblogs.com/yhy223/p/14453418.html