本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、RabbitMQ集群
1.1、集群原理
node1作为主节点,node2节点从属于该主节点,node3从属于node3。那么它们三者形成了一个集群。
1.2、搭建步骤
1. 克隆虚拟机
2. 修改三台主机的名称
# 进入对应文件修改
vim /etc/hosts
3. 配置各个节点的 hosts 文件,让各个节点都能互相识别对方
# 进入对应得文件
vim /etc/hosts
# 修改的内容
192.168.123.129 node1
192.168.123.131 node2
192.168.123.130 node3
4. 以确保各个节点的 cookie 文件使用的是同一个值
在 node1 上执行远程操作命令
scp /var/lib/rabbitmq/.erlang.cookie root@node2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@node3:/var/lib/rabbitmq/.erlang.cookie
5. 启动 RabbitMQ 服务,顺带启动 Erlang 虚拟机和 RbbitMQ 应用服务(在三台节点上分别执行以 下命令)
rabbitmq-server -detached
6. 在节点2上执行
rabbitmqctl stop_app
#rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务
# 进行重置
rabbitmqctl reset
# 加入到结点1得集群
rabbitmqctl join_cluster rabbit@node1
#(只启动应用服务)
rabbitmqctl start_app
7. 在节点3上执行
rabbitmqctl stop_app
#rabbitmqctl stop 会将Erlang 虚拟机关闭,rabbitmqctl stop_app 只关闭 RabbitMQ 服务
# 进行重置
rabbitmqctl reset
# 加入到结点2的集群
rabbitmqctl join_cluster rabbit@node2
#(只启动应用服务)
rabbitmqctl start_app
8. 查看集群状态
rabbitmqctl cluster_status
9. 需要重新设置用户
#创建账号
rabbitmqctl add_user admin 123
#设置用户角色
rabbitmqctl set_user_tags admin administrator
#设置用户权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
10. 解除集群节点命令
# 关闭服务
rabbitmqctl stop_app
# 重置服务
rabbitmqctl reset
# 开启服务
rabbitmqctl start_app
# 查看集群状态
rabbitmqctl cluster_status
# (node1 机器上执行) 让node1 忘掉 node2
rabbitmqctl forget_cluster_node rabbit@node2
11. 搭建成功图示
1.3、镜像队列
1.3.1、使用镜像队列的原因
- 如果不使用镜像队列的话,那么我们在
node1上创建的队列,其他两个节点都不会有相应的队列,所以一旦node1宕机的话,会导致消息丢失。 - 所以我们需要使用镜像队列来进行集群层面上的队列备份。
1.3.2、如何搭建镜像队列?
1.3.3、测试结果
(1)、如果将node3的服务停掉
- 它还会保持一份备份的原则,备份到
node2。 - 注意这里的队列的名称必须为
mirror_*。 - 就算整个集群只剩下一台机器了 依然能消费队列里面的消息。说明队列里面的消息被镜像队列传递到相应机器里面了
1.4、高可用负载均衡
- 这里使用
Haproxy实现负载均衡,当处于高并发的情况下十分有用。大量请求来临,Haproxy会将其分给node1~3进行处理。 - 如果第一台
Haproxy宕机,那么其中的keepalive会将请求转移给下一台Haproxy。从而不让请求丢失。
1.5、Federation Exchange
1.5.1、使用原因
- 当两个
RabbitMQ相距甚远,那么如果深圳的客户需要连接北京的RabbitMQ才能获得的相关信息就会造成网络延迟,所以北京和深圳两地的RabbitMQ中的信息要相同。
1.5.2、搭建步骤
1. 在每台机器上开启 federation插件
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
开启成功的标志
2. 原理图解析
node1(upstream)也就是上游会将数据同步到下游node2(downstream)。- 我们需要先运行
consumer在node2创建fed_exchange
3. 在 downstream(node2)配置 upstream(node1)
4. 添加策略
5. 成功说明
1.5、Federation Queue
1.5.1、使用原因
使用其队列形式来实现两个地区的RabbitMQ的数据同步。
1.5.2、搭建步骤
1. 原理图
- 我们需要将
node2上的队列联邦到node1上,node1的数据可以同步到node2。
2. 添加 upstream(同上)
3. 添加 policy
1.6、Shovel
1.6.1、使用原因
Shovel够可靠、持续地从一个Broker中的队列(作为源端,即source)拉取数据并转发至另一个Broker中的交换器(作为目的端,即destination)。Shovel行为就像优秀的客户端应用程序能够负责连接源和目的地、负责消息的读写及负责连接失败问题的处理。
1.6.2、搭建步骤
1. 在需要的机器上开启插件
rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management
开启成功的标志
2. 原理图
- 源端会将其接收到的数据转发给目的地
3. 添加shovel源和目的地