Consul的反熵
熵
熵是衡量某个体系中事物混乱程度的一个指标,是从热力学第二定律借鉴过来的。
熵增原理
孤立系统的熵永不自动减少,熵在可逆过程中不变,在不可逆过程中增加。
熵增加原理是热力学第二定律的又一种表述,它更为概括地指出了不可逆过程的进行方向;同时,更深刻地指出了热力学第二定律是大量分子无规则运动所具有的统计规律,因此只适用于大量分子构成的系统,不适用于单个分子或少量分子构成的系统。[来自百度百科]
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的反熵的更多相关文章
- 使用Consul做服务发现的若干姿势
从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验.最开始使用Consul的人不多,为了方便交流创建了一个QQ群,这两年微服务越来越火,使 ...
- Consul做服务发现
使用Consul做服务发现的若干姿势 https://www.cnblogs.com/bossma/p/9756809.html 从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后 ...
- ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
背景 笔者所在的公司正在进行微服务改造,这其中服务治理组件是必不可少的组件之一,在一番讨论之后,最终决定放弃 Zookeeper 而采用 Consul 作为服务治理框架基础组件.主要原因是 Consu ...
- consul原理
阅读目录 一.使用Consul做服务发现的若干姿势 1.https://www.cnblogs.com/bossma/p/9756809.html 阅读目录 启动第1个Server节点,集群要求要有3 ...
- 1-Consul系列文章
使用Consul做服务发现的若干姿势 Consul的反熵 [Consul]Consul架构-简介
- Consul实现原理系列文章2: 用Gossip来做集群成员管理和消息广播
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.这篇文章会讲述Consul是如何使用Gossip来做集群成员管理和消息广播的. Consul使用Go ...
- Consul ACL集群配置说明以及ACL Token的用法
在上一篇文章里面,我们讲了如何搭建带有Acl控制的Consul集群.这一篇文章主要讲述一下上一篇文章那一大串配置文件的含义. 1.配置说明#1.1 勘误上一篇文章关于机器规划方面,consul cli ...
- Raft算法和Gossip协议
简单介绍下集群数据同步,集群监控用到的两种常见算法. Raft算法 raft 集群中的每个节点都可以根据集群运行的情况在三种状态间切换:follower, candidate 与 leader.lea ...
- 浅谈集群版Redis和Gossip协议
昨天的文章写了关于分布式系统中一致性哈希算法的问题,文末提了一下Redis-Cluster对于一致性哈希算法的实现方案,今天来看一下Redis-Cluster和其中的重要概念Gossip协议. 1.R ...
随机推荐
- 嵊州D1T1 总统先生,一路走好!
嵊州D1T1 总统先生,一路走好! 在总统先生的所有财产就是 n 杯黑咖啡,咖啡店可以用 m 个空杯子换一杯黑咖啡. 因为总统的特殊身份,心地善良而心生怜悯的咖啡店店长决定先借给总统一杯黑咖啡,只要他 ...
- MYSQL5.7---ONLY_FULL_GROUP_BY 异常处理
异常介绍: ONLY_FULL_GROUP_BY 指的是你查询的语句使用到了group by 例如 select name,age from person group by sex; 此时你grou ...
- pdfminer获取每页的layout
#! python2 # coding: utf-8 import sys from pdfminer import pdfparser from pdfminer import pdfdocumen ...
- jira设置问题关闭之后不能继续编辑和添加备注
设置工作流中的Closed步骤的工作流属性值,增加两个: jira.permission.comment.user:(空) jira.issue.editable:false Closed这个步骤之后 ...
- Sublime Text 3 实现C++代码的编译和运行
在数据结构代码的编写中,我选用了优秀的编辑器 Sublime Text 3,但是在实现C++代码的编译和运行上费了一番周折,接下来我贴出 C++ 编译系统的代码,供各位参考. 编译后是在弹出的CMD命 ...
- 网页判断浏览器是否安装flash
<script> //检验flash版本 以及falsh是否安装 function detectFlash() { try { if(navigator.mimeTypes.length& ...
- vijos p1449 字符串还原
学习<algorithm>下的reverse函数 #include<iostream> #include<string> #include<algorithm ...
- [sublime3] 在linux下的终端中使用sublime3打开文件
通过ln命令创建软连接实现 echo $PATH 查看路径 例 我的路径是: /home/rh/anaconda3/bin:/home/rh/bin:/home/rh/.local/bin:/usr/ ...
- Django自带的后台管理系统
1.准备工作: 1-1.创建django项目和应用 1-2.修改settings.py配置文件: #应用配置: INSTALLED_APPS = [ 'django.contrib.admin', ' ...
- 什么是icmp协议?
英文原义:Internet Control Message Protocol 中文释义:(RFC-792)Internet控制消息协议 定义: ICMP协议是一种面向无连接的协议,用于传输出 ...