当前位置: 亚洲城ca88 > ca88 > 正文

Consul维护RabbitMq的高可用性ca88

时间:2019-05-03 16:39来源:ca88
懒人学习的进度就是办事中13分让干啥让做吗就研讨讨论什么,国庆放假回来的礼拜5非凡通过钉钉给作者布署了个职务, RabbitMQ高可用消除方案,笔者想说钉钉太坑了: 应用.Net Consu

  懒人学习的进度就是办事中13分让干啥让做吗就研讨讨论什么,国庆放假回来的礼拜5非凡通过钉钉给作者布署了个职务, RabbitMQ高可用消除方案,笔者想说钉钉太坑了:

应用.Net Consul维护RabbitMq的高可用性,consulrabbitmq

  懒人学习的历程正是干活中分外让干啥让做吗就研讨商讨什么,国庆放假回来的礼拜伍卓殊通过钉钉给自家安排了个任务, RabbitMQ高可用消除方案,我想说钉钉太坑了:

ca88 1

那是国庆从此玖号周2早晨下班给的职分,笔者周一收看的时候壹看,下星期三,那岂不是21号,时间是如此的富于!那不还早呢么。。恰巧同学要面试了玖号早上一同进餐,然后问了本身多少个算法,然后被轻视了。。他说小编二个前端都比你做后台的算法牛逼,你请客吧-。-于是周1到周日光学算法了(技士为了夸口逼,哪有甚节操啊)直到周肆老大说,后天职责到期了!研商怎么了!此时才幡然醒悟,钉钉你个坑货,下礼拜5是1肆号!!

ca88 2

RabbitMQ 高可用集群

那是国庆过后9号礼拜5晚间收工给的义务,小编周四见到的时候一看,下周日,那岂不是2一号,时间是那样的丰硕!那不还早呢么。。恰巧同学要面试了玖号早上1道吃饭,然后问了自己多少个算法,然后被轻视了。。他说自家2个前端都比你做后台的算法牛逼,你请客吧-。-于是周一到周四光学算法了(程序员为了夸口逼,哪有何节操啊)直到周四老大说,明天义务到期了!钻探如何了!此时才如梦初醒,钉钉你个坑货,下礼拜五是14号!!

简言之安顿

  对于RabbitMQ 高可用集群的辨证,笔者认为这篇文章讲的挺详细的,就隐瞒了。配置集群的点子看官方网址就足以了 ,为了选用所谓的Active/Active方案,所以不得不选镜像方式了(三.x本子以上才支撑).再抄一段解释恢复(与普通集群相比较,其实质和平日形式差别之处在于,新闻实体会积极性在镜像节点间一块,而不是在 consumer 取数据时目前拉取。该格局带来的副效能也很强烈,除了降低系统天性外,假如镜像队列数量过多,加之大批量的新闻进入,集群内部的网络带宽将会被那种共同报道大大消耗掉。所以在对可信性供给较高的场面中适用),在搭建好RabbitMq集群现在,

镜像方式能够透过命令行为队列增多同步计谋,比如

为保有队列应用镜像方式的计谋

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

要么内定钦点队列名的:

rabbitmqctl set_policy yu-ha "^yu" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

抑或直接在管理页面增加

点击Admin菜单-->左边的Policies选项-->右边最下上面的Add / update a policy

ca88 3

 

 

name就是队列名,Pattern正是相配的规则,比方写个^yu正是以yu起始的队列,ha-mode=啥正是会联手什么队列,比如=all的话正是一道全体相称的行列。

然后新建队列的时候就足以钦命那台机械上跑主队列了。

RabbitMQ 高可用集群

所谓的坑

       抑或抄一下那篇小说的剧情,常用的一手正是通过HAProxy KeepAlive保证RabbitMq的集群高可用:

ca88 4

创建 queue 的过程:

尽管未来 node二 宕机了:

  • node 二 不再响应心跳,它会被认为已经被从集群中移出了
  • node 二 上的 master queue 不再可用
  • RabbitMQ 将 node 1 或者 3 上的 salve instance 升级为 master instance

假使 master queue 还在 node 2 上,客户端通过 LB 访问该队列:

可知,这种布置下,2/3的客户端请求需求重定向,那会促成大约率的造访延迟,可是毕竟访问还是会马到成功的。要优化的话,总共有三种方法:

  • 直白连到 master queue 所在的节点,那样就没有必要重定向了。但是对那种方式,须要提前计算,然后告诉客户端哪个节点上有 master queue。
  • 尽大概地在具有节点间平均布满队列,收缩重定向概率

 为了制止那种n-1/n的那种重定向,知道Master queue所在的节点很注重呀,接下去就不抄了。

简短铺排

  对于RabbitMQ 高可用集群的认证,笔者觉着那篇小说讲的挺详细的,就隐瞒了。配置集群的艺术看官网就能够了 ,为了利用所谓的Active/Active方案,所以只好选镜像情势了(三.x本子以上才支撑).再抄1段解释苏醒(与普通集群比较,其实质和普通情势差别之处在于,信息实体会主动在镜像节点间1块,而不是在 consumer 取数据时一时拉取。该格局带来的副成效也很分明,除了降低系统质量外,纵然镜像队列数量过多,加之大量的音信进入,集群内部的网络带宽将会被那种共同报纸发表大大消耗掉。所以在对可相信性须求较高的场所中适用),在搭建好RabbitMq集群以往,

镜像情势能够通过命令行为队列增添同步战术,比如

为持有队列应用镜像方式的计划

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

抑或钦点钦定队列名的:

rabbitmqctl set_policy yu-ha "^yu" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

仍然直接在治本页面增添

点击Admin菜单-->右边的Policies选项-->右侧最下下面的Add / update a policy

ca88 5

 

 

name正是队列名,Pattern正是相配的规则,比方写个^yu便是以yu开始的队列,ha-mode=啥就是会同步什么队列,举例=all的话正是一块全数相配的行列。

下一场新建队列的时候就可以钦赐那台机械上跑主队列了。

思路

     大致的意趣正是这张图:

 ca88 6

  1.将RabbitMq注册到Consul中(步骤一),通过Consul对RabbitMq实行不奇怪监测,同时Consul提供配置基本的劳动,能够积累一些RabbitMq的配备音讯,例如队列账号,密码,队列主机名,所在Ip等,举个例证:

  将RabbitMq服务登记到Consul:  

ca88 7

{
   "services": [{
     "id":"[email protected]",
     "name":"RabbitMqServer",
     "tags":["rabbitMq"],
     "address": "192.168.1.101",
     "port": 15672,
     "checks": [
       {
         "Http": "http://192.168.1.101:15672/",
         "interval": "10s"
       }
     ]
   },
   {
     "id":"[email protected]",
     "name":"RabbitMqServer",
     "tags":["rabbitMq"],
     "address": "192.168.1.102",
     "port": 15672,
     "checks": [
       {
         "Http": "http://192.168.1.102:15672/",
         "interval": "10s"
       }
     ]
   }
   ]
 } 

View Code

  将RabbitMq的队列消息存入到Consul中:

ca88 8

  2.业务服务需求配置QueueName VirthHost,通过步骤二从RabbitMq网关进行队列信息的收获,然后才干因此步骤伍与队列举行推拉操作,这里能够赚取可用队列对应的Master队列所在的节点音信,幸免n-1/n那种接受推送转载的标题。

  3.RabbitMq网关接受到事情服务的央浼后,通过Consul获取集群中放肆2个健康的RabbitMq队列的消息(Consul提供的正规监测功用),然后依据该队列获得与RabbitMq通讯的WebApi,RabbitMq的Http Api文书档案提供了获取队列详细情形的接口,举例获取队列对用的Master音讯是可用通过接口: protected]](

  这里会有个坑须求小心:

  访问RabbitMq的Http Api是亟需身份验证的,那么些Basic验证的Token获取查了查文书档案没找到- -

  ca88 9

  后来古怪发掘。。** Convert.ToBase64String(Encoding.ASCII.GetBytes(userName

  • ":" password)));** 哎。。不想多说了。。。

  还有个Api参数中带/的难题,.net 肆.五以上的版本用HttpClient没啥难题,四.伍之下版本也许用HttpWebRequest的时候供给对Uri做下拍卖

ca88 10

public static void ForceCanonicalPathAndQuery(Uri uri)
        {
            string paq = uri.PathAndQuery; // need to access PathAndQuery 
            FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
            ulong flags = (ulong)flagsFieldInfo.GetValue(uri);
            flags &= ~((ulong)0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical 
            flagsFieldInfo.SetValue(uri, flags);
        } 

View Code

所谓的坑

       要么抄一下这篇文章的内容,常用的招数就是经过HAProxy KeepAlive有限帮助RabbitMq的集群高可用:

ca88 11

创建 queue 的过程:

  1. LB 将 client request 分发到 node 二,client 成立队列 “NewQueue”,然后初始向当中放入 message。
  2. 末尾,后端服务会对 node 2 上的 “NewQueue” 创立3个快速照相,并在1段时间内将其拷贝到node 一 和 3 上。那时候,node二上的种类是 master Queue,node 一 和 叁 上的行列是 slave queue。

借使今后 node二 宕机了:

  • node 2 不再响应心跳,它会被认为曾经被从集群中移出了
  • node 二 上的 master queue 不再可用
  • RabbitMQ 将 node 1 或者 3 上的 salve instance 升级为 master instance

假设 master queue 还在 node 二 上,客户端通过 LB 访问该队列:

  1. 客户端连接到集群,要拜访 “NewQueue” 队列
  2. LB 依照安插的轮询算法将请求分发到1个节点上
  3. 即便客户端请求被转到 node 3 上
  4. RabbitMQ 发现 “NewQueue” master node 是 node 2
  5. RabbitMQ 将音信转到 node 二 上
  6. 末段客户端成功总是到 node 二 上的 master 队列

可知,那种布置下,2/三的客户端请求必要重定向,那会导致大致率的拜访延迟,不过毕竟访问还是会成功的。要优化的话,总共有二种艺术:

  • 直白连到 master queue 所在的节点,那样就无需重定向了。可是对那种艺术,须要超前总计,然后告诉客户端哪个节点上有 master queue。
  • 尽或者地在装有节点间平均分布队列,缩小重定向概率

 为了防止这种n-1/n的那种重定向,知道Master queue所在的节点很重大呀,接下去就不抄了。

叠加表达:

  其实思路很简单,可是鲜明能够由此包装四个SDK(况且本来就得封装- -)就完结的专门的工作怎么还要牵扯出Consul和剩下的2个RabbitMq网关呢,况且有了RabbitMq网关岂不是说还要单点难题了?!

  本着单点难题。。小编感觉计划几份无状态的网关依旧没啥压力的呢。。SKD封装的时候自身轮流培训去吧!

  对于怎么要用到Consul,一方面是为着例行监测,健康监测能够让Consul通过Consul Http Api直接获取可用的RabbitMq的Http Api消息,还有就是安排基本,业务服务通过配置队列名,VirthHost,和赚取队列服务的RabbitMq网关就能够,RabbirMq网关担当通过安顿基本获得队列音信,配置基本的数目是动态的,更新起来也对比便宜。

  对于为什么不通过SDK直连RabbitMq的Api而是通过网关作为贰个个中代理,在经过Consul获取队列音讯时方可做个定期缓存,而且像队列的用户名密码的那种信息经过作业服务配置的话维护不便于,业务服务通过SDK直接通过Consul获取的话,重视关系也会变得略微错综相连。通过RabbitMq的Api也得以动态获取队列的集群节点音信,权限信息等,在事情服务SDK里定期更新也未尝不可,但SDK毕竟变复杂了,你干不行多不累么。。

  怎么参数要VirthHost QueueName,差异单位的人总归不是同一位。。

思路

     大约的意趣就是那张图:

 ca88 12

  1.将RabbitMq注册到Consul中(步骤壹),通过Consul对RabbitMq举办例行监测,同时Consul提供配置基本的劳动,可以积存一些RabbitMq的配备消息,举个例子队列账号,密码,队列主机名,所在Ip等,举个例证:

  将RabbitMq服务登记到Consul:  

ca88 13ca88 14

{
   "services": [{
     "id":"rabbit@rabbitmq1",
     "name":"RabbitMqServer",
     "tags":["rabbitMq"],
     "address": "192.168.1.101",
     "port": 15672,
     "checks": [
       {
         "Http": "http://192.168.1.101:15672/",
         "interval": "10s"
       }
     ]
   },
   {
     "id":"rabbit@rabbitmq2",
     "name":"RabbitMqServer",
     "tags":["rabbitMq"],
     "address": "192.168.1.102",
     "port": 15672,
     "checks": [
       {
         "Http": "http://192.168.1.102:15672/",
         "interval": "10s"
       }
     ]
   }
   ]
 } 

View Code

  将RabbitMq的队列新闻存入到Consul中:

ca88 15

  2.业务服务须要配置QueueName VirthHost,通过步骤二从RabbitMq网关实行队列音讯的收获,然后才干通过步骤5与队列进行推拉操作,这里能够获取可用队列对应的Master队列所在的节点新闻,幸免n-1/n那种接受推送转发的标题。

  3.RabbitMq网关接受到事情服务的请求后,通过Consul获取集群中随机1个例行的RabbitMq队列的新闻(Consul提供的健康监测成效),接下来依照该队列得到与RabbitMq通讯的WebApi,RabbitMq的Http Api文档提供了获取队列详细情形的接口,举个例子获取队列对用的Master新闻是可用通过接口:

  这里会有个坑须要注意:

  访问RabbitMq的Http Api是索要身份验证的,这几个Basic验证的Token获取查了查文书档案没找到- -

  ca88 16

  后来离奇开掘。。** Convert.ToBase64String(Encoding.ASCII.GetBytes(userName

  • ":" password)));** 哎。。不想多说了。。。

  还有个Api参数中带/的主题材料,.net 4.伍以上的版本用HttpClient没啥难题,四.5之下版本或然用HttpWebRequest的时候供给对Uri做下拍卖

ca88 17ca88 18

public static void ForceCanonicalPathAndQuery(Uri uri)
        {
            string paq = uri.PathAndQuery; // need to access PathAndQuery 
            FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
            ulong flags = (ulong)flagsFieldInfo.GetValue(uri);
            flags &= ~((ulong)0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical 
            flagsFieldInfo.SetValue(uri, flags);
        } 

View Code

正在纠结的难题:

  针对那种思路,对于RabbitMq中的Routing格局和Topic情势会极度,单routekey对应单队列时能够经过队列获取Exhange下该routekey有效发送到某台服务器上的连串上,如若该routekey绑定的行列布满在多台服务器上,并且那个队列的主导分布在多台服务器上时,笔者透过获取到的“Master队列”只可以针对某1行列时真Master,对于此外队列要是Master不在该ip上依然会设有转载的标题。那个标题在拉数据时没啥难点(拉数据小编是索要队列名的!),推数据时只用到Exchange RouteKey,何人还管你的队列是主是从呢?

 

代码在收10整理。。。。

 

参照链接:

 

懒人读书的进度便是干活中那2个让干啥让做什么就研讨商讨吗,国庆放假回到的星期六老大通过...

叠加表明:

  其实思路很轻便,不过料定能够通过包装一个SDK(况且本来就得封装- -)就到位的业务为何还要牵扯出Consul和剩余的二个RabbitMq网关呢,况且有了RabbitMq网关岂不是说还要单点难点了?!

  针对单点难题。。作者认为陈设几份无状态的网关依旧没啥压力的啊。。SKD封装的时候自个儿轮流培训去啊!

  对此怎么要用到Consul,一方面是为着健康监测,健康监测能够让Consul通过Consul Http Api直接拿走可用的RabbitMq的Http Api音信,还有就是安顿中央,业务服务通过配置队列名,VirthHost,和获得队列服务的RabbitMq网关就能够,RabbirMq网关担当通过安排基本取得队列消息,配置基本的数码是动态的,更新起来也相比便于。

  对此怎么不通过SDK直连RabbitMq的Api而是通过网关作为1个中路代理,在经过Consul获取队列消息时能够做个定期缓存,而且像队列的用户名密码的那种音讯经过业务服务配置的话维护不便宜,业务服务通过SDK间接通过Consul获取的话,注重关系也会变得略微千头万绪。通过RabbitMq的Api也足以动态获取队列的集群节点新闻,权限音信等,在作业服务SDK里定期更新也未尝不可,但SDK毕竟变复杂了,你干不行多不累么。。

  为什么参数要VirthHost QueueName,差异机关的人总归不是同1人。。

正在纠结的标题:

  针对那种思路,对于RabbitMq中的Routing模式和Topic模式会有标题,单routekey对应单队列时能够通过队列获取Exhange下该routekey有效发送到某台服务器上的体系上,假设该routekey绑定的行列遍布在多台服务器上,并且那么些队列的着力遍及在多台服务器上时,小编透过获取到的“Master队列”只好针对某一行列时真Master,对于别的队列假如Master不在该ip上照旧会存在转载的题目。那一个难点在拉数据时没啥难点(拉数据本人是急需队列名的!),推数据时只用到Exchange RouteKey,什么人还管你的队列是主是从呢?

 

 

参考链接:

 

编辑:ca88 本文来源:Consul维护RabbitMq的高可用性ca88

关键词: 亚洲城ca88