常见问题解答

常见问题解答

etcd, 通用

什么是etcd?

etcd是一致的分布式键值存储。在分布式系统中主要用作单独的协调服务。并设计为容纳可完全容纳在内存中的少量数据。

etcd的读音?

etcd的发音是 /ˈɛtsiːdiː/,意思是“分布式etc目录”。

etcd的客户端是如何进行选举的?

领导者选举是基于 Raft,领导者处理所有需要集群共识的客户请求。但是,客户端不需要知道哪个节点是领导者。发送给关注者的任何需要共识的请求都将自动转发给领导者。不需要共识(例如,序列化读取)的请求可以由任何集群成员处理。

配置

listen- <client,peer> -urls,advertise-client-urls或initial-advertise-peer-urls有什么区别?

listen-client-urlslisten-peer-urls 指定etcd服务器绑定到的本地地址以接受传入的连接。要在端口上侦听所有接口,请指定 0.0.0.0 为侦听IP地址。

advertise-client-urlsinitial-advertise-peer-urls指定etcd客户或其他etcd成员用于联系etcd服务器的地址。通告地址必须可以从远程计算机访问。请勿像发布产品一样宣传地址 localhost 或将其 0.0.0.0 用于生产设置,因为从远程计算机无法访问这些地址。

为什么不更改 --listen-peer-urls--initial-advertise-peer-urls更新中的广告对等URL etcdctl member list?

成员发布的对等URL来自 --initial-advertise-peer-urls 初始群集启动。在启动成员后更改侦听对等URL或初始播发对等体不会影响导出的播发对等体URL,因为更改必须经过仲裁以避免成员资格配置混乱。使用 etcdctl member update 更新的成员的同行的URL。

部署方式

系统要求

由于etcd将数据写入磁盘,因此其性能在很大程度上取决于磁盘性能。因此,强烈建议使用SSD。为了评估磁盘对于etcd的速度是否足够快,一种可能性是使用磁盘基准测试工具,例如 fio。。有关如何执行此操作的示例,请阅读 此处。为了防止性能下降或意外导致键值存储超载,etcd强制将可配置的存储大小配额默认设置为2GB。为避免交换或内存不足,计算机应至少具有尽可能多的RAM来覆盖配额。建议在正常环境下使用8GB的最大大小,如果配置的值超过该值,etcd会在启动时发出警告。在CoreOS上,通常在具有双核处理器,至少2GB RAM和80GB SSD的专用CoreOS Container Linux机器上部署etcd集群。 请注意,性能本质上取决于工作负载;请在生产部署之前进行测试。 有关更多建议,请参见 硬件

最稳定的生产环境是具有amd64架构的Linux操作系统。有关更多信息,请参见 支持的平台

为什么集群成员的数量为奇数?

一个etcd集群需要大多数节点(仲裁)来同意对集群状态的更新。对于具有n个成员的群集,仲裁数为(n / 2)+1。对于任何奇数大小的群集,添加一个节点将始终增加仲裁所需的节点数。尽管由于有更多的计算机而将节点添加到奇数大小的群集中看起来更好,但是容错能力更差,因为完全相同数量的节点可能会失败而不会丢失仲裁,但是有更多的节点可能会失败。如果群集处于无法容忍更多故障的状态,则在删除节点之前添加节点是危险的,因为如果新节点无法在群集中注册(例如,地址配置错误),仲裁将永久丢失。

最大群集大小是多少?

从理论上讲,没有硬性限制。但是,一个etcd集群可能最多只能有七个节点。 类似于etcd的 Google Chubby lock service服务已经在Google中广泛部署了很多年,建议运行五个节点。一个5成员的etcd集群可以容忍两个成员的故障,这在大多数情况下就足够了。尽管较大的群集可提供更好的容错能力,但由于必须在更多计算机上复制数据,因此写入性能会受到影响。

容错能力怎么样?

只要可以建立成员仲裁,etcd群集就会运行。如果由于暂时性的网络故障(例如分区)而丢失了仲裁,那么一旦网络恢复并恢复了仲裁,etcd就会自动安全地恢复。筏强制执行群集一致性。对于断电,etcd会将Raft日志保存到磁盘;etcd将日志重播到故障点并恢复集群参与。对于永久性硬件故障,可以通过 运行时重新配置将节点从群集中删除 。

建议集群中的成员数为奇数。奇数大小的群集可以容忍的故障数量与偶数大小的群集相同,但节点数较少。通过比较偶数和奇数大小的群集可以看出差异:

簇的大小多数容错能力
110
220
321
431
532
642
743
853
954

添加成员以使群集的大小达到偶数不会增加额外的容错能力。同样,在网络分区期间,奇数个成员保证将始终存在多数分区,该分区可以继续运行,并且在分区结束时成为真相的来源。

etcd是否可以在跨区域或跨数据中心的部署中工作?

由于成员位于单独的故障域中,因此跨区域部署etcd可以提高etcd的容错能力。代价是跨越数据中心边界会产生更高的共识请求等待时间。由于etcd依赖于成员仲裁来达成共识,因此跨数据中心的延迟将在某种程度上显着,因为至少大多数集群成员必须响应共识请求。此外,必须在所有对等方之间复制群集数据,因此也会产生带宽成本。

延迟较长时,默认的etcd配置可能会导致频繁的选举或心跳超时。请参阅 [调整]以调整高延迟部署的超时。

操作

如何备份etcd集群?

etcdctl提供了snapshot创建备份的命令。有关更多详细信息,请参见 备份

在删除不健康的成员之前,我应该添加成员吗?

替换etcd节点时,重要的是先删除该成员,然后添加其替换。

etcd使用基于仲裁模型的分布式共识;(n / 2)+1个成员(多数)必须先同意一个提议,然后才能将该提议提交集群。这些建议包括键值更新和成员资格更改。该模型完全避免了脑裂的任何可能性。不利的一面是永久的仲裁丢失是灾难性的。

这对成员资格的适用方式:如果3成员群集中有1个关闭的成员,则由于仲裁人数为2,并且2个成员仍处于活动状态,因此它仍可以向前发展。但是,将新成员添加到3个成员的群集将使法定人数增加到3,因为4个成员中的大多数需要3票。由于法定人数增加,因此这个额外的成员在容错方面一无所获;群集仍然是一个不可恢复的节点故障。

此外,该新成员存在风险,因为它可能配置错误或无法加入集群。在这种情况下,无法恢复仲裁,因为群集的成员减少了两个,成员增加了两个,但是需要三票才能更改成员身份才能撤消增加的成员资格。默认情况下,etcd将拒绝成员添加尝试,这种尝试可能会以这种方式关闭集群。

另一方面,如果首先从集群成员资格中删除被降级的成员,则成员数变为2,并且法定人数保持为2。此后,通过添加新成员进行删除也将使法定人数稳定在2。因此,即使无法启动新节点,仍然可以通过仲裁删除其余活动成员上的新成员。

为什么etcd不接受我的成员更改?

strict-reconfig-check为了拒绝可能导致仲裁丢失的重新配置请求,etcd进行了设置。放弃仲裁确实有风险(尤其是当群集已经不健康时)。尽管在增加新成员的仲裁丢失的情况下,可能很想禁用仲裁检查,但这可能会导致完全成熟的群集不一致。对于许多应用程序,这将使问题更加严重(“磁盘几何损坏”是最令人恐惧的选择)。

为什么etcd会因为磁盘延迟高峰而失去领导者?

这是故意的;磁盘延迟是领导者活力的一部分。假设集群领导者需要花一分钟的时间将筏日志更新同步到磁盘,但是etcd集群的选举超时时间为一秒钟。即使领导者可以在选举间隔内处理网络消息(例如,发送心跳信号),但由于无法提交任何新提议,因此实际上是不可用的。它正在慢速磁盘上等待。如果群集由于磁盘延迟而经常失去其领导者,请尝试 调整磁盘设置或etcd时间参数。

etcd警告“请求被忽略(集群ID不匹配)”是什么意思?

每个新的etcd群集都会根据初始群集配置和用户提供的唯一initial-cluster-token值生成一个新的群集ID 。通过具有唯一的集群ID,可以保护etcd免受可能破坏集群的跨集群交互的影响。

通常,此警告是在拆除旧群集,然后为新群集重新使用某些对等地址之后发生的。如果旧集群中的任何etcd进程仍在运行,它将尝试与新集群联系。新集群将识别出集群ID不匹配,然后忽略该请求并发出此警告。通常通过确保不同群集之间的对等地址不相交来清除此警告。

“ mvcc:数据库空间已超出”是什么意思,我该如何解决?

etcd中的 多版本并发控制数据模型保留了密钥空间的确切历史记录。如果不定期压缩此历史记录(例如,通过设置--auto-compaction),etcd最终将耗尽其存储空间。如果etcd的存储空间不足,则会发出空间配额警报,以保护群集免于进一步写入。只要发出警报,etcd就会以error响应写请求mvcc: database space exceeded

要从空间不足配额警报中恢复,请执行以下操作:

  1. Compact etcd的历史。
  2. Defragment 对每个etcd端点进行碎片整理。
  3. Disarm 解除警报。

etcd警告“ etcdserver / api / v3rpc:传输:http2Server.HandleStreams无法读取帧:读取tcp 127.0.0.1:2379->127.0.0.1:43020:读取:由对等方重置连接”是什么意思?

当服务器在客户端流过早关闭的情况下接收到TCP RST标志时,这是gRPC端警告。例如,客户端关闭其连接,而gRPC服务器尚未处理TCP队列中的所有HTTP / 2帧。一些数据可能已在服务器端丢失,但是只要客户端连接已经关闭就可以。

gRPC的旧版本会记录此信息。etcd > = v3.2.13默认情况下以DEBUG级别记录此日志,因此仅在--debug启用标记的情况下可见。

性能

如何进行etcd的基准测试?

尝试使用[基准测试]工具。当前的 基准测试结果可用于比较。

etcd警告“应用条目时间过长”是什么意思?

在大多数etcd成员同意提交请求之后,每个etcd服务器将请求应用于其数据存储,并将结果保存到磁盘。即使使用慢速机械磁盘或虚拟化网络磁盘(例如Amazon的EBS或Google的PD),应用请求通常也应少于50毫秒。如果平均申请时间超过100毫秒,etcd将警告条目申请时间太长。

通常,此问题是由磁盘速度慢引起的。磁盘可能正在etcd和其他应用程序之间争用,或者磁盘太慢(例如,共享的虚拟磁盘)。要排除导致速度缓慢的磁盘导致此警告的情况,请监视 backend_commit_duration_seconds(p99持续时间应小于25ms)以确认磁盘速度相当快。如果磁盘速度太慢,则将专用磁盘分配给etcd或使用速度更快的磁盘通常可以解决该问题。

第二个最常见的原因是CPU饥饿。如果监视计算机的CPU使用率显示利用率很高,则可能没有足够的计算能力来存储etcd。将etcd移至专用计算机,增加进程资源隔离cgroup或将etcd服务器进程重新设置为更高的优先级通常可以解决该问题。

访问过多密钥(例如,获取整个密钥空间)的昂贵用户请求也可能导致较长的应用等待时间。但是,每个请求访问少于几百个密钥应该总是有效的。

如果以上建议均不能清除警告,请打开一个 issue,其中包含详细的日志记录,监视,指标和可选的工作负载信息。

etcd警告“未能及时发送心跳”是什么意思?

etcd使用基于领导者的共识协议来实现一致的数据复制和日志执行。集群成员选出一个领导者,其他所有成员都成为跟随者。当选领导人必须定期发送心跳到它的追随者保持其领先地位。如果在选举间隔内未收到任何心跳,则跟随者会推断领导者失败并触发选举。如果领导者没有及时发送心跳信号但仍在运行,则选举是虚假的,很可能是由于资源不足造成的。为了捕获这些软故障,如果领导者跳过两个心跳间隔,则etcd将警告它无法按时发送心跳。

通常,此问题是由磁盘速度慢引起的。领导者发送附有元数据的心跳之前,可能需要将元数据持久保存到磁盘。磁盘可能正在etcd和其他应用程序之间争用,或者磁盘太慢(例如,共享的虚拟磁盘)。要排除慢速磁盘引起此警告的危险,请监控 wal_fsync_duration_seconds(p99持续时间应小于10ms)以确认该磁盘是否足够快。如果磁盘速度太慢,则将专用磁盘分配给etcd或使用速度更快的磁盘通常可以解决该问题。为了判断磁盘是否足够快于etcd,可以使用诸如 fio之类的基准测试工具 。请阅读 此处的示例。

第二个最常见的原因是CPU饥饿。如果监视计算机的CPU使用率显示利用率很高,则可能没有足够的计算能力来存储etcd。将etcd移至专用计算机,使用cgroup增强进程资源隔离或将etcd服务器进程重新设置为更高的优先级通常可以解决该问题。

网络速度慢也会导致此问题。如果etcd机器之间的网络指标显示出较长的延迟或高丢弃率,则可能没有足够的网络容量用于etcd。将etcd成员移动到不太拥挤的网络通常可以解决该问题。但是,如果etcd集群跨数据中心部署,则成员之间的等待时间会很长。对于此类部署,请调整heartbeat-interval配置以使其与计算机之间的往返时间大致匹配,election-timeout配置至少应为5 * heartbeat-interval。有关详细信息,请参见 调整文档

如果以上建议均不能清除警告,请 打开一个,其中包含详细的日志记录,监视,指标和可选的工作负载信息。

etcd警告“快照超过x秒才能完成……”是什么意思?

etcd发送其完整键值存储的快照,以刷新慢速追随者并进行 备份。缓慢的快照传输时间会增加MTTR;如果群集正在以高吞吐量接收数据,则慢速追随者可能需要在完成接收快照之前需要新快照来进行活锁。为了捕获较慢的快照性能,etcd在发送快照时会发出警告,警告会花费超过30秒的时间,并且超出了1Gbps连接的预期传输时间。

常见问题解答