1.为什么要研究rabbitmq分布式集群,希望解决什么问题?
最近做巡检,然后发现生产环境,有两台mq的负载很高了。已经达到了10了。经过排查发现是由于写操作导致(因为mq要把消息持久化,所以要大量的进行写操作。)。和研发的头进行了一次拆分以后,即不同的服务使用不同的mq(这里说下,本来我们每种服务应该单独使用此服务的mq,但是因为初期上线时服务器资源不够。所以部分服务合用了一些mq)。拆分完以后发现,负载还是没有办法下去。重新分析了下后发现,发送消息频繁的服务,无法从此组mq切走。因为其他mq没有此消息。此时就需要把此组mq的消息,也转到到另一组mq。所以开始进行调研,看是否有支持的功能。然后从rabbitmq官网找到了插件。
2.想要rabbitmq分布式集群完成一个什么结果?
实现双集群之间的消息共享
rabbitmq分布式研究过程
1.测试资源准备
- 源mq:192.168.2.211 目的mq:192.168.1.202
2.搭建rabbitmq集群
3.学习rabbitctl、rabbitmq-plugins等命令的使用
4.需要基础知识
- 了解rabbitmq的基本三个基本概念:Queue(队列)、Exchange(交换机)、路由、routing key、Binding、Binding key等概念。可以参考此博文。rabbitmq基本概念
5.了解Federation和Shovel这两个插件的区别。
- Federation插件官方文档
- Shovel插件官方文档
- 从官网的文章看,这两个插件的主要差别在Shovel会把消息消费掉,而Federation是把消息转发到路由(英文不好,所以不确定对不对。)。最后选定了Federation来做实现。
6.Federation插件配置过程
- 安转Feration插件
1.1rabbitmq-plugins enable rabbitmq_federation
1.2rabbitmq-plugins enable rabbitmq_federation_management
- 配置Feration
2.1 rabbitmqctl:rabbitmqctl set_parameter federation-upstream my-upstream
'{"uri":"amqp://server-name","expires":3600000}'
2.2 rabbitmqctl(Windows):rabbitmqctl set_parameter federation-upstream my-upstream
^ "{""uri"":""amqp://server-name"",""expires"":3600000}"
2.3 HTTP_API:PUT /api/parameters/federation-upstream/%2f/my-upstream
{"value":{"uri":"amqp://server-name","expires":3600000}}
2.4 Web_UI:Navigate to Admin > Federation Upstreams > Add a new upstream.
Enter "my-upstream" next to Name,
"amqp://server-name" next to URI, and 36000000 next to Expiry. Click Add upstream.
- 添加upstream
3.1 rabbitmqctl:rabbitmqctl set_policy --apply-to exchanges federate-me
"^amq\." '{"federation-upstream-set":"all"}'
3.2 rabbitmqctl(Windows):rabbitmqctl set_policy --apply-to exchanges federate-me
"^amq\." ^ "{""federation-upstream-set"":""all""}"
3.3 HTTP_API:PUT /api/policies/%2f/federate-me{"pattern":"^amq\.",
"definition":{"federation-upstream-set":"all"}, "apply-to":"exchanges"}
3.4 Web_UI:Navigate to Admin > Policies > Add / update a policy. Enter "federate-me"
next to "Name", "^amq\." next to "Pattern", choose "Exchanges" from the "Apply to"
drop down list and enter "federation-upstream-set" = "all" in the first line next to "Policy". Click "Add" policy.
- 经过上面三步以后,服务器的配置已经完成。最后一步,在下游服务器创见队列,并通过Binding key与上游服务器的某个交换机进行绑定。绑定完成以后。发送到上游此交换机的消息,都会路由到这个队列一份。