Consul实现原理系列文章3: Consul的整体架构
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理。在前几篇文章介绍完了Consul用到的两个关键性东西Raft和Gossip之后,这篇文章会讲述Consul的整体架构。本文基于一篇别的译文,并做了一些改进和完善。
术语表
代理(agent):
代理是Consul集群上每个成员的守护进程,它是由consul agent开始运行。代理能够以客户端或服务器模式运行。由于所有节点都必须运行代理,所以将节点引用为客户端或服务器更为简单,但还有其他实例的代理。所有代理可以运行DNS或HTTP接口,并负责运行检查和保持服务同步。客户端:
客户端可以将所有RPC请求转发到服务器的代理。客户端是相对无状态的。客户端执行的唯一后台活动是LANgossip池。它消耗最小的资源开销和少量的网络带宽。服务器端:
服务器端是具有扩展的功能的代理,它主要参与维护集群状态,响应RPC查询,与其他数据中心交换WAN gossip ,以及向leader节点或远程数据中心转发查询。数据中心:
虽然数据中心的定义似乎很明显,但仍有一些细微的细节必须考虑。比如说,在EC2中,多个可用中心(EC2和AZ是AWS里的概念,不了解的话可以去看看AWS文档)是否应该被人是一个单个的数据中心呢?我们将一个数据中心定义为一个私有、低延迟和高带宽的网络环境,这不包括通过公共互联网的通信。但是为了我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分。一致性 :
在我们的文档中,“一致性”的意思是对于被选举出的leader以及事物的顺序的认同。因为这些事件被应用到有限状态机上,我们对一致性的定义又暗含了复制备份的状态机的一致性。Gossip:
consul是建立在serf之上的,它提供了一个完整的gossip协议,用在很多地方。Serf提供了成员管理,故障检测和事件广播的功能。Gossip的节点到节点之间的通信使用了UDP协议。LAN Gossip:
指在同一局域网或数据中心的节点上的LAN Gossip池。WAN Gossip:
指包含服务器的WAN Gossip池,这些服务器在不同的数据中心,通过网络进行通信。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的整体架构的更多相关文章
- Consul实现原理系列文章2: 用Gossip来做集群成员管理和消息广播
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.这篇文章会讲述Consul是如何使用Gossip来做集群成员管理和消息广播的. Consul使用Go ...
- Consul实现原理系列文章1: 用Raft来实现分布式一致性
工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理.在前一篇文章中,我介绍了Raft算法.这篇文章会讲讲Consul是如何使用Raft算法来实现分布式一 ...
- MapReduce调度与执行原理系列文章
转自:http://blog.csdn.net/jaytalent?viewmode=contents MapReduce调度与执行原理系列文章 一.MapReduce调度与执行原理之作业提交 二.M ...
- FastDFS原理系列文章
FastDFS原理系列文章 基于FastDFS 5.03/5.04 2014-12-19 一.概述 FastDFS文档极少,仅仅能找到一些宽泛的架构文档,以及ChinaUnix论坛上作者对网友提问的一 ...
- RocketMQ架构原理解析(一):整体架构
RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...
- 并发系列6-Java并发面试系列文章总结【石杉的架构笔记】
- consul系列文章02---替换掉.netcore的配置文件
如果是开发微服务的项目,多个服务的配置管理起来比较麻烦,需要集中管理,也就是需要有配置中心: consul集成配置中心的思路:读取配置文件时不在从本地的应用中读取,而是从consul的KEY/valu ...
- 彻底搞懂 etcd 系列文章(三):etcd 集群运维部署
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
- 彻底搞懂 etcd 系列文章(二):etcd 的多种安装姿势
0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管.etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件 ...
随机推荐
- VS2017安装错误:工作负荷不完整,未能安装包“sqlcmdlnutils,version=15.1.61703.130,chip=x64,language=zh-CN”。
场景:已安装的VS2017维护安装MVC4时出现如下错误: 看问题描述是由于sqlcmdlnutils安装失败影响到其它组件的安装,于是单独下载此安装包进行安装,发现安装一切正常,继续维护VS2017 ...
- 如何用css做一个爱心
摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...
- CentOS6 安装golang
CentOS6 安装golang 下载 wget http://golangtc.com/static/go/1.8/go1.8.linux-amd64.tar.gz 1 1 1 解压 tar -xz ...
- Spring(八)编码剖析@Resource注解的实现原理
配置文件beans2.xml <?xml version="1.0" encoding="UTF-8"? > <beans xmlns=&qu ...
- Android实现批量照片上传至server,拍照或者从相冊选择
近期因为项目需求,须要完毕批量照片上传,折腾了一段时间,最终完毕了,达到了例如以下效果 主界面主要有GridView组成和button组成,当按下一个格点时,会调用相机或者相冊,拍照或者选择相冊照片, ...
- 时光轴二之RecyclerView版时光轴效果
由于如今RecyclerView是support-v7包中的新组件,是一个强大的滑动组件.与经典的ListView相比,相同拥有item回收复用的功能,可是直接把viewholder的实现封装起来,用 ...
- taro + iview 实现跨平台开发(App,Wap,微信小程序)
1.安装 (1)安装脚手架 npm install -g @tarojs/cli taro init myApp (2)H5端运行 npm run dev:h5 taro build --type h ...
- kinect脸部三维数据特征点标签语义具体说明
非常多零零碎碎的事情,导致非常久没写blog了.face animation的demo做完了也快一个月了.是时候总结总结了. Kinect获得的标识点共用121个.其给的sdk里面也给出了响应的标签. ...
- 豆瓣电台笔记3:cell添加从中间向两侧放大的动画
步骤: 1.设置动画属性的初始值 cell.layer.transform = CATransform3DMakeScale(0.1,0.1,1) 2.在指定时间内执行动画 UIView.animat ...
- SSH——基于datagrid实现分页查询
1. 修改页面中datagrid的URL地址,访问action // 取派员信息表格 $('#grid').datagrid( { iconCls : 'icon-forward', fit : tr ...