工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理。在前几篇文章介绍完了Consul用到的两个关键性东西Raft和Gossip之后,这篇文章会讲述Consul的整体架构。本文基于一篇别的译文,并做了一些改进和完善。

术语表

  1. 代理(agent): 
    代理是Consul集群上每个成员的守护进程,它是由consul agent开始运行。代理能够以客户端或服务器模式运行。由于所有节点都必须运行代理,所以将节点引用为客户端或服务器更为简单,但还有其他实例的代理。所有代理可以运行DNS或HTTP接口,并负责运行检查和保持服务同步。

  2. 客户端: 
    客户端可以将所有RPC请求转发到服务器的代理。客户端是相对无状态的。客户端执行的唯一后台活动是LANgossip池。它消耗最小的资源开销和少量的网络带宽。

  3. 服务器端: 
    服务器端是具有扩展的功能的代理,它主要参与维护集群状态,响应RPC查询,与其他数据中心交换WAN gossip ,以及向leader节点或远程数据中心转发查询。

  4. 数据中心: 
    虽然数据中心的定义似乎很明显,但仍有一些细微的细节必须考虑。比如说,在EC2中,多个可用中心(EC2和AZ是AWS里的概念,不了解的话可以去看看AWS文档)是否应该被人是一个单个的数据中心呢?我们将一个数据中心定义为一个私有、低延迟和高带宽的网络环境,这不包括通过公共互联网的通信。但是为了我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分。

  5. 一致性 : 
    在我们的文档中,“一致性”的意思是对于被选举出的leader以及事物的顺序的认同。因为这些事件被应用到有限状态机上,我们对一致性的定义又暗含了复制备份的状态机的一致性。

  6. Gossip: 
    consul是建立在serf之上的,它提供了一个完整的gossip协议,用在很多地方。Serf提供了成员管理,故障检测和事件广播的功能。Gossip的节点到节点之间的通信使用了UDP协议。

  7. LAN Gossip: 
    指在同一局域网或数据中心的节点上的LAN Gossip池。

  8. WAN Gossip: 
    指包含服务器的WAN Gossip池,这些服务器在不同的数据中心,通过网络进行通信。

  9. RPC 
    远程过程调用。这种请求/响应机制允许客户端向服务器端发一个请求。

概览

让我们把这个图拆解开来分别讲述。

首先,图中有两个数据中心,分别为Datacenter1和Datacenter2。Consul非常好的支持多个数据中心,每个数据中心内,有客户端和服务器端,服务器一般为3~5个,这样可以在稳定和性能上达到平衡,因为更多的机器会使数据同步很慢。不过客户端是没有限制的,可以有成千上万个。

数据中心内的所有节点都会加入到Gossip协议。这就意味着有一个Gossip池,其中包含这个数据中心所有的节点。客户端不需要去配置服务器地址信息,发现工作会自动完成。检测故障节点的工作不是放在服务器端,而是分布式的;这使得失败检测相对于本地化的心跳机制而言,更具可拓展性。在选择leader这种重要的事情发生的时候,数据中心被用作消息层来做消息广播。

每个数据中心内的服务器都是单个Raft中节点集的一部分。这意味着他们一起工作,选择一个单一的领导者——一个具有额外职责的选定的服务器。leader负责处理所有查询和事物。事物也必须作为同步协议的一部分复制到节点集中的所有节点。由于这个要求,当非leader服务器接收到RPC请求时,就会将请求其转发给集群leader。

服务器端节点同时也作为WAN Gossip池的一部分,WAN池和LAN池不同的是,它针对网络高延迟做了优化,而且只包含其他Consul服务器的节点。这个池的目的是允许数据中心以最少的消耗方式发现对方。启动新的数据中心与加入现有的WAN Gossip一样简单。因为这些服务器都在这个池中运行,它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心中的随机服务器。那个服务器可能会转发给本地的leader。

这样会使数据中心的耦合非常低。但是由于故障检测,连接缓存和复用,跨数据中心请求相对快速可靠。

总的来说,数据不会在不同的数据中心之间做复制备份。当收到一个请求处于别的数据中心的资源时,本地的Consul服务器会发一个RPC请求到远端的Consul服务器,然后返回结果。如果远端数据中心处于不可用状态,那么这么资源也会不可用,但这不影响本地的数据中心。在一些特殊的情况下,有限的数据集会被跨数据中心复制备份,比如说Consul内置的ACL复制能力,或者像consul-replicate这样的外部工具。

参考文章: 
1. https://www.consul.io/docs/internals/architecture.html 
2. http://www.cnblogs.com/Summer7C/p/7327109.html

Consul实现原理系列文章3: Consul的整体架构的更多相关文章

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

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

  2. Consul实现原理系列文章1: 用Raft来实现分布式一致性

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

  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. RocketMQ架构原理解析(一):整体架构

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  6. 并发系列6-Java并发面试系列文章总结【石杉的架构笔记】

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

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

  8. 彻底搞懂 etcd 系列文章(三):etcd 集群运维部署

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

  9. 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...

随机推荐

  1. Nginx用作反向代理服务器

    Nginx作为反向代理服务器时转发请求的流程 客户端请求处理 当客户端请求来时,Nginx并不会立刻转发到上游服务器,而是想完整的接收到Nginx所在的服务器, 然后再把缓存的客户端的请求转发到上游服 ...

  2. html里嵌入CSS的三种方式

    在HTML中定义CSS的方式有:Embedding(嵌入式).Linking(引用式).Inline(内联式),下面通过实例为大家详细介绍下它们的特点   在HTML中常用以下3种方式定义CSS:Em ...

  3. D3.js系列——动态效果和Update、Enter、Exit的理解

    一.动态效果 D3 支持制作动态的图表.有时候,图表的变化需要缓慢的发生,以便于让用户看清楚变化的过程,也能给用户不小的友好感. 1.什么是动态效果 前面制作的图表是一蹴而就地出现,然后绘制完成后不再 ...

  4. solr curl索引 CSV/Json/xml文件

    在windows系统中,用curl命令工具索引文件命令: 启动solr 在solr-6.6.0\bin的同级目录下的文件夹ImportData下要索引的文件. 1.索引 json文件 curl &qu ...

  5. 字典对象的 Pythonic 用法(上篇:转载)

    转载:https://mp.weixin.qq.com/s?timestamp=1498528588&src=3&ver=1&signature=DfFeOFPXy44ObCM ...

  6. Java笔记3:Eclipse添加jar包

    本文以jedis包为例,演示Eclipse如何添加和使用jar包.   1 建立一个名为ImportJarDemo的JavaProject.在该工程下建立一个libs的文件夹. 2 将下载的jedis ...

  7. golang中的那些坑之迭代器中的指针使用

    今天在编写代码的时候,遇到了一个莫名其妙的错误,debug了半天,发现这是一个非常典型且易犯的错误.记之 示例代码: package main import "fmt" type ...

  8. 工作笔记4.struts2上传文件到server

    本文介绍两种:上传文件到server的方式   一种是提交Form表单:还有一种是ajaxfileupload异步上传. 一.JSP中:     1.提交Form表单 为了能完毕文件上传,我们应该将这 ...

  9. 为InfiniBand而哭泣

    自古就不乏还没有開始就结束的那种精彩.我称之为殉道者.InfiniBand就是当中之中的一个.尽管它有陨落之势,我依旧要为它鼓掌. 假设说以太网旨在将主机联系在一起,那么InfiniBand的初衷就是 ...

  10. DirectShow控制台输出和保存视频设备名称

    #include "windows.h" #include "TCHAR.h" #include <dshow.h> #include <ve ...