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做为背后的存储支持的原因。
从这一点,也进一步说明,软件的世界没有银弹,做为架构师一定要了解不同技术,框架与方案的优缺点,做出更合适的考量与选择。
下周再继续聊云原生的这些技术吧。