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

熵增原理

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

[来自百度百科]

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. 2019 Java 全栈工程师进阶路线图,一定要收藏

    技术更新日新月异,对于初入职场的同学来说,经常会困惑该往那个方向发展,这一点松哥是深有体会的. 我刚开始学习 Java 那会,最大的问题就是不知道该学什么,以及学习的顺序,我相信这也是很多初学者经常面 ...

  2. java反射构建对象和方法的反射调用

    Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法.可以增强java的可配置性. 1.1 通过反射构建对象(无参数): 例如我们使用 ReflectS ...

  3. C#3.0新增功能10 表达式树 04 执行表达式

    连载目录    [已更新最新开发文章,点击查看详细] 表达式树 是表示一些代码的数据结构. 它不是已编译且可执行的代码. 如果想要执行由表达式树表示的 .NET 代码,则必须将其转换为可执行的 IL ...

  4. 客户端内嵌Vue页面

    目前很多应用都存在网页端和客户端形式,例如常用的:钉钉.微信等.按传统的开发形式,需要为客户端开发一套界面.基于当前Web应用可以利用三大前端框架和UI框架快速开发出各种酷炫的界面,于是出现了客户端嵌 ...

  5. Cesium 学习(三)各种资源链接

    1.前言 前面已经介绍如何获得以及安装部署Cesium,接下来分享下学习资源链接,其中访问最多的是官网以及超图.火星的demo网站. 2.官网地址及介绍 官网:https://cesiumjs.org ...

  6. 【MySQL】(二)InnoDB存储引擎

    InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracel数据库的架构.通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才使My ...

  7. 【RabbitMQ】一文带你搞定RabbitMQ延迟队列

    本文口味:鱼香肉丝   预计阅读:10分钟 一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经有了更 ...

  8. 第二章 :初识MySQL

    一.MySQL 1. MySQL的版本 社区版 企业帮 2.MySQL的优势 1.运行速度快 2.使用成本低 3.容易使用 4.可移植性高 5.适用更多用户 二.默认字符集设置 1.Standard ...

  9. Soso(嗖嗖)移动 java 项目

    1.接口 通话服务 package Soso; // 接口 通话服务 public interface CallService { public abstract int call(int minCo ...

  10. Angular JS 中的内置方法之表单验证

    angular js 结合html5 可以实现强大的表单验证功能 关闭html5自带的表单验证功能可以用