1.什么是Consul?

Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能控制平面。 这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全服务网格。 Consul需要数据平面并支持代理和本机集成模型。 Consul附带一个简单的内置代理,因此一切都可以开箱即用,但也支持第三方代理集成,如Envoy。
Consul 提供的关键功能:

  • 服务发现:Consul的客户端可以注册服务,例如api或mysql,其他客户端可以使用Consul来发现给定服务的提供者。使用DNS或HTTP,应用程序可以轻松找到它们所依赖的服务。
  • 运行状况检查:Consul客户端可以提供任意数量的运行状况检查,这些检查与给定服务(“是Web服务器返回200 OK”)或本地节点(“内存利用率低于90%”)相关联。运营人员可以使用此信息来监控群集运行状况,服务发现组件使用此信息将流量路由到远离不健康主机的地方。
  • KV 存储:应用程序可以将Consul的层级键/值存储用于任何目的,包括动态配置,功能标记,协调,领导者选举等。简单的HTTP API使其易于使用。
  • 安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。Intentions(意图)可用于定义允许哪些服务进行通信。可以使用可以实时更改的意图轻松管理服务分段,而不是使用复杂的网络拓扑和静态防火墙规则。
  • 多数据中心:Consul支持多个数据中心。这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。

2. Consul 的架构

2.1 Consul 中的术语
在描述架构之前,我们提供术语表以帮助澄清正在讨论的内容:

  • 代理(agent) - 代理是Consul集群的每个成员上长时间运行的守护程序。它是通过运行consul agent 命令来启动的。代理能够以客户端或服务器模式运行。由于所有节点都必须运行代理,因此将节点称为客户端或服务器更简单,但代理还有其他实例。所有代理都可以运行DNS或HTTP接口,并负责运行检查并保持服务同步。
  • 客户端模式(client agent) - 客户端是将所有RPC调用转发到服务器的代理。客户端是相对无状态的。客户端执行的唯一后台活动是参与LAN gossip pool(局域网 Gossip池)。这会花费非常非常小的资源并且仅消耗少量的网络带宽。
  • 服务器模式(server agent) - 服务器是具有扩展责任的代理,包括参与Raft仲裁,维护群集状态,响应RPC查询,与其他数据中心交换WAN Gossip(广域网Gossip)以及将查询转发给领导者或远程数据中心。
  • 数据中心 (datacenter)- 虽然数据中心的定义似乎很明显,但必须考虑细微的细节。例如,在EC2中,多个可用区域是否被视为包含单个数据中心?我们将数据中心定义为专用,低延迟和高带宽的网络环境。这排除了通过公共互联网的通信,但出于我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分。
  • 共识 (consensus)- 在我们的文档中使用时,我们使用共识来表示对当选领导者的协议以及对交易顺序的协议。由于这些事务应用于有限状态机,因此我们对共识的定义意味着复制状态机的一致性。维基百科上更详细地描述了共识,此处描述了我们的实现。
  • Gossip - Consul建立在Serf之上,它提供了一个完整的gossip 协议(八卦协议Gossip协议),用于多种用途。 Serf提供成员维护,故障检测和事件广播。我们对这些的使用在八卦文档中有更多描述。Gossip参与随机的节点到节点的通信,主要是通过UDP。
  • LAN Gossip - 指局域网八卦池,其中包含位于同一局域网或数据中心的节点。
  • WAN Gossip - 指仅包含服务器(servers)的WAN八卦池。这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。
  • RPC - 远程过程调用。这是一种允许客户端发出服务器请求的请求/响应机制。

2.2 一万英尺看Consul


让我们分解这个图像并描述每一块。首先,我们可以看到有两个数据中心,标记为“one”和“two”。 Consul为多个数据中心提供一流的支持,并期望这是常见的情况。

在每个数据中心内,我们都有客户端和服务端的混合体。预计有三到五台服务端。这在失败和性能的可用性之间取得平衡,因为随着更多机器的添加,共识逐渐变慢。但是,客户端数量没有限制,可以轻松扩展到数千或数万。

数据中心中的所有节点都参与八卦协议。这意味着有一个八卦池,其中包含给定数据中心的所有节点。这有几个目的:首先,不需要为客户端配置服务器的地址;发现是自动完成的。其次,检测节点故障的工作不是放在服务器上,而是分布式的。这使得故障检测比天真的心跳方案更具可扩展性。第三,它被用作消息传递层,用于在诸如领导者选举等重要事件发生时进行通知。

每个数据中心中的服务器都是单个Raft对等集的一部分。这意味着他们共同选举一个leader,一个具有额外职责的选定服务器。领导者负责处理所有查询和交易。作为共识协议的一部分,还必须将事务复制到所有对等体。由于此要求,当非领导者服务器收到RPC请求时,它会将其转发给群集leader。

服务器节点作为WAN八卦池的一部分运行。此池与LAN池不同,因为它针对较高的Internet延迟进行了优化,并且预计仅包含其他Consul服务器节点。此池的目的是允许数据中心以低触摸方式(low-touch manner)发现彼此。在线创建新的数据中心就像加入现有的WAN八卦池一样简单。由于服务器都在此池中运行,因此它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心的随机服务器。然后该服务器可以转发给本地领导者。

这导致数据中心之间的耦合非常低,但由于故障检测,连接缓存和多路复用,跨数据中心请求相对快速且可靠。

通常,不会在不同的Consul数据中心之间复制数据。当对另一个数据中心中的资源发出请求时,本地Consul服务器会将RPC请求转发给该资源的远程Consul服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用Consul的内置ACL复制功能,或者像consul-replicate这样的外部工具。

在某些地方,客户端代理可以缓存来自服务器的数据,以使其在本地可用,以提高性能和可靠性。示例包括连接证书Connect certificates和意图intentions ,允许客户端代理在没有往返服务器的情况下做出有关入站连接请求的本地决策。某些API端点还支持可选的结果缓存。这有助于提高可靠性,因为本地代理可以继续响应某些查询,例如服务发现或从缓存连接授权,即使与服务器的连接中断或服务器暂时不可用。

3. Gossip协议和Raft协议

要想理解Consul的原理,你是绕不过Gossip协议和Raft协议的。

3.1 八卦协议Gossip Protocol

3.1.1 什么是Gossip 协议
Gossip算法如其名,灵感来自办公室八卦,只要一个人八卦一下,在有限的时间内所有的人都会知道该八卦的信息,这种方式也与病毒传播类似,因此Gossip有众多的别名“闲话算法”、“疫情传播算法”、“病毒感染算法”、“谣言传播算法”。更多,可参见这篇博文

3.1.2 Consul中的八卦协议
Consul使用两个不同的八卦池。我们将每个池分别称为LAN或WAN池。

每个数据中心Consul都有一个LAN八卦池,包含数据中心的所有成员,包括客户端和服务器。 LAN池用于一些目的。成员资格信息允许客户端自动发现服务器,减少所需的配置量。分布式故障检测允许整个集群共享故障检测工作,而不是集中在少数服务器上。最后,八卦池允许为领导者选举等事件提供可靠和快速的事件广播。

WAN池是全局唯一的,因为无论数据中心如何,所有服务器都应该参与WAN池。 WAN池提供的成员资格信息允许服务器执行跨数据中心请求。集成故障检测允许Consul优雅地处理丢失连接的整个数据中心,或者只处理远程数据中心中的单个服务器。

所有这些功能都是通过利用Serf提供的。它用作嵌入式库以提供这些功能。从用户的角度来看,这并不重要,因为抽象应该由Consul掩盖。但是,作为开发人员,了解如何利用此库非常有用。

3.2 Raft协议
Raft 协议,主要负责leader选举和日志同步。
推荐你看一下这篇博客,
你也可以到这个网站通过动画的方式,像玩游戏一样在线体验raft协议的原理。

4.和Eureka的比较
Eureka因为是Netflix OSS套件的一部分,2.x停止维护,不过1.x仍然是活跃的。

这里重点说下consul与Eureka的区别。和其他系统的比较,可点击此网址自行查看。

Eureka是一种服务发现工具。该体系结构主要是客户端/服务器,每个数据中心有一组Eureka服务器,通常每个可用区域一个。通常,Eureka的客户使用嵌入式SDK来注册和发现服务。对于非本地集成的客户端,使用Ribbon等边车通过Eureka透明地发现服务。

Eureka使用尽力而为的复制提供弱一致的服务视图。当客户端向服务器注册时,该服务器将尝试复制到其他服务器但不提供保证。服务注册的生存时间(TTL)很短,要求客户端对服务器进行心跳检测。不健康的服务或节点停止心跳后,导致它们超时并从注册表中删除。发现请求可以路由到任何服务,由于尽力复制,这些服务可以提供过时或丢失的数据。这种简化的模型可以实现轻松的集群管理和高可扩展性。

Consul提供了一系列超级功能,包括更丰富的健康检查,键/值存储和多数据中心感知。 Consul需要每个数据中心中的一组服务器,以及每个客户端上的代理,类似于使用像Ribbon这样的边车。 Consul代理允许大多数应用程序不知道Consul,通过配置文件执行服务注册以及通过DNS或负载平衡器sidecars进行发现。

Consul提供强一致性保证,因为服务器使用Raft协议复制状态。 Consul支持丰富的运行状况检查,包括TCP,HTTP,Nagios / Sensu兼容脚本或基于Ture的Eureka。客户端节点参与基于八卦的健康检查,该检查分发健康检查的工作,而不像集中式心跳,这成为可扩展性挑战。发现请求被路由到当选的领事领导者,这允许他们默认情况下是强烈一致的。允许过时读取的客户端允许任何服务器处理其请求,从而允许像Eureka一样的线性可伸缩性。

Consul的强一致性意味着它可以用作领导者选举和集群协调的锁服务。 Eureka不提供类似的保证,并且通常需要为需要执行协调或具有更强一致性需求的服务运行ZooKeeper。

Consul提供了支持面向服务的体系结构所需的功能工具包。这包括服务发现,还包括丰富的运行状况检查,锁定,键/值,多数据中心联合,事件系统和ACL。 Consul和consul-template和envconsul等生态系统工具都试图最大限度地减少集成所需的应用程序更改,以避免需要通过SDK进行本机集成。 Eureka是更大的Netflix OSS套件的一部分,该套件期望应用程序相对同质且紧密集成。因此,Eureka只解决了有限的一部分问题,期望其他工具如ZooKeeper可以同时使用。

Consul 基本概念、内部原理相关推荐

  1. Consul 基本概念,同类比较和内部原理

    这个文章我们主要来说一下Consul的基本概念,以及其实现的内部原理,和Eureka的比较. # 1.什么是Consul? Consul是一种服务网格解决方案,提供具有服务发现,配置和分段功能的全功能 ...

  2. Git详解之九 Git内部原理

    以下内容转载自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各 ...

  3. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  4. git入门:概念、原理、使用

    git和Github 概念 Git --- 版本控制工具(命令). 工具介绍官方网站:http://git-scm.com 工具下载地址:http://git-scm.com/download/ gi ...

  5. Git内部原理之深入解析Git的引用和包文件

    一.Git 分支本质 如果对仓库中从一个提交(比如 1a410e)开始往前的历史感兴趣,那么可以运行 git log 1a410e 这样的命令来显示历史,不过需要记得 1a410e 是查看历史的起点提 ...

  6. java字节码运行原理_JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  7. Git 内部原理图解——对象、分支以及如何从零开始建仓库

    我们中的许多人每天都在使用  git,但是有多少人知道它的内部是怎么运作的呢? 例如我们使用  git commit  时发生了什么?提交(commit)与提交之间保存的是什么?两次提交之间难道只是文 ...

  8. 机器学习基础图表:概念、原理、历史、趋势和算法

    四大会计师事务所之一的普华永道(PwC)发布了多份解读机器学习基础的图表,其中介绍了机器学习的基本概念.原理.历史.未来趋势和一些常见的算法.为便于读者阅读,机器之心对这些图表进行了编译和拆分,分三大 ...

  9. 泛型与容器连载(一)泛型的基本概念和原理

    基本概念和原理 "泛型"的字面意思就是广泛的类型.接口和方法代码可以应用于广泛的类型,代码与他们能够操作的数据不在绑定在一起,同一套代码可以用于多种数据类型,这样不仅可以复用代码, ...

  10. Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解

    引言:众所周知,在mvc中,数据是在各个层次之间进行流转是一个不争的事实.而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的: 1. 数据在页面上是一个扁平的,不带 ...

最新文章

  1. qgridlayout 动态刷新
  2. jdbctemplate 开启事务_来,讲讲Spring事务有哪些坑?
  3. 听说你想去大厂看妹子,带你看看美团后端开发实习岗详细面经
  4. Self Service Password (SSP)
  5. Python Django后台管理模板美化:使用django-simpleui模块
  6. python eel 多线程_Python 基础
  7. C---蝉、蜻蜓、蜘蛛
  8. Redis Java调用
  9. php curl curlopt_getfields,PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
  10. 小白程序员最容易踩的“坑”,你踩过几个?
  11. 枪口对准Google无人车
  12. 21. Upgrade-Insecure-Requests: 1
  13. android 后台极光,Android 使用极光推送集成、出现问题和后台保活,android极光
  14. 美团外卖疑似割会员韭菜,“大数据杀熟”再次被拉上台面
  15. 剑指台积电!英特尔砸200亿美元建厂进军芯片代工
  16. samba更改其他端口,如何与windows共享文件夹
  17. 动画《魁拔妖侠传》反思
  18. bugkuCTF——猫片(安恒)
  19. java证书过期时间_我想用代码方式查看ca证书到期时间,以下是我的代码,可以显示日期,但是和实际的截止日期不一致...
  20. android在线root,android在线是什么意思上显示

热门文章

  1. ubuntu切换内核版本
  2. 微信小游戏、three.js、真机调试,出现锯齿的解决办法
  3. 适者生存,勇者胜~!
  4. 计算机网络(四)-奈氏准则和香农公式
  5. 【Unity】Git上传Unity工程GitHub
  6. 转:明茨伯格:管理,一次扮演好一个角色
  7. Socket编程学习-基础操作
  8. Fiddler的使用教程笔记
  9. seq2seq模型_彻底理解 Seq2Seq 模型
  10. bh1750c语言程序,用树莓派学编程系列4——环境光照强度测量