etcd与其他键值存储的对比

etcd versus other key-value stores

Posted by BY on November 13, 2018

etcd与其他键值存储的对比

“etcd”的名称源于两个想法,即unix系统的“/etc”文件夹和“d”(”d”istributed)系统。“/etc”文件夹是存储独立系统的配置数据的地方,而etcd存储大规模分布式系统的配置信息。因此,“d”分布式的“/etc”配置文件夹即是“etcd”。

etcd被设计为大规模分布式系统的通用基础。这样的系统永远不会容忍裂脑操作,并且愿意牺牲可用性来实现这一目标。etcd以一致且容错的方式存储元数据。etcd集群旨在为键值存储提供最佳的稳定性,可靠性,可伸缩性和性能。

分布式系统使用etcd作为一致的键值存储,用于配置管理,服务发现和协调分布式工作。许多组织使用etcd来实现生产系统,例如容器调度程序,服务发现服务和分布式数据存储。使用etcd的常见分布式模式包括领导者选举,分布式锁定和监视机器活跃性。

使用案例

  • 通过CoreOS技术实现的Linux容器:在Linux容器上运行的应用程序获得自动,零停机Linux内核更新。Container Linux使用Locksmith来协调更新。Locksmith在etcd上实现分布式信号量,以确保在任何给定时间只有一个集群的子集重新启动。
  • Kubernetes:将配置数据存储到etcd中以进行服务发现和集群管理; etcd的一致性对于正确调度和服务操作至关重要。Kubernetes API服务器将群集状态持久化保存到etcd中。它使用etcd的watch API来监视集群并推送关键配置更改。

比较图表

下表是一个方便的快速参考,可以一目了然地发现etcd及其最受欢迎的同类之间的差异。每列的进一步评论和详细信息均在表格后面的部分中。

  etcd ZooKeeper Consul NewSQL (Cloud Spanner, CockroachDB, TiDB)
并发原语 锁定RPC,选举RPC,命令行锁定,命令行选举, go语言版Recipes实现 Curator的Recipes实现 本机锁API 极少
线性可读取 有时
多版本并发控制 有时
事务 字段比较,读写 版本检查,写 字段比较,锁,读写 SQL风格
变更通知 历史和当前密钥区间 当前的密钥和目录 当前密钥和前缀 触发器(有时)
用户权限 基于角色 访问控制列表 访问控制列表 变化(每表格GRANT,每个数据库角色)
HTTP/JSON API No 很少
成员资格重新配置 >3.5.0
最可靠的数据库大小 GB级别 100MB级别(有时GB级) 100MB级别 TB级别
最小读取线性化延迟 网络往返时延 RTT 不支持读线性化 RTT + fsync 时钟屏障 (原子, NTP)

ZooKeeper

ZooKeeper解决了与etcd相同的问题:分布式系统协调和元数据存储。然而,etcd拥有从ZooKeeper的设计和实现的工程和操作经验中获得的后见之明。从Zookeeper获得的经验教训确实告知了etcd的设计,帮助它支持像Kubernetes这样的大规模系统。Zookeeper上的改进包括:

  • 动态集群成员资格的重新配置
  • 在高负载下稳定读/写
  • 多版本并发控制数据模型
  • 可靠的key监控,永远不会发生无声地丢弃事件
  • 租用原语将连接与会话分离
  • 用于安全分布式共享锁的API

此外,etcd支持各种语言和框架。Zookeeper有自己的自定义Jute RPC协议(根据原文并未找到Jute RPC,仅仅找到Zookeeper使用Jute进行序列化和反序列化),并且限制了它支持的语言绑定(参考wiki上词条Language_binding,这对于Zookeeper是完全独特的,而etcd的客户端协议是从gRPC构建的,gRPC是一个流行的RPC框架,具有go,C ++,Java等语言绑定。同样,gRPC可以通过HTTP序列化为JSON,因此即使是一般的命令行实用程序curl也可以与之通信。由于系统可以从多种选择中进行选择,因此它们使用原生工具在etcd基础上构建,而不是使用一组固定的技术在etcd上构建。

在考虑功能,支持和稳定性时,计划将Zookeeper用于一致键值存储的新应用程序可以选择etcd。

Consul

Consul是一个端到端的服务发现框架。它提供内置的健康检查,故障检测和DNS服务。此外,Consul使用RESTful HTTP API公开了一个键值存储。正如Consul 1.0所示,存储系统在键值操作中不像etcd或Zookeeper等其他系统那样扩展; 需要数百万个key的系统将遭受高延迟和内存压力。缺少键值API,最值得注意的是,多版本密钥,条件事务。

etcd和Consul解决了不同的问题。如果寻找分布式一致的键值存储,etcd是比Consul更好的选择。如果寻找端到端集群服务发现,etcd将没有足够的功能; 选择Kubernetes,Consul或SmartStack。

NewSQL (Cloud Spanner, CockroachDB, TiDB)

etcd和NewSQL数据库(例如,Cockroach,TiDB,Google Spanner)都提供了强大的数据一致性保证和高可用性。但是,显着不同的系统设计参数会导致客户端API和性能特征明显不同。

NewSQL数据库旨在横向扩展数据中心。这些系统通常跨多个一致的复制组(分片)对数据进行分区,这些复制组可能比较远,存储的数据集大小为TB级以上。这种扩展使得它们成为分布式协调的不良候选者,因为它们等待时钟有很长的延迟,并期望更新主要是本地化的依赖图。数据被组织成表格,包括具有比etcd更丰富语义的SQL样式查询工具,但代价是处理,规划和优化查询的额外复杂性。

简而言之,选择etcd来存储元数据或协调分布式应用程序。如果存储的数据超过几GB或者需要完整的SQL查询,请选择NewSQL数据库。

使用etcd存储元数据

etcd复制单个一致复制组中的所有数据。为了以一致的顺序存储多达几GB的数据,这是最有效的方法。可以改变多个密钥的集群状态的每个修改被分配一个全局唯一ID,在etcd中称为修订,来自单调增加的计数器,用于推理而不是排序。由于只有一个复制组,因此修改请求只需要通过raft协议进行提交。通过将共识限制为一个复制组,etcd通过简单的协议获得分布式一致性,同时实现低延迟和高吞吐量。

etcd背后的复制不能横向扩展,因为它缺少数据分片。相比之下,NewSQL数据库通常会在多个一致的复制组之间对数据进行分片,将数据集存储在TB级或更高的数量级。但是,要为每个修改分配全局唯一且不断增加的ID,每个请求必须通过复制组之间的其他协调协议。此额外协调步骤可能会在全局ID上发生冲突,从而迫使有序请求重试。结果是一种更复杂的方法,通常比严格排序的etcd更差的性能。

如果应用程序主要关于元数据或元数据排序,例如协调进程,请选择etcd。如果应用程序需要跨越多个数据中心的大型数据存储,并且不太依赖于强大的全局排序属性,请选择NewSQL数据库。

使用etcd进行分布式协调

etcd具有分布式协调原语,例如事件监视,租约,选举和开箱即用的分布式共享锁。这些原语由etcd开发人员维护和支持。 对于分布式协调,选择etcd可以帮助节省工程工作量。