集群原理
RabbitMQ 集群模式下,只有元数据在各节点是同步一致的,消息保存在定义队列的那个节点上,其他节点只知道这个 queue 的 metadata 信息和一个指向 queue 的 owner node 的指针, 生产者消费者不管连接的是哪一个节点,他们收发的消息都会保存在定义队列的那个节点,其他节点只做路由转发
RabbitMQ 要求集群中至少有一个磁盘节点,最好包含 2 个磁盘节点,即使一个磁盘节点宕机了,也不影响其他节点声明交换机,队列及绑定,其它节点均设置为内存节点,这样会让队列和交换器声明之类的操作更加快速,元数据同步也会更加高效
RabbitMQ 集群不支持负载均衡,RabbitMQ 客户端连接 RabbitMQ 时,不支持填多个 ip, 所以只能连一个节点
各节点放一个局域网,通过内网访问
1.vim /etc/hosts
192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3
2.vim /etc/hostname
192.168.1.1 的机器 -- node1
192.168.1.2 的机器 -- node2
192.168.1.3 的机器 -- node3
3.各节点的 Erlang Cookie 文件,内容应该一致
该 cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误
把第一个节点的该文件复制到其他节点,由于其他节点的该文件权限是 400,所以需要先修改该文件权限为 777,
chmod 777 /var/lib/rabbitmq/.erlang.cookie
复制文件之后,需改回权限和所属用户/组
scp /var/lib/rabbitmq/.erlang.cookie 192.168.1.2:/var/lib/rabbitmq
4.各节点防火墙开端口
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=25672/tcp
//# epmd 进程使用的端口,用于 RabbitMQ 节点和 CLI 工具的端点发现服务
firewall-cmd --permanent --add-port=4369/tcp
firewall-cmd --reload
//# 查看端口是否打开 -- yes表示成功
firewall-cmd --query-port=4369/tcp
5.节点加入集群命令
//# 只停 app,不停 erlang
rabbitmqctl stop_app
Stopping node rabbit@node2 ...
//# 重置状态, 会脱离原有集群
rabbitmqctl reset
Resetting node rabbit@node2 ...
//# --ram 内存节点,默认磁盘节点
//# rabbitmqctl join_cluster rabbit@node1 --ram
rabbitmqctl join_cluster rabbit@node1
Clustering node rabbit@node2 with rabbit@node1...
//# 启动服务
rabbitmqctl start_app
Starting node rabbit@node2...
//# 查看集群
rabbitmqctl cluster_status
Cluster status of node rabbit@node2 ...
[{nodes,[{disc,['rabbit@node1','rabbit@node2']}]},
{running_nodes,['rabbit@node1','rabbit@node2']},
{cluster_name,<<"rabbit@node1">>},
{partitions,[]},
{alarms,[{'rabbit@node1',[]},
{'rabbit@node2',[]}]}]
//# 修改集群名字
rabbitmqctl set_cluster_name my_rabbitmq_cluster
-------------------------------------
节点退出集群命令
-------------------------------------
//# 停止服务
rabbitmqctl stop_app
//# 重置状态, 会脱离原有集群
rabbitmqctl reset
//# 重启服务
rabbitmqctl start_app
-------------------------------------
-------------------------------------
变更节点类型
-------------------------------------
//# 停止服务
rabbitmqctl stop_app
//# 变更类型 ram disc
rabbitmqctl change_cluster_node_type disc
//# 重启服务
rabbitmqctl start_app
-------------------------------------
-------------------------------------
清除 RabbitMQ 节点配置
-------------------------------------
//# 如果遇到不能正常退出直接 kill 进程
systemctl stop rabbitmq-server
//# 查看进程
ps aux|grep rabbitmq
//# 清除节点 rabbitmq 配置
rm -rf /var/lib/rabbitmq/mnesia
-------------------------------------
可通过如下命令确认哪些 salve 在同步
rabbitmqctl list_queues [name] slave_pids [synchronised_slave_pids]
手动同步 queue
rabbitmqctl sync_queue [name]
取消 queue 同步
rabbitmqctl cancel_sync_queue [name]
-------------------------------------
镜像队列
-------------------------------------
主队列(master)依然是仅存在于一个节点上,通过关联的 rabbitMQ 服务器,从主队列同步消息到各个节点,也就是所谓的主从模式,将主队列的消息进行备份处理
如果主队列没有发生故障,那么其工作流程跟普通队列一样,生产者和消费者不会感知其变化,当发布消息时,依然是路由到主队列中,而主队列通过类似广播的机制,将消息扩散同步至其余从队列中,消费者依然是从主队列中读取消息
一旦主队列发生故障,集群就会选举最老的一个从队列为新的主队列,实现了队列的高可用
镜像队列对性能有影响,一般配 2-3 个节点就够了
三种配置方法
1.代码中完成,申请队列时,加属性,一般没有权限
x-ha-policy:all
x-ha-policy:nodes
x-ha-nodes:[rabbit@node1,rabbit@node2]
2.控制台命令
镜像队列的配置通过添加 policy 完成
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 的优先级
对队列名称以 “queue_” 开头的所有队列进行镜像,并在集群的两个节点上完成,policy 的设置命令为
rabbitmqctl set_policy ha-queue-two "^queue_" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
windows 下将单引号改为双引号
rabbitmqctl set_policy ha-all “^ha.” “{“”ha-mode”“:”“all”“}”)
3.控制台页面
policy 页面
-------------------------------------
通过 HAProxy 实现负载均衡,通过 keepalived 实现高可用
-------------------------------------