tnblog
首页
视频
资源
登录

RabbitMq集群镜像同步与应用

10426人阅读 2021/2/9 15:50 总访问:3467027 评论:0 收藏:0 手机
分类: RabbitMq

RabbitMq集群镜像同步与应用

Queue存放问题

队列在集群中存储有两种模式。第一种是default模式,它就是消息队列存储再哪儿就在哪儿。第二种是mirror模式,通过镜像的方式将master的消息队列映射到各个slave中去,消息在每个节点都有,实现高可用的方式。

启动镜像

队列已通过policy启用了镜像。policy可以随时更改;创建一个非镜像队列是有效的,然后在以后再进行镜像(反之亦然)。非镜像队列与不具有任何镜像的镜像队列之间是有区别的-前者缺乏额外的镜像基础结构,可能会提供更高的吞吐量。

设置为ha-all政策

我们做一个简单的测试简单的为test开头的队列把参数ha-mode设置为all模式,该模式可以将队列镜像到所有的rabbitmq集群中。针对不同的系统,多少会有一些差异,我会列一张表在下面。重点我们放在WebUI的操作上进行。

系统 操作
rabbitmqctl rabbitmqctl set_policy ha-all "^test" '{"ha-mode":"all"}'
rabbitmqctl (Windows) rabbitmqctl.bat set_policy ha-all "^test" "{""ha-mode"":""all""}"
HTTP API PUT /api/policies/%2f/ha-all {"pattern":"^test", "definition":{"ha-mode":"all"}}

接着我就在这queue页面上面创建一个test1队列。

我们发现这里有个+2表示已经有两台子机器已经开启了镜像。

问题1

但我们会产生一个问题,当一台机子发生了故障挂掉了,但又有新的消息发布到队列中来,然后那台机子又启动起来后是否会同步消息?我们来测试一下,先通过./rabbitmqctl stop_app关闭一台机器。

然后我们可以看见这里只有一个+1了。

接着我们在我们的队列中添加一条信息

然后将再次启动slave节点,我们就会发现它的数据并没有及时更新,是落后的。在图表中也出现了红色的+1

自动同步策略

我们可以通过参数ha-sync-mode: automatic设置为自动同步。我们先删除原来的策略policy再创建新的policy并把这个参数带上,随后立即生效。

指定随机机器同步策略

在不同的系统上随机策略也有所不同,我也为大家列一张表。这里随机两台机器做自动同步队列与消息。

系统 操作
rabbitmqctl rabbitmqctl set_policy ha-two "^test" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
rabbitmqctl (Windows) rabbitmqctl.bat set_policy ha-two "^test" ^"{""ha-mode"":""exactly"",""ha-params"":2,""ha-sync-mode"":""automatic""}"

HTTP API

  1. PUT /api/policies/%2f/ha-two
  2. {
  3. "pattern":"^test",
  4. "definition": {
  5. "ha-mode":"exactly",
  6. "ha-params":2,
  7. "ha-sync-mode":"automatic"
  8. }
  9. }

同样我们先删除policy政策,在创建一个组的策略,并随机两台机器做自动同步队列,交换机与消息。(添加好后立即生效,我们在UI中也发现+2+1了)


指定节点同步策略

我们通过node参数还可以指定集群中的任意节点,当我们指定rabbit@rabbitmqmasterrabbit@rabbitmqslave1可以按照如下进行操作

系统 操作
rabbitmqctl rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@rabbitmqmaster", "rabbit@rabbitmqslave1"]}'
rabbitmqctl (Windows) rabbitmqctl set_policy ha-nodes "^nodes\." "{""ha-mode"":""nodes"",""ha-params"":[""rabbit@rabbitmqmaster"", ""rabbit@rabbitmqslave1""]}"


.netcore重试连接集群

我们通过发布消息的方式将发布到队列中去,但在这之前我们需要了解两个连接对象里面的参数。

参数 描述
AutomaticRecoveryEnabled 如果连接断开,底层会尝试去重连rabbitmq集群…
TopologyRecoveryEnabled connection连接成功了,里面的exchangequeuebinding都要恢复原样。。

创建代码,并连接到这些节点中去。

  1. var factory = new ConnectionFactory()
  2. {
  3. UserName = "bob",
  4. Password = "bob",
  5. AutomaticRecoveryEnabled = true,
  6. TopologyRecoveryEnabled = true
  7. };
  8. // 创建一个链接
  9. using (var connection = factory.CreateConnection(new string[] { "10.211.55.4", "10.211.55.5", "10.211.55.6" }))
  10. {
  11. // 创建一个通道
  12. using (var channel = connection.CreateModel())
  13. {
  14. var properties = channel.CreateBasicProperties();
  15. // 我们创建15条消息
  16. for (var i = 0; i < int.MaxValue; i++)
  17. {
  18. try
  19. {
  20. channel.BasicPublish(
  21. exchange: string.Empty,
  22. routingKey: "test1",
  23. basicProperties: properties,
  24. body: Encoding.UTF8.GetBytes($"新消息{i}")
  25. );
  26. System.Console.WriteLine($"Publish: 新消息{i}");
  27. }
  28. catch (Exception ex)
  29. {
  30. System.Console.WriteLine($"[ERROR]:{ex.Message}");
  31. }
  32. finally
  33. {
  34. Thread.Sleep(3000);
  35. }
  36. }
  37. Console.WriteLine("Finish");
  38. Console.ReadLine();
  39. }
  40. }

接着我们来集群中查看它连上哪台机子上了。我们发现它连上了rabbit@rabbitmqslave2这台机子

当我们让rabbit@rabbitmqslave2挂掉会发生什么事。

我们发现虽然它挂掉连但我们的客户端仍然好好的。今天就讲这么多,我们休息一下。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

​Windows下安装RabbitMq

跳过舞,祝大家新年快乐哇!1、下载安装erlang因为rabbitmq是基于erlang实现的所以需要先安装erlang打开网址https://www.er...

net core使用消息队列RabbitMq

使用NuGet下载rabbitmq客户端工具Install-Package RabbitMQ.Client -Version 3.6.5生产消息staticvoidMain(string[]args) ...

RabbitMq常用命令

rabbitmqctl environment:查询环境什么的例如这里可以看到rabbitmq的连接端口是5672,有时间我们想知道端口有没有改起什么...

修改RabbitMq的连接端口

rabbitmq的默认连接端口是5672,如果要修改的话,可以通过配置文件修改当然一般情况下都会遇到坑默认配置文件地址:安装目...

消息队列RabbitMq介绍

消息队列的一般作用 异步调用,延迟处理 应用解耦 流量消峰,处理高并发,秒杀等 说白了,消息队列就是一方生产消息,一方...

RabbitMq官网上六大版块之二(Direct类型交换机通过routingKey分类型输出)

其实rabbitmq,老师都说得差不多了,下面是老师的连接。http://www.tnblog.net/aojiancc2/article/UserCategory/134官网教...

RabbitMq六大版块之三(Fanout类型交换机相同数据多逼格处理)

Fanout类型交换机的特点是:同样的数据分发给每一个自己所绑定的队列,每个队列可以按照自己的需求对数据进行不同的处理【...

RabbitMq中Header类型交换机的处理(and与or的处理)

headers类型交换机是通过 muliple attributes 代替 routing key.x-match [all/any]all: 所有地方header头信息必须匹配any:...

springboot整合RabbitMq

Windows下安装RabbitMQ:http://www.tnblog.net/aojiancc2/article/details/232消息队列rabbitmq介绍:http://www.tnblog.n...

Docker 部署RabbitMq集群

Docker 部署RabbitMq集群[TOC] 镜像环境docker pull rabbitmq:3-management 镜像后面带management是带web管理界面...

RabbitMq 命令行运用

RabbitMq 命令行运用[TOC] RabbitMQ是一个开源的多协议消息传递代理。 描述 rabbitmqctl是用于管理RabbitMQ服务器节点...

RabbitMq 对配置文件的操作

RabbitMq 对配置文件的操作[TOC] 从UI界面中找到配置文件的位置 查看我们的配置文件 在这里我已经对原来的配置文件做了...

.netcore3.1 RabbitMq 简单运用与相关方法的介绍

.netcore3.1 RabbitMq 简单运用与相关方法的介绍[TOC] 在这里我将使用简单的生产—-&gt;加入队列—-&gt;消费,做一个简...

.netcore3.1 RabbitMq 工作队列轮询与确认消息

.netcore3.1 RabbitMq 工作队列轮询与确认消息[TOC] https://www.rabbitmq.com/confirms.htmlhttps://www.rabbitmq.com/tu...

.netcore3.1 RabbitMq Routing的应用

.netcore3.1 RabbitMq Routing的应用[TOC] 在前面很多文章中都用到了routingKey参数但并没有细说它的用途。在这之前我可...

.netcore3.1 RabbitMq Fanout交换机

.netcore3.1 RabbitMq Fanout交换机[TOC] 在前面我们有提到交换机但都是用的普通的交换机(direct),交换机在Rabbitmq中有...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术