ETCD系列之三:网络层实现

ETCD系列之三:网络层实现

1. 概述

在理清ETCD的各个模块的实现细节后,方便线上运维,理解各种参数组合的意义。本文先从网络层入手,后续文章会依次介绍各个模块的实现。

本文将着重介绍ETCD服务的网络层实现细节。在目前的实现中,ETCD通过HTTP协议对外提供服务,同样通过HTTP协议实现集群节点间数据交互。

网络层的主要功能是实现了服务器与客户端(能发出HTTP请求的各种程序)消息交互,以及集群内部各节点之间的消息交互。

2. ETCD-SERVER整体架构

ETCD-SERVER 大体上可以分为网络层,Raft模块,复制状态机,存储模块,架构图如图1所示。

图1 ETCD-SERVER架构图

  • 网络层:提供网络数据读写功能,监听服务端口,完成集群节点之间数据通信,收发客户端数据;
  • Raft模块:完整实现了Raft协议;
  • 存储模块:KV存储,WAL文件,SNAPSHOT管理
  • 复制状态机:这个是一个抽象的模块,状态机的数据维护在内存中,定期持久化到磁盘,每次写请求会持久化到WAL文件,并根据写请求的内容修改状态机数据。

3. 节点之间网络拓扑结构

ETCD集群的各个节点之间需要通过HTTP协议来传递数据,表现在:

  • Leader 向Follower发送心跳包, Follower向Leader回复消息;
  • Leader向Follower发送日志追加信息;
  • Leader向Follower发送Snapshot数据;
  • Candidate节点发起选举,向其他节点发起投票请求;
  • Follower将收的写操作转发给Leader;

各个节点在任何时候都有可能变成Leader, Follower, Candidate等角色,同时为了减少创建链接开销,ETCD节点在启动之初就创建了和集群其他节点之间的链接。

因此,ETCD集群节点之间的网络拓扑是一个任意2个节点之间均有长链接相互连接的网状结构。如图2所示。

图2 ETCD集群节点网络拓扑图

需要注意的是,每一个节点都会创建到其他各个节点之间的长链接。每个节点会向其他节点宣告自己监听的端口,该端口只接受来自其他节点创建链接的请求。

4. 节点之间消息交互

在ETCD实现中,根据不同用途,定义了各种不同的消息类型。各种不同的消息,最终都通过google protocol buffer协议进行封装。这些消息携带的数据大小可能不尽相同。例如 传输SNAPSHOT数据的消息数据量就比较大,甚至超过1GB, 而leader到follower节点之间的心跳消息可能只有几十个字节。

因此,网络层必须能够高效地处理不同数据量的消息。ETCD在实现中,对这些消息采取了分类处理,抽象出了2种类型消息传输通道:Stream类型通道和Pipeline类型通道。这两种消息传输通道都使用HTTP协议传输数据。

图3 节点之间建立消息传输通道

集群启动之初,就创建了这两种传输通道,各自特点:

  • Stream类型通道:点到点之间维护HTTP长链接,主要用于传输数据量较小的消息,例如追加日志,心跳等;
  • Pipeline类型通道:点到点之间不维护HTTP长链接,短链接传输数据,用完即关闭。用于传输数据量大的消息,例如snapshot数据。

如果非要做做一个类别的话,Stream就向点与点之间维护了双向传输带,消息打包后,放到传输带上,传到对方,对方将回复消息打包放到反向传输带上;而Pipeline就像拥有N辆汽车,大消息打包放到汽车上,开到对端,然后在回来,最多可以同时发送N个消息。

Stream类型通道
Stream类型通道处理数据量少的消息,例如心跳,日志追加消息。点到点之间只维护1个HTTP长链接,交替向链接中写入数据,读取数据。

Stream 类型通道是节点启动后主动与其他每一个节点建立。Stream类型通道通过Channel 与Raft模块传递消息。每一个Stream类型通道关联2个Goroutines, 其中一个用于建立HTTP链接,并从链接上读取数据, decode成message, 通过Channel传给Raft模块中,另外一个通过Channel 从Raft模块中收取消息,然后写入通道。

具体点,ETCD使用golang的http包实现Stream类型通道:

  • 1)被动发起方监听端口, 并在对应的url上挂载相应的handler(当前请求来领时,handler的ServeHTTP方法会被调用)
  • 2)主动发起方发送HTTP GET请求;
  • 3)监听方的Handler的ServeHTTP访问被调用(框架层传入http.ResponseWriter和http.Request对象),其中http.ResponseWriter对象作为参数传入Writter-Goroutine(就这么称呼吧),该Goroutine的主循环就是将Raft模块传出的message写入到这个responseWriter对象里;http.Request的成员变量Body传入到Reader-Gorouting(就这么称呼吧),该Gorutine的主循环就是不断读取Body上的数据,decode成message 通过Channel传给Raft模块。

Pipeline类型通道
Pipeline类型通道处理数量大消息,例如SNAPSHOT消息。这种类型消息需要和心跳等消息分开处理,否则会阻塞心跳。

Pipeline类型通道也可以传输小数据量的消息,当且仅当Stream类型链接不可用时。

Pipeline类型通道可用并行发出多个消息,维护一组Goroutines, 每一个Goroutines都可向对端发出POST请求(携带数据),收到回复后,链接关闭。

具体地,ETCD使用golang的http包实现的:

  • 1)根据参数配置,启动N个Goroutines;
  • 2)每一个Goroutines的主循环阻塞在消息Channel上,当收到消息后,通过POST请求发出数据,并等待回复。

5. 网络层与Raft模块之间的交互

在ETCD中,Raft协议被抽象为Raft模块。按照Raft协议,节点之间需要交互数据。在ETCD中,通过Raft模块中抽象的RaftNode拥有一个message box, RaftNode将各种类型消息放入到messagebox中,有专门Goroutine将box里的消息写入管道,而管道的另外一端就链接在网络层的不同类型的传输通道上,有专门的Goroutine在等待(select)。

而网络层收到的消息,也通过管道传给RaftNode。RaftNode中有专门的Goroutine在等待消息。

也就是说,网络层与Raft模块之间通过Golang Channel完成数据通信。这个比较容易理解。

6 ETCD-SERVER处理请求(与客户端的信息交互)

在ETCD-SERVER启动之初,会监听服务端口,当服务端口收到请求后,解析出message后,通过管道传入给Raft模块,当Raft模块按照Raft协议完成操作后,回复该请求(或者请求超时关闭了)。

7 主要数据结构

网络层抽象为Transport类,该类完成网络数据收发。对Raft模块提供Send/SendSnapshot接口,提供数据读写的Channel,对外监听指定端口。

8. 结束

本文整理了ETCD节点网络层的实现,为分析其他模块打下基础。

时间: 2024-09-25 21:21:19

ETCD系列之三:网络层实现的相关文章

Docker生态系统系列之三:服务发现和分布式配置存储

本文讲的是Docker生态系统系列之三:服务发现和分布式配置存储,[编者的话]本文介绍了服务发现与全局可读配置存储两部分内容,不仅介绍了工作原理和工作方式,也介绍了与之相关的故障检测.重配置和安全问题,最后还介绍了常用的服务发现项目.整篇文章将这个知识点介绍的很全面细致,让读者能够对服务发现和全局可读配置存储有一个全面的认识,值得学习. 介绍 容器给寻找大规模设计与部署应用的需求提供了一个优雅的解决方案.在Docker提供实际容器技术的同时,许多其他的项目也在协助开发在部署环境中所需要的引导和沟

web标准实现高效开发系列之三

web|web标准 先点击这里下载Editplus CSS语法自动完成文件 先点击这里下载Editplus xHTML语法自动完成文件应版中朋友的要求我编写了一下xHtml的自动完成文件.下载后解压到EP的根目录下,然后在EP的首选项的语法中设定这个文件.然后用EP打开这个文件,看一下就清楚怎么用了. 举例:打一个"d"然后空格,然后EP就会把这个"d"变成<div></div> 先点击这里下载TopStyle 剪贴库文件 软件下载:TopS

ASP.NET企业开发框架IsLine FrameWork系列之三--七种武器

IsLine FrameWork Provider介绍 其中IsLine.Data.IsLine.AppLog是我要重点介绍的,不过现在先来简单说说各个Provider的作用. DataProvider 与其他框架一样,DataProvider为项目提供了与数据库交互的能力,它的优点在这里不再阐述,这里 只说一下它与其他框架的数据访问层不同的地方. DataProvider同时兼容SQL SERVER与ORACLE两种数据库,并开放IDBOperater接口,用户只要实现 IDBOperater

Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程

原文:Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列之三 SQL Server 开发利器 SQL Prompt 5.3.4.1 Edition T-SQL智能感知分析器 完全破解+使用教程 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.2.0.1337 Edition 数据库比较工具 完全破解+使用教程 Red Gate系列之二

完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

转载自 PiggyXP(小猪) 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三 手把手叫你玩转网络编程系列之三    完成端口(Completion Port)详解                                                              ----- By PiggyXP(小猪) 前 言         本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中

ETCD系列之二:部署集群

ETCD系列之二:部署集群 1. 概述 想必很多人都知道ZooKeeper,通常用作配置共享和服务发现.和它类似,ETCD算是一个非常优秀的后起之秀了.本文重点不在描述他们之间的不同点.首先,看看其官网关于ETCD的描述1: A distributed, reliable key-value store for the most critical data of a distributed system. 在云计算大行其道的今天,ETCD有很多典型的使用场景.常言道,熟悉一个系统先从部署开始.本

[基础知识]Linux新手系列之三_unix linux

给Linux新手 [系列之三] OK,从哪里得到Linux呢?为了讨论方便,省去不表要的枝节问题,我只讨论光盘安装.所以第一步是得到一张RedHat 6.2的光盘.得到光盘有两种方式,一种是去买光盘,这个比较简单,外面盗版盘就有,不过需要指出的是,RedHat 6.2的光盘不可能是盗版盘,因为RedHat 6.2遵循GPL协议,它是不收取版权费用的.所以任何人拷贝安装光盘都是合法的.所以不必为买到一张"RedHat 6.2的盗版盘"而沾沾自喜或有了偷盗成功的喜悦....只是需要注意,卖

数字整合营销传播系列之三:网络新闻发言人

数字整合营销传播系列之三:网络新闻发言人 文:高胜宁 核心提示:继广东省委办公厅推行"网友意见建议交办会".实现"网络施政"后,近日,广东省职能部门第一个"网络发言人"现身虚拟世界,将在网络上回应网民质疑.(8月7日<人民日报>).其实今年更早些时候,云南省相关部门已经推出了"网络发言人"制度,并已开始逐渐完善. 网络言论的碎片化,使得自由言论的界限不断受到互联网的挑战,虽然更多的网民对一些特定的结果提出了质疑,但

LXD 2.0系列之三:你的第一个LXD容器

本文讲的是LXD 2.0系列之三:你的第一个LXD容器,[编者的话]第三方调查报告显示LXD有潜质成为一款受欢迎的第三方容器管理工具.本文是LXD核心维护者.加拿大程序员Stéphane Graber有关LXD连载博文的第三篇. [LXD 2.0系列开篇:是时候讨论LXD的一切了][LXD 2.0系列之一:LXD简介][LXD 2.0系列之二:LXD安装和配置][LXD 2.0系列之三:你的第一个LXD容器][LXD 2.0系列之四:资源管理][LXD 2.0系列之五:镜像管理][LXD 2.0