走马观花云原生技术(4):强一致性分布式存储etcd

2022-11-18 14:48:32 浏览数 (1)

etcd在架构的世界是知名度并不低。但少有人知道etcd也是CNCF云计算开源项目的已毕业成员之一。

简而言之,etcd是一个开源的分布式键值存储,在架构中主要可以使用它来共享配置,做服务注册与发现等。etcd的最大特点在于它的强一致性

在这篇文章中,我主要阐述下,etcd在云原生架构的作用,或者说它与K8S有什么内在的关联。

事实上,etcd对于K8S非常重要,它是K8S的首要存储。

一)

etcd有两个最重要的特点,其一它是分布式存储,其二是强一致性。而这两个特性对于云原生架构来说,极为重要。这也是K8S选择etcd做为它的首要存储的原因。

先了解下分布式存储与强一致性是什么才能理解为什么K8S会选择etcd。

分布式存储

分布式存储应该比较好理解,是指存储的数据会在不同的节点上都存在,是分布式的,而非集中存储某一个节点。分布式存储的另一个重要表现是分布式存储中任何少数节点的失败,不会影响所有数据的完整性。

对于以K8S为核心的云原生架构来说,分布式就是它的本质,那K8S本身需要一个分布式存储也是非常有必要的。

强一致性

在分布式系统中,CAP理论是架构师一定要知道的。CAP理论是指,在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)三者是不可兼顾的,最多只能做到两个。

基于这个理论,分布式存储就有很多种不同的选择,比如CA(保证一致性与可用性),CP(保证一致性与容错性),AP(保证可用性与容错性)。

更进一步举例说明CAP理论。

  • • 如果一个分布式存储,访问或写入存储时,能快速获得响应而无非等待数据同步完成,这就满足了可用性。(A)
  • • 对于任何写入的数据,都很快的及时的同步至所有节点,访问任何节点都是获得及时的数据,这就满足了一致性。(C)
  • • 如果不同节点之间的网络出错中断,相互之间联系不上,但整个存储服务仍然能够基于某种策略提供正常的服务,这叫分区容错性。(P)

因此,不同的分布式存储框架,你就需要了解它是属于哪种角色的CAP实现,不同的业务关注的点不同,你的选择也就是不同。

etcd是CP实现,它保证一致性与分区容错性,一定程度上牺牲了可用性。

etcd强调一致性与分区容错性,这意味着当节点上的数据未达到一致性同步时,需要进行等待数据同步完成才可用。

二)

好,理解了分布式存储与CAP理论,就可以聊聊为什么K8S需要etcd。

首先需要明确的一个问题是,K8S需要存储吗?

这个答案是显而易见的,K8S做为一个容器编排平台,本身有大量的信息需要存储与查询,比如运行了哪些节点,每个节点的信息,有哪些需要定时调度的事件等,这些信息都是需要一个存储来记录的。

好,那就可以进入一个问题。存储有非常多的分类,比如关系型数据存储MySQL,NoSQL数据库存储,还有类似Redis,Etcd这样的键值存储,为什么是etcd?

我大致梳理了下原因。

K8S需要的是一个分布式存储

做为云原生的最重要的容器编排与管理平台,K8S天然就是分布式的,自然其存储也需要的是一个分布式的。试想一下,在一个分布式管理平台中,关键的信息存储是中心式的,这种搭配肯定不协调。

而Etcd这样的分布式存储,正好适应了K8S这样的云原生架构容器编排平台。

强一致性

强一致性是etcd的一个重要的特点。而K8S这样的平台,特别需要这样的特性,在一个架构中,如果因为一致性存在问题,导致将服务负载到失效的节点上,这将产生灾难性的影响。

这就是为什么在分布式事务中,基于大多数业务允许的情况下,我们会选择最终一致性,而不是强一致性,因为业务上允许数据不及时可能是允许的,但在云原生架构这样的平台中,整个架构信息的数据不及时,后果可不是一点点影响。

存储变更事件通知

Etcd有一个很重要的能力,就是在可以监听存储变更事件。这个非常适合K8S这样的云原生平台的功能扩展。比如服务节点发生扩容或收缩时,其它很多功能点可以监听etcd的存储变更事件,以做出对应的处理。这个对于云原生是非常重要的。

简单高效的键值存储机制

键值存储是一种简单,但非常高效的存储机制,这是它的优点。同时,它的缺点是不支持复杂的查询。但是在K8S这样的平台中,API提供的查询是可预测的,大多查询都是基于服务名,namespace等名称去查询,使用键值来存储与查询,不仅简单,而且非常高效。

K8S非常适合键值查询,复杂的存储与查询,虽然在查询能力上非常深,但相应的会降低查询效率,而K8S并不需要这样的能力,因此选择etcd这样的键值查询是合理的。

三)

我们在实现微服务架构时,对于分布式事务,按照CAP这个理论,通常是选择AP,也就是可用性与分区容错性,而在一致性上选择最终一致性,这是合理的。

但在云原生容器编排平台架构这样层面,稍加思考,就会发现CP可能是更合理的。

这就是为什么K8S会选择etcd做为背后的存储支持的原因。

从这一点,也进一步说明,软件的世界没有银弹,做为架构师一定要了解不同技术,框架与方案的优缺点,做出更合适的考量与选择。

下周再继续聊云原生的这些技术吧。

0 人点赞