工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理。在前一篇文章中,我介绍了Raft算法。这篇文章会讲讲Consul是如何使用Raft算法来实现分布式一致性的。

Consul中的Raft

只有以server模式运行的Consul节点,才会被认为是Raft节点集的一部分。所有的client节点会把收到的请求转发到server节点中。这么设计的原因主要是出于性能方面的考虑:节点集中的个数越多,那么法定个数的值也就越大,这会导致leader节点可能需要等待数百个follower节点对一条log entry的agree信息。

在开始的时候,单个Consul server进入到bootstrap模式,这种模式允许它把自己选举为leader。当leader被选举出来之后,别的server就可以被加入到节点集中,从而保障了一致性和安全性。最终,当最初的几台server被加进来后,bootstrap模式可以被关闭。

consul server加入节点集之后,他们会知道哪台机器是当前的leader。当一个RPC请求到达一台非leader server上时,这个请求会被转发到leader上。如果这个请求是一个查询类型(只读),leader会基于现在的状态机生成结果。如果这个请求是一个事物类型的请求(会修改状态),leader会生成一个新的log entry,并用Raft的方法去处理它。当这个log entry被提交并且被应用到状态机上时,这个事物就算完成了。

Raft会把log entry复制到多台机器上,因此网络延迟对于性能的影响很大。因为这个原因,每个数据中心选出一个独立的leader并且维护一份不相交的节点集。数据通过数据中心的方式做分割,因此每个leader只对自己这个数据中心内的数据负责。当一个请求到达一个数据中心,这个请求会被转发到正确的leader那里。这种设计下,我们可以做到低延迟事物以及高可用,而不用牺牲一致性。

一致性模式

尽管所有的log entry的写入都会通过Raft来实现,读取却要灵活的多。为了支持开发者可能需要的多种权衡取舍,Consul对于读取,提供了三种不同的一致性模式。

这三种模式是:

default

Raft用到了leader约期的概念,意思是,在一个时间窗口中,leader认为自己的角色是稳定的。但是,如果leader节点与别的节点被分隔,即发生所谓“脑裂”现象,那么会有一个新的leader节点被选举出来。旧的leader节点将不能提交任何新的log entry, 但是如果它提供了对数据的读取,那么客户端读到的这些值可能是过期的。

默认模式是基于leader约期的,因此客户端可能读到过期的值。但是这种模式是对读取速度和一致性的一种取舍,牺牲了某些情况下的强一致性,以换取更高的读取速度。

consistent

这种模式是强一致性模式。这种模式要求leader节点每次做读和写操作时都要与法定个数的节点去确认自己仍然是leader。 牺牲读的速度,保障了强一致性。

stale

这种模式允许任何Consul server向外部提供读取操作,无论它是不是leader节点。  
这种模式特别快,但是读到过期数据的可能性非常大。这种模式允许在没有leader节点的情况下对读请求做出相应,尽管实际上这时候Raft集群已经是处于不可用状态了。

参考:

https://www.consul.io/docs/internals/consensus.html

Consul实现原理系列文章1: 用Raft来实现分布式一致性的更多相关文章

  1. Consul实现原理系列文章3: Consul的整体架构

    工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.在前几篇文章介绍完了Consul用到的两个关键性东西Raft和Gossip之后,这篇文章会讲述Con ...

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

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

  3. MapReduce调度与执行原理系列文章

    转自:http://blog.csdn.net/jaytalent?viewmode=contents MapReduce调度与执行原理系列文章 一.MapReduce调度与执行原理之作业提交 二.M ...

  4. FastDFS原理系列文章

    FastDFS原理系列文章 基于FastDFS 5.03/5.04 2014-12-19 一.概述 FastDFS文档极少,仅仅能找到一些宽泛的架构文档,以及ChinaUnix论坛上作者对网友提问的一 ...

  5. 打造云原生大型分布式监控系统系列文章-腾讯工程师roc

    附上本系列文章链接 打造云原生大型分布式监控系统(一): 大规模场景下 Prometheus 的优化手段 打造云原生大型分布式监控系统(二): Thanos 架构详解 打造云原生大型分布式监控系统(二 ...

  6. Zookeeper——分布式一致性协议及Zookeeper Leader选举原理

    文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...

  7. consul系列文章02---替换掉.netcore的配置文件

    如果是开发微服务的项目,多个服务的配置管理起来比较麻烦,需要集中管理,也就是需要有配置中心: consul集成配置中心的思路:读取配置文件时不在从本地的应用中读取,而是从consul的KEY/valu ...

  8. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  9. 【转载】分布式系列文章——Paxos算法原理与推导

    转载:http://linbingdong.com/2017/04/17/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0 ...

随机推荐

  1. .NET反编译

    http://www.cnblogs.com/powertoolsteam/archive/2011/01/05/1926066.html

  2. Docker实践4: 基于nginx对后端的weblogic负载均衡

    为什么要用Nginx(抄了一段) 1.nginx相对于apache的优点: 轻量级,同样起web服务,比apache占用更少的内存及资源 抗并发,nginx处理请求是异步非阻塞的,而apache则是阻 ...

  3. C++11的初始化列表

      初始化是一个非常重要的语言特性,最常见的就是对对象进行初始化.在传统 C++ 中,不同的对象有着不同的初始化方法,例如普通数组.POD (plain old data,没有构造.析构和虚函数的类或 ...

  4. hdu 1863 畅通project

    #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm& ...

  5. 使用.reg文件删除暴风影视库图标和注册信息

    暴风播放器安装后会自动安装一个叫暴风影音库的软件,在你的电脑资源管理器中增加了一个“暴风影视库”的图标.看着很烦,删起来还比较麻烦,于是搜索了相关资源,自己写了个注册表处理文件,方便大家一键删除之. ...

  6. table表头固定

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. vue-resource基本使用方法

    一.vue-resource特点 1.体积小:vue-resource非常小巧,在压缩以后只有大约12KB,服务端启用gzip压缩后只有4.5KB大小,这远比jQuery的体积要小得多. 2.支持主流 ...

  8. Java solr 分词

    代码如下: import java.io.IOException; import java.util.*; import org.apache.solr.client.solrj.SolrClient ...

  9. 《深入理解Java虚拟机》笔记3

    垃圾收集算法 (1)标记清除 根据根搜索确定对象是否已死,已死对象标记,然后一起清除. 这个其实不算什么算法,最正常想法应该就是这样.但是,缺点 是效率不高,如果有很多不连续的小对象需要回收,会花好多 ...

  10. Druid对比Impala/Shark

    Druid 和 Impala Shark 的对比取决于产品要求, 取决于系统是设计成做什么的 Druid 被设计成 一直在线, 高可用性    实时插入数据    分片分块形式的任意查询据我所知 Im ...