Consul使用Consensus协议提供一致性(Consistency)——CAP定义的一致性。Consensus协议是基于"Raft:In search of an Understandable Consensus
Algorithm"
实现的。

本节主要讲解consul内部技术细节,使用consul不需要必须了解这些细节的。这些文章是为那些不愿意深入源代码但是希望技术细节的人准备的。

1   Raft协议概况

Raft是一种基于Paxos的Consensus算法。相比于Paxos,Raft设计采用了较少的状态,并且是一种更简单、更易于理解的算法。

在讨论Raft前,需要了解一些术语:

Log – Raft系统的基本的工作但是与Log entry。一致性相关的问题可以分解为replicated log。一个log是一个顺序的条目列表(entrylist)。如果所有的成员均同意log的entry和顺序,那么则认为log是一致的。

FSM – 有限状态机,有限个状态以及在这些状态之间的转移和动作等行为的数学模型。新log的应用,FSM会发生状态转换,相同的LOG序列的应用必须导致相同的状态,这意味着行为必须是确定性的。

Peer set –参与log replication的成员组成了Peer set,对于Consul而言,所有的server节点均属于本地数据中心的peer set。

Quorum – (汉语可以翻译为法定人数)peer set中成员的最大数。对于N的set,quorum要求至少有(N/2)+1成员。例如,peer set有5个Server节点,就需要至少3个节点才能形成quorum。无论什么原因,只要quorum是无效的,那么cluster就会变为unavailable,并且不会再有log提交。

CommittedEntry – 当日志持久地存储在quorum个节点后才能成为commited entry。一旦entry被提交,它才能被使用。

Leader - 在任何给定的时间,peer set选举一个节点作为Leader。当logcommited时,Leader负责新entry 处理、复制到Followers、管理条目。

Raft是一个复杂的协议,这里不会详细讨论细节,将不会在这里详细介绍(如果希望更全面的了解,可以参阅Paper)。

本文会从框架上来描述Raft,并构建一个智慧模型。

Raft节点总会是Follower、candidate、Leader三个状态之一。所有的节点最初开始作为一个Follower。在这种状态下,节点可以接受来自Leader的log enties或投票。如果一段时间内没有收到entries,节点自我提升到candidate状态。在candidate状态,节点请求来自peer节点的投票。如果一个candidate节点获得的票数超过quorum,然后该节点会晋升为Leader。Leader必须接受新的日志条目,并复制到所有其他的Follower。此外,如果stale
read(过时的读取)是不可接受的,所有的查询也必须在Leader节点执行。

一旦集群有了Leader,并且Leader能够接受新的日志条目。Client节点可以请求Leader追加新的日志条目(从Raft角度看,日志是一个不透明的二进制blob)。然后,Leader将entry写入持久存储,并尝试复制到quorum个Follower节点。一旦logentry被认为commited,那么它就可以应用于FSM。FSM是专用的;在Consul中,我们使用BoltDB维护集群状态。

让Replicatedlog无限制的增加,显然是不可取的方式。Raft提供了一种机制——压缩当前状态的快照和日志。因为FSM是抽象的,重放过去一段时间的旧日志来恢复FSM的状态,必然导致相同的状态。因此,在一个时间点,当Raft采集到FSM状态后,会删除转换到该状态所使用到的所有的旧日志,无需用户干预自动执行,可以防止无限制的磁盘使用,同时也减少了重放日志时间。使用boltdb的优点是,它允许Consul继续接受新的交易,即使旧状态正在创建快照,避免产生任何可用性的问题。

只要有quorum个节点有效,Consensus是容错的。如果有效节点数无法达到的quorum,那么不可能处理log entry或维护成员关系。例如,假设只有2个peer:A和B。quorum也是2,这意味着这两个节点必须同意提交日志条目。如果A或B有一个失败,现在是不可能满足quorum个节点有效的条件。这意味着群集无法添加或删除节点或提交任何额外的日志条目。这样的结果就是集群不可用。这时,需要手动干预,删除A或B,然后以引导模式重新启动剩余节点。

3个节点的Raft集群可以容忍1个节点故障,5节点的集群可以容忍2个节点的故障。因此,Consul推荐部署包含3或5个Server节点的数据中心。这样可以最大限度地提高可用性,而不会大大牺牲性能。下面的表格总结了集群节点数目与容忍的故障节点数目:

Servers

Quorum Size

Failure Tolerance

在性能方面,对比Raft与Paxos。假设都存在稳定的Leader,提交一个日志条目需要写入到quorum个节点。因此,性能是由磁盘I / O和网络延迟的限制。虽然Consul不是以设计高吞吐量的写系统为目标,能否处理数以百千计的事务还是取决于网络和硬件配置。

1.1 Raft in Consul

只有ConsulServer节点参与Raft、是peer set的一员。所有的Client节点只是转发请求到Server。这种设计的考虑是,当更多的成员加入到peer set中时,quorum的规模也会增加。可能会导致性能问题——等待quorum个节点 log entry。

       启动Consul时,单个consul节点需要以bootstrap模式运行,该模式运行自我选举为leader。一旦Leader被选出来,其他Server可以添加Peer set中,保持一致性和安全性。最终,一旦一些Server添加到集群,bootstrap模式就需要禁用。

因为所有Server都是Peer set中的医院,它们都知道谁是Leader。当一个RPC请求到达某个非Leader Server节点,请求就会被转发到Leader。如果RPC是一种query类型,这意味着它是只读的,Leader会基于FSM当前生成相应的结果,如果RPC是一种transaction类型,即修改状态,Leader产生一个新的日志条目,并基于Raft算法进行管理。一旦日志条目应用于有限状态机,transaction完成。

由于Raft的副本性质,性能对网络延迟是非常敏感的。为此,每个数据中心选择独立的Leader和维护一个不相交的peer set。数据按照数据中心进行划分,所以每个Leader只负责在相应数据中心的数据。当接收到一个远程数据中心的请求时,请求会被转发到相应的Leader。这种设计在不牺牲一致性的情况实现较低延迟交易和更高的可用性。

1.2 一致性模式

虽然所有日志副本的写入都是基于Raft,读取更灵活。但为了支持开发人员可能需要的各种权衡,Consul支持3种不同的一致性模式。

三种读模式是:

•Default-Raft采用Leader租赁模式,提供了一个时间窗口,在该时间段内,Leader角色是稳定的。但是,如果Leader从Peers set分裂出去,新的Leader就可能选举出来,而旧Leader持有租赁。这意味着有2个leader节点。因为旧Leader不能提交新日志,就没有脑裂的风险。然而,如果旧Leader执行任何读取操作,其读取到的结果就可能是陈旧的。Default一致性模式只依赖于Leader租赁,Client可能使用过期的数据。之所以这么权衡,因为读取是快速的,通常是采用强一致性模式,比较难以触发的情。并且时间窗口也是有界的,时间到了,leader也会下台。

•consistent,这种模式是无条件一致性。它要求leader必须与quorum个peer校验,虽然它仍然是Leader。这将引入额外的节点轮训,增加了延迟。采用一致性读取,会导致额外的轮训开销。

•stale-这种模式允许在任何Server节点执行读取操作,无论它是不是Leader。这意味着可能读取到旧的数据,但一般而言,速度与leader相比差距在50毫秒内。这种方式,读取速度是非常快的,但可能是旧的数据。这种模式下,即使没有Leader,一样可以相应读取操作。

【Consul】Consul架构-Consensus协议的更多相关文章

  1. 【Consul】Consul架构-Gossip协议

    Consul使用gossip协议管理成员关系.广播消息到整个集群.详情可参考Serf library,Serf使用到的gossip协议可以参阅"SWIM: Scalable Weakly-c ...

  2. .NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

    先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访问系统的组件. 参考 本文将使用 Ocelot 构建统一入口的 Gateway. 关于 IdentityS ...

  3. 【转】.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

    作者:Zhang_Xiang 原文地址:.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现 先决条件 关于 Ocelot 针对使用 .NET 开发 ...

  4. Consul部署架构

    Consul 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接,用于实现分布式系统的服务发现与配置. 应用Consul提供的服务需要建立Consul集群.在Consul方案中,每个 ...

  5. 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务

    搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...

  6. consul:架构

    官方文档:https://www.consul.io/docs/internals/architecture.html

  7. consul Consul vs. ZooKeeper, doozerd, etcd

    小结 1.Consul 功能更丰富: 2. 暴露http接口避免暴露系统复杂性 The Consul clients expose a simple HTTP interface and avoid ...

  8. web 架构 /http协议,状态码,django中常用命令

    什么是web应用? web应用 架构 :B/S架构 | C/S架构 网站:BS架构其实就是应用程序: B是浏览器 S是sever(实现了wsgi协议,实现了socket的服务端) + applicat ...

  9. [转】LTE整体架构和协议架构概述

    1.1 LTE整体架构 LTE(Long Term Evolution,长期演进)是由3GPP(The 3rd Generation Partnership Project,第三代合作伙伴计划)组织制 ...

随机推荐

  1. Hibernate 基于外键映射的一对一关联关系随手记

    //有外键的一端默认使用懒加载. //没有外键的一端不使用懒加载,而是直接将它引用的对象也一并查询出来. //没有外键列不仅有外键约束还有唯一约束,即没有外键列一端的对象不能被有外键列一端的两个对象同 ...

  2. gluon 实现多层感知机MLP分类FashionMNIST

    from mxnet import gluon,init from mxnet.gluon import loss as gloss, nn from mxnet.gluon import data ...

  3. 2018.11.25 struts2与OGNL表达式的结合(高级)

    两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...

  4. P2382 化学分子式

    luogu的oier化学一定都很好 这个题是让我们模拟计算化学方程式的过程. 和时间复杂度类似的题目. 我们可以根据括号,将求解分成若干个步骤. 从外部看,需要将一对括号看做一个整体.然后进行计算. ...

  5. 【luogu P1816 忠诚】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1816 用st表来解决rmq问题. 表示同时培训学的st表,然后我就忘得差不多了,在这里推荐一篇blog 大佬 ...

  6. oracle快速添加用户及授权

    --Oracle使用的是用户管理模式--意味着,Oracle的数据使用用户来分割 --以后开发,我们需要每个项目都需要使用一个用户 --所以:一个数据文件是可以放多个用户的数据的.但是我们开发从数据的 ...

  7. iOS | FMDB快速上手

    任何的开发都或多或少的接触到数据库,而在IOS中一般使用的是SQLite数据库,这是一个轻量功能较为不错的数据库.而现在用到比较多的第三方数据库操作框架就是FMDB.废话不多说,相信查找到这篇文章的都 ...

  8. SmallMQ发布

    最近一直学习,主要处理java的分布式,MQ,RPC,通信,数据库,缓存等方向. 一般现在的MQ都是企业级的,庞大,功能齐全.最主要是代码量大,对于我们这些小程序员而言,太大,修改困难,修复更加困难, ...

  9. span没有name属性

    <span id="test" name="测试数据">测试咯</span> 在eclipse中这么写发现会有警告提示.百度发现原来sp ...

  10. 你的sql查询为什么这么慢?

    做后台开发的程序猿通常需要写各种各样的sql,可很多时候写出来的sql虽然能满足功能性需求,性能上却不尽人意.如果业务复杂,表结构和索引设计又不合理的话,写出来的sql执行时间可能会达到几十甚至上百秒 ...