熵是衡量某个体系中事物混乱程度的一个指标,是从热力学第二定律借鉴过来的。

熵增原理

孤立系统的熵永不自动减少,熵在可逆过程中不变,在不可逆过程中增加。
熵增加原理是热力学第二定律的又一种表述,它更为概括地指出了不可逆过程的进行方向;同时,更深刻地指出了热力学第二定律是大量分子无规则运动所具有的统计规律,因此只适用于大量分子构成的系统,不适用于单个分子或少量分子构成的系统。

[来自百度百科]

Consul为什么要反熵

举个现实社会的例子,国家是由一个个的人组成的,小国家几万人口,大国家几亿人口,每个人都有自己的想法,不可能这些人没有组织就能维持这个国家的运转。我国有省市县乡四级行政区划,乡管理几十个村,县管理十几个乡,市管理十几个县,省管理十几个市。如果让省直接去管理以万为单位的村,李村的村长贪污了补贴款,张村的马路被压坏了,隔壁王村放开二胎后还是没人生孩子…,肯定是管不过来的。通过这种层级的行政划分,国家得到了有序的治理,而不是乱哄哄一片。

Consul面对的问题也是类似的,它是一个分布式的服务发现系统,需要做服务注册、健康检查、服务发现,以及在成员之间共享这些服务信息。大点的系统可能有成千上万的服务,分布在成百上千的节点,服务应该注册在哪些节点,数据在节点之间怎么同步,节点失败了怎么办,怎样保证增加节点数量不会导致性能明显下降…如果不解决好这些问题,整个系统可能就会变得混乱,走向失控和崩溃。

理解两个组件

这里首先介绍跟服务和健康检查紧密相关的两个部件:Agent和Catalog,可以让大家更容易理解Consul的反熵。

Agent

Agent存在于Consul的每一个节点中,负责维护注册到其上的服务和健康检查,以及执行这些健康检查,更新本地服务的健康信息。

Catalog

Catalog存在于Server 节点,聚合了各个Agent采集的信息,包括服务、健康检查、相关的节点,以及它们对应的状态,服务发现就是基于Catalog来做的。

然而Catalog中这些信息的字段要比Agent维护的少很多,因为Catelog只是一个视图,它没有关于服务、健康检查和节点的设置项信息。

反熵机制

根据前边对熵的说明,Consul 的反熵就是让Consul集群更有序,而其反熵机制就和上边提到的两个部件紧密相关。

当服务或健康检查在Agent注册后,信息就会通知到Catalog中;当Agent中根据健康检查的服务状态发生变化时,状态也会通知到Catalog中;当服务或健康检查从Agent中消失后,Catalog中也会移除相对应的信息。

Agent负责注册到其上的服务及健康检查,Catalog负责聚合集群各个Agent的数据用于服务发现,Agent同步最新数据到Catalog,各个Agent的数据不断收敛到Catalog,从而实现集群的有序运作。波斯码建议大家通过调用Consul API中的Agent和Catalog接口来验证这个机制。

周期同步

除了当变化发生时Agent主动通知外,Agent还有一个定时器执行到Catalog的完整同步操作。极端情况下,如果在Catalog中移除了某个Agent的所有信息,过一会这些信息也会重新同步到Catalog中。为了降低同步可能导致的并发影响,针对不同的集群规模默认了不同的同步周期:

集群规模 同步周期
1 – 128 1 minute
129 – 256 2 minutes
257 – 512 3 minutes
513 – 1024 4 minutes

这个同步间隔只是一个近似值,为了防止大量节点同时同步导致惊群效应,实际程序中会在同步周期内引入一个随机值来错开同时请求。

同步的异常处理

同步的时候可能会出现各种问题,比如Agent配置错误、磁盘满了、没有写入权限、网络不通等等,出现这些问题时,Agent会记录日志后继续运行,然后等待下一次周期同步尝试。

启用Tag Override

如果开启这个选项,则Agent同步数据到Catalog时,将不会同步服务的tag数据。举个实际的例子:主从部署的redis,使用sentinel监控实例的状态,如果主redis下线,则某个从redis升级为可写的主实例。假设使用服务的tag作为主从的标识,这里就不能使用服务注册时的tag,而应该通过sentinel获取redis实例的主从状态,然后设置到Catalog中,服务发现才能获取到当前实际的redis主实例。

这篇文章由Consul官方文档整理而来,加入了波斯码个人的一些理解。点此查看原文

Consul的反熵的更多相关文章

  1. 使用Consul做服务发现的若干姿势

    从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验.最开始使用Consul的人不多,为了方便交流创建了一个QQ群,这两年微服务越来越火,使 ...

  2. Consul做服务发现

    使用Consul做服务发现的若干姿势 https://www.cnblogs.com/bossma/p/9756809.html 从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后 ...

  3. Consul实现原理系列文章2: 用Gossip来做集群成员管理和消息广播

    工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.这篇文章会讲述Consul是如何使用Gossip来做集群成员管理和消息广播的. Consul使用Go ...

  4. Raft算法和Gossip协议

    简单介绍下集群数据同步,集群监控用到的两种常见算法. Raft算法 raft 集群中的每个节点都可以根据集群运行的情况在三种状态间切换:follower, candidate 与 leader.lea ...

  5. Gossip算法

    Gossip算法因为Cassandra而名声大噪,Gossip看似简单,但要真正弄清楚其本质远没看起来那么容易.为了寻求Gossip的本质,下面的内容主要参考Gossip的原始论文:<<E ...

  6. [转载] nosql 数据库的分布式算法

    原文: http://juliashine.com/distributed-algorithms-in-nosql-databases/ NoSQL数据库的分布式算法 On 2012年11月9日 in ...

  7. [转载] Gossip算法学习

    转载自http://blog.csdn.net/yfkiss/article/details/6943682/ 1. 概述gossip,顾名思义,类似于流言传播的概念,是一种可以按照自己的期望,自行选 ...

  8. P2P结构与Quorum机制------《Designing Data-Intensive Applications》读书笔记8

    前文涉及到了很多与Leader相关的算法,大家有木有想过,王侯将相,宁有种乎,既然Leader这么麻烦,干脆还是采用P2P模型吧,来个大家平等的架构.本篇需要和大家探讨的就是多副本下实现民主政治的Qu ...

  9. fabric知识梳理图解

    https://blog.csdn.net/weixin_42117918/article/details/85230754 1.整体架构 2.交易流程 流程步骤: 应用程序通过SDK发送请求到Pee ...

  10. 安娜Anna:世界最快的超级伸缩的KVS, 秒杀Redis

    伯克利 这个大学在计算机学术界.工业界的地位举足轻重,其中的AMP实验室曾开发出了一大批大获成功. 对计算机行业产生深远影响的分布式计算技术,包括 Spark.Mesos.Tachyon 等.作为AM ...

随机推荐

  1. rpc框架之avro 学习 1 - hello world

    avro是hadoop的一个子项目,提供的功能与thrift.Protocol Buffer类似,都支持二进制高效序列化,也自带RPC机制,但是avro使用起来更简单,无需象thrift那样生成目标语 ...

  2. Careercup - Google面试题 - 5661939564806144

    2014-05-06 01:40 题目链接 原题: Give a N*N matrix, print it out diagonally. Follow up, if it is a M*N matr ...

  3. ftrace的使用【转】

    转自:http://blog.csdn.net/cybertan/article/details/8258394 This article explains how to set up ftrace ...

  4. libjpeg 交叉编译动态库和静态库

    1.下载libjpeg库,解压之     得到了jpeg6b和libtool-2.2.4两个文件夹. 2.编译安装libtool工具.   这是配置libtool,这里需要注意:configure 参 ...

  5. gridview 一个列勾选框选中,同时选中同一行的另一列勾选框

    <asp:TemplateColumn > <HeaderTemplate> 是否显示 <asp:CheckBox ID="chk_Show" sty ...

  6. Spring学习之常用注解(转)

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...

  7. 一个用js写的接口http调试程序

    公司有非常多手机app的项目.手机app又要常常訪问后台提交与查询数据. 所曾经端app与后台的开发与測试过程中接口调试是一个常常要做的工作. 而每当出现一个BUG,前端appproject师与后台p ...

  8. 判断字符串的后缀.endswith()

    可以用str.endswith('.jpg')来判断字符串是否以jpg结尾,返回True或者False

  9. 用gojs写的流程图demo

    领导要求,可以展开收缩子级,但是子级可以有多个父级,一开始用的dagre-d3.js,但是功能不是太全,无意中看到gojs,感觉还不错,所以拿来改了改... 代码地址:https://github.c ...

  10. 快捷键整理(来源:http://www.cnblogs.com/xing901022/p/4741630.htm)

    Eclipse 跳转到指定行:ctrl+l 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shif ...