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

熵增原理

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

[来自百度百科]

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. ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇

    背景 笔者所在的公司正在进行微服务改造,这其中服务治理组件是必不可少的组件之一,在一番讨论之后,最终决定放弃 Zookeeper 而采用 Consul 作为服务治理框架基础组件.主要原因是 Consu ...

  4. consul原理

    阅读目录 一.使用Consul做服务发现的若干姿势 1.https://www.cnblogs.com/bossma/p/9756809.html 阅读目录 启动第1个Server节点,集群要求要有3 ...

  5. 1-Consul系列文章

    使用Consul做服务发现的若干姿势 Consul的反熵 [Consul]Consul架构-简介

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

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

  7. Consul ACL集群配置说明以及ACL Token的用法

    在上一篇文章里面,我们讲了如何搭建带有Acl控制的Consul集群.这一篇文章主要讲述一下上一篇文章那一大串配置文件的含义. 1.配置说明#1.1 勘误上一篇文章关于机器规划方面,consul cli ...

  8. Raft算法和Gossip协议

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

  9. 浅谈集群版Redis和Gossip协议

    昨天的文章写了关于分布式系统中一致性哈希算法的问题,文末提了一下Redis-Cluster对于一致性哈希算法的实现方案,今天来看一下Redis-Cluster和其中的重要概念Gossip协议. 1.R ...

随机推荐

  1. kafka介绍及安装配置(windows)

    Kafka介绍 Kafka是分布式的发布—订阅消息系统.它最初由LinkedIn(领英)公司发布,使用Scala和Java语言编写,与2010年12月份开源,成为Apache的顶级项目.Kafka是一 ...

  2. 提升布局性能____Making ListView Scrolling Smooth

    listview是一个比较重要的UI组件,一切影响UI的操作,比如适配器从磁盘.网络或者数据库中加载数据的操作,最好都放在子线程中完成.子线程可以使用thread,不过那样比较老土,官方推荐使用Asy ...

  3. 【题解】危险的工作-C++

    Description 给出一个数字N,N<=11.代表有N个人分担N个危险的工作. 每个人对应每个工作,有个危险值 每个人担任其中一项,问每个人危险值相加,最小值是多少. Input 第一行给 ...

  4. CentOS 7搭建vsftp(虚拟用户方式登录)

    说明: vsftpd的版本:vsftpd-3.0.2-22.el7.x86_64 ftp 根目录 : /data/ftp ftp 配置文件目录:/etc/vsftpd ftp 虚拟用户权限配置文件目录 ...

  5. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

  6. [翻译] .NET Core 3.0 Preview 7 发布

    原文: Announcing .NET Core 3.0 Preview 7 今天,我们宣布推出 .NET Core 3.0 Preview 7 .我们的工作已经从创建新功能过渡到打磨版本.预计剩余的 ...

  7. 推荐:经典SQL语句大全

    一.基础 .说明:备份sql server--- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mss ...

  8. linux初学者-NFS网络文件系统篇

    linux初学者-NFS网络文件系统篇 在上一篇的SAMBA篇中介绍了linux系统和windows系统之间共用的网络文件系统CIFS,主要用于客户端是windows的情况.在linux系统之间,所用 ...

  9. 《HelloGitHub》第 40 期

    <HelloGitHub>第 40 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程. ...

  10. 一个完整的产品设计流程——家庭安全管家

    不管是产品设计,还是前后端开发,始终都应该做出来才能够有很好的提高锻炼.书看得再多,如果不配合实际练习始终得不到实质性的进展. 接下来的案例是和几位学弟学妹一起做的,契机是参加一个用户体验设计比赛,从 ...