热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

etcd笔记(01)—etcd简介、特点、应用场景、常用术语、分布式CAP理论、分布式原理

1.etcd简介etcd官网定义:Ahighly-availablekeyvaluestoreforsharedconfigurationandservicedis

1. etcd 简介

etcd 官网定义:


A highly-available key value store for shared configuration and service discovery.


即一个用于配置共享和服务发现的键值存储系统。

etcd 是一款分布式存储中间件,使用 Go 语言编写,并通过 Raft 一致性算法处理和确保分布式一致性,解决了分布式系统中数据一致性的问题。

而且作为一款分布式、可靠的键值存储组件,etcd 常用于微服务架构中的服务注册与发现中心,相较于 ZooKeeper 部署更简单,而且具有数据持久化、支持 SSL 客户端安全认证的独特优势。

etcd 作为一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。

etcd 可集中管理配置信息。服务端将配置信息存储于 etcd,客户端通过 etcd 得到服务配置信息,etcd 监听配置信息的改变,发现改变通知客户端。

etcd 满足 CAP 理论中的 CP(一致性和分区容错性) 指标,由此我们知道,etcd 解决了分布式系统中一致性存储的问题。


2. etcd 特点

etcd 可以用来构建高可用的分布式键值数据库,总结来说有如下特点。


  • 简单:安装简单,且为用户提供了 HTTP API,使用起来也很简单;
  • 存储:数据分层存储在文件目录中,类似于我们日常使用的文件系统;
  • Watch 机制:Watch 指定的键、前缀目录的更改,并对更改时间进行通知;
  • 安全通信:支持 SSL 证书验证;
  • 高性能:etcd 单实例可以支持 2K/s 读操作,官方也有提供基准测试脚本;
  • 一致可靠:基于 Raft 共识算法,实现分布式系统内部数据存储、服务调用的一致性和高可用性;
  • Revision 机制:每个 Key 带有一个 Revision 号,每进行一次事务便加一,因此它是全局唯一的,如初始值为 0,进行一次 Put 操作,KeyRevision 变为 1,同样的操作,再进行一次,Revision 变为 2;换成 Key1 进行 Put 操作,Revision 将变为 3。这种机制有一个作用,即通过 Revision 的大小就可知道写操作的顺序,这对于实现公平锁,队列十分有益;
  • Lease 机制:即租约机制(TTL,Time To Live),Etcd 可以为存储的 Key-Value 对设置租约,当租约到期,Key-Value 将失效删除;同时也支持续约,通过客户端可以在租约到期之前续约,以避免 Key-Value 对过期失效;此外,还支持解约,一旦解约,与该租约绑定的 Key-Value 将失效删除;

etcd 是一个实现了分布式一致性键值对存储的中间件,支持跨平台,etcd 集群中的节点基于 Raft 算法进行通信,Raft 算法保证了微服务实例或机器集群所访问的数据的可靠一致性。

在分布式系统或者 Kubernetes 集群中,etcd 可以作为服务注册与发现和键值对存储组件。


3. 应用场景

etcd 在稳定性、可靠性和可伸缩性上表现极佳,同时也为云原生应用系统提供了协调机制。etcd 经常用于服务注册与发现的场景,此外还有键值对存储、消息发布与订阅、分布式锁等场景。


3.1 键值对存储

etcd 是一个用于键值存储的组件,存储是 etcd 最基本的功能,其他应用场景都建立在 etcd 的可靠存储上。比如 Kubernetes 将一些元数据存储在 etcd 中,将存储状态数据的复杂工作交给 etcd,Kubernetes 自身的功能和架构就能更加稳定。


3.2 服务注册与发现

etcd 基于 Raft 算法,能够有力地保证分布式场景中的一致性。各个服务启动时注册到 etcd 上,同时为这些服务配置键的 TTL 时间。注册到 etcd 上面的各个服务实例通过心跳的方式定期续租,实现服务实例的状态监控。


3.3 消息发布与订阅

在分布式系统中,服务之间还可以通过消息通信,即消息的发布与订阅,如下图所示:
发布与订阅
通过构建 etcd 消息中间件,服务提供者发布对应主题的消息,消费者则订阅他们关心的主题,一旦对应的主题有消息发布,就会产生订阅事件,消息中间件就会通知该主题所有的订阅者。


3.4 分布式锁

分布式系统中涉及多个服务实例,存在跨进程之间资源调用,对于资源的协调分配,单体架构中的锁已经无法满足需要,需要引入分布式锁的概念。etcd 基于 Raft 算法,实现分布式集群的一致性,存储到 etcd 集群中的值必然是全局一致的,因此基于 etcd 很容易实现分布式锁。


4. etcd 的核心架构架构图

从上图可知,etcdetcd ServergRPC Server、存储相关的 MVCCSnapshotWAL,以及 Raft 模块。

其中:


  • etcd Server 用于对外接收和处理客户端的请求;
  • gRPC Server 则是 etcd 与其他 etcd 节点之间的通信和信息同步;
  • MVCC 即多版本控制,etcd 的存储模块,键值对的每一次操作行为都会被记录存储,这些数据底层存储在 BoltDB 数据库中;
  • WAL 预写式日志,etcd 中的数据提交前都会记录到日志;
  • Snapshot 快照,以防 WAL 日志过多,用于存储某一时刻 etcd 的所有数据;
  • SnapshotWAL 相结合,etcd 可以有效地进行数据存储和节点故障恢复等操作;

虽然 etcd 内部实现机制复杂,但对外提供了简单的 API 接口,方便客户端调用。我们可以通过 etcdctl 客户端命令行操作和访问 etcd 中的数据,或者通过HTTP API 接口直接访问 etcd

etcd 中的数据结构很简单,它的数据存储其实就是键值对的有序映射。etcd 还提供了一种键值对监测机制,即 Watch 机制,客户端通过订阅相关的键值对,获取其更改的事件信息。Watch 机制实时获取 etcd 中的增量数据更新,使数据与 etcd 同步。

etcd 目前有 V2.xV3.x 两个大版本。etcd V2V3 是在底层使用同一套 Raft 算法的两个独立应用,但相互之间实现原理和使用方法上差别很大,接口不一样、存储不一样,两个版本的数据互相隔离。

至于由 etcd V2 升级到 etcd V3 的情况,原有数据只能通过 etcd V2 接口访问,V3 接口创建的数据只能通过新的 V3 的接口访问。

etcd 架构图:
架构图通常,etcd 会监听两个端口,默认是 2379 端口和 2380 端口。其中,2380 端口用于集群内部通信,主要涉及集群间数据同步、心跳、选举等。2379 端口用于与客户端通信,比如接收客户端发起的读/写数据请求。

etcd 节点在部署的时候有两种运行模式:集群模式和代理模式。

etcd 节点以集群模式运行时,它会加入已有集群中,作为集群的一部分。也就是说,后续的心跳、数据同步、选举等它都会参与。

集群模式中的节点数一般采用奇数个。为什么呢?因为假如同时有两个 Candidate 发起选举,如果是偶数节点的话,可能存在两个 Candidate 获得相同票数。

这会导致什么问题?如果两个 Candidate 票数一样,就需要再次发起选举,而再次发起选举还是有一定概率出现票数一样,这会导致选举耗时较多,影响稳定性。所以,采用奇数个节点,能有效降低票数一样的概率,提升选举的效率。另外,使用奇数节点来部署,也能让 etcd 很好地处理分区容错问题。

当某个 etcd 节点以代理模式运行时,该节点负责将接收到的请求转发给 etcd 集群节点。目前 etcd 接口有 v2v3 两个版本,其中 v2HTTP 接口,v3gRPC 接口。需要注意的是,代理模式只支持转发 v2 版本的请求,也就是只支持转发 HTTP 请求。

15不过,由于 etcd v3 接口在性能、安全、稳定性等方面要比 v2 接口优秀很多,新项目倾向于使用 v3 接口,老项目也逐渐从 v2 接口迁移到 v3 接口。也就是说,代理模式以后可能逐渐被淘汰掉。


5. 分布式中的 CAP 理论

CAP 原理是描述分布式系统下节点数据同步的基本定理,分别指


  • Consistency(一致性)

指数据一致性,表示一个系统的数据信息(包括备份数据)在同一时刻都是一致的。在分布式系统下,同一份数据可能存在于多个不同的实例中,在数据强一致性的要求下,修改其中一份数据后必须同步到它的所有备份中。在数据同步的任何时候,都需要保证所有对该份数据的请求将返回同样的状态。


  • Availability(可用性)

指服务可用性,要求服务在接收到客户端请求后,都能够给出响应。服务可用性考量的是系统的可用性,要求系统在高并发情况和部分节点宕机的情况下,系统整体依然能够响应客户端的请求。


  • Partition tolerance(分区容错性)

指分区容忍性。在分布式系统中,不同节点之间通过网络进行通信。由于网络的不可靠性,位于不同网络分区的服务节点可能会通信失败,如果系统能够容忍这种情况,说明它是满足分区容忍性的。如果系统不能满足,将会限制分布式系统的扩展性,即服务节点的部署数量和地区都会受限,也就违背了分布式系统设计的初衷,所以一般来说分布式系统都会满足分区容忍性。
CAP

这三个要素最多只能同时实现两点,不能三者兼顾。

基于分布式系统的基本特质,P(分区容错性)是必须要满足的,所以接下来需要考虑满足 C(一致性)还是 A(可用性)。

但是在满足了分区容忍性的前提下,分布式系统并不能同时满足数据一致性和服务可用性。

假设服务 A 现在有两个实例 A1A2,它们之间的网络通信出现了异常,基于分区容忍性,这并不会影响 A1A2 独立的正常运行。假如此时客户端请求 A1,请求将数据 BB1 状态修改为 B2,由于网络的不可用,数据 B 的修改并不能通知到实例 A2

如果此时另一个客户端向 A2 请求数据 B,如果 A2 返回数据 B1,将满足服务可用性,但并不能满足数据一致性;如果A2 等待 A1 的通知后才返回数据 B 的正确状态,虽然满足了数据一致性,但并不能响应客户端请求,违背了服务可用性的指标。

在类似银行之类对金额数据要求强一致性的系统中,要优先考虑满足数据一致性;而在大众网页之类的系统中,用户对网页版本的新旧不会有特别的要求,在这种场景下服务可用性会高于数据一致性。

BASE理论


6. 常用术语

常用术语


7. 分布式原理


7.1 客户端

当 RPC 服务部署在多个节点上时,客户端得到的是一个服务列表,有多个 IP 端口对。客户端的连接池可以随机地挑选任意的 RPC 服务节点进行连接。

每个服务节点应该有个权重值,当所有节点的权重值一样时,它们的流量分配就是均匀的。如果某个节点的相对权重值较小,它被客户端选中的概率也会相对比较小。

class RPCNode {String addr; // 服务地址int weight; // 节点权重
}class RPCCluster {RPCNode[] nodes; // 节点列表Node random(); // 按权重随机挑选节点
}

7.2 容灾

当有一个服务节点挂掉时,客户端需要采取一定的策略避免请求失败。当请求失败时,客户端还要进行重试,但是也不可以无限重试,要有一定的重试策略。

比如当节点挂掉时,将失效节点摘除,放置到失效节点列表中。然后每隔一段时间检查失效节点是否恢复了,如果恢复了,那就从失效节点中移除,再将节点地址重新加入到有效节点列表中。那如何判断节点真的挂掉了呢,一般需要设置一个时间窗口,统计在一定时间窗口里出现的错误数量。如果这个数量过大,那就意味着失效了。这也是为了防止网络偶然抖动导致服务节点流量的大幅波动。


7.3 降权法

上面提到客户端会为每个节点赋予一个权值,改变权值就可以改变节点的相对流量。如果某个节点出现了一次调用错误,可以对该节点进行降权。如果错误次数过多,降权会降的很快,最终达到一个最小值。之所以不应该降到零,那是为了给节点提供一个恢复的机会。被降权的节点后来只要有一次调用成功,那么 weight 值就应该尽快被还原,这样节点就可以快速恢复为正常节点。

客户端一次调用失败会尝试重试。如果降权太慢,会导致重试次数太多,因为第二次随机挑选节点时还是很有可能再次挑选到失效节点。降权太快也不好,网络抖动会导致节点流量分配的快速抖动,瞬间从正常降到近零,又可以瞬间从近零恢复到正常。

一个简单的策略是权重减半法。错误一次权重减半,连续错误两次权重就降到 1/4,如此直到降到最小值。如果初始权重值是 1024,那么权重值就会逐渐衰减1024=>512=>256=>128=>64=>32=>16=>8=>4=>2=>1。如果节点恢复了,那么调用会成功,权重就可以直接恢复到正常值,也可以通过加倍法逐渐恢复到正常值1=>2=>4=>8=>16=>32=>64=>128=>256=>512=>1024。如果希望恢复的更快一点,可以通过乘 4 法,乘 8 法。


7.4 服务发现

健壮的服务应该是可以支持动态扩容的服务。比如 RPC 服务压力过大,希望通过增加节点的方式来减小单个 RPC 服务的压力。如果使用的是前面的静态 RPC 服务地址列表,那么当节点增加时,我们需要修改客户端的配置重启才能生效。

通过服务发现技术,当 RPC 服务节点增加或减少时,客户端可以动态快速收到服务列表的变更信息,从而可以实时调整连接配置,这样无需重启就可以完成服务的扩容和缩容。

class ServiceDiscovery(object):def register_service(self, name, addr):passdef get_services(self, name):passdef on_services_changed(self, name):pass

服务发现技术依赖于服务之间的特殊中间节点。这个节点的作用就是接受服务的注册,提供服务的查找,以及服务列表变更的实时通知功能。它一般使用支持高可用的分布式配置数据库作为解决方案,如 zookeeper/etcd 等。


  • 服务注册——服务节点在启动时将自己的服务地址注册到中间节点
  • 服务查找——客户端启动时去中间节点查询服务地址列表
  • 服务变更通知——客户端在中间节点上订阅依赖服务列表的变更事件。当依赖的服务列表变更时,中间节点负责将变更信息实时通知给客户端。

推荐阅读
  • 基于SSL的mysql服务器的主从架构实现说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器从服务器的mysql软件版 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 云原生SRE
    序言年底了,没有分手的朋友的赶紧分了,所谓新年新气象,年年不重样。去留无意,望看风卷残云。。。运维不会消失,但 ... [详细]
  • 原创 | 大数据入门基础系列之ClouderaManager版本的Hive安装部署
    添加服务,一 ... [详细]
  • 1:SpringCloud、Dubbo等微服务主流开发框架盛行,SpringCloud也被开发者认为是最好的开发框架;2:Docker:容器和微服务相辅相成,两大技术成熟的时间点非常契合。 ... [详细]
  • 机械硕士,因实验室师兄毕业拿5K,自学Java转型大数据
    个人情况我是本硕机械专业,毕业半年,最初接触java是由于研二的时候,看到了实验室师兄们找工作那个艰难啊,硕士毕业最少的拿了 ... [详细]
  • dubbo学习 一 dubbo概述
    1,背景1,网站刚开时候的时候可能所有的功能业务都在一个应用里面2,当业务不断复杂,流量不断增多的时候,就需要将原先的一个应用划分成多个独立的应用。3,当分出来的业务越来越多的时候 ... [详细]
  • Hbase 进阶
    一、RegionServer架构1)StoreFile保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上。每个Store会有一 ... [详细]
  • 服务注册中心到底应该选AP模型还是CP模型?
    当下,分布式系统正变得越来越重要,大型网站几乎都是分布式的。分布式系统的最大难点,就是各个节点的状态 ... [详细]
  • 云原生的十大开源项目是什么
    这篇“云原生的十大开源项目是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值 ... [详细]
author-avatar
mobiledu2502897083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有