1. Etcds/

ETCD 常见问题有哪些🤔?如何处理这些问题?

·482 字·3 分钟· loading
etcd devops
demo007x
作者
demo007x

ETCD 常见问题有哪些🤔?如何处理这些问题?
#

客户端是否必须向 etcd leader 发送请求?
#

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

Configuration 配置
#

listen-client-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 更新中 etcdctl member list 公布的对等 URL?
#

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

部署的系统要求
#

由于 etcd 将数据写入磁盘,因此其性能很大程度上取决于磁盘性能。因此,强烈建议使用 SSD。要评估磁盘是否足够快,可以进行 etcd,一种可能性是使用磁盘基准测试工具,例如 fio有关如何执行此操作的示例,请阅读相关文档。

为了防止性能下降或无意中使键值存储过载,etcd 默认强制将可配置的存储大小配额设置为 2GB。为避免交换内存或内存不足,计算机应至少具有同样多的 RAM 来覆盖配额。

对于正常环境,建议的最大大小为 8GB,如果配置的值超过该值,etcd 会在启动时发出警告。

在 CoreOS,etcd 集群通常部署在具有双核处理器、2GB RAM 和至少 80GB SSD 的专用 CoreOS Container Linux 机器上。

请注意,性能本质上取决于工作负载;请在生产部署之前进行测试。有关更多建议,请参阅硬件。

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

etcd 集群需要大多数节点(仲裁)才能就集群状态的更新达成一致。

对于具有 n 个成员的集群,仲裁为 (n/2)+1。对于任何奇数大小的群集,添加一个节点将始终增加仲裁所需的节点数。

尽管将节点添加到奇数大小的群集看起来更好,因为有更多的计算机,但容错能力更差,因为完全相同数量的节点可能会在不丢失仲裁的情况下失败,但有更多的节点可能会失败。

如果集群处于无法容忍任何故障的状态,则在删除节点之前添加节点是危险的,因为如果新节点无法向集群注册(例如,地址配置错误),仲裁将永久丢失。

集群最大是多少合适?
#

从理论上讲,没有硬性限制。但是,etcd 集群可能不应超过 7 个节点。

Google Chubby 锁服务,类似于 etcd,在 Google 中广泛部署多年,建议运行五个节点。

一个 5 成员的 etcd 集群可以容忍两个成员故障,这在大多数情况下就足够了。

尽管较大的群集提供了更好的容错能力,但由于数据必须在更多计算机之间复制,因此写入性能会受到影响。

什么是容错?
#

只要可以建立成员仲裁,etcd 集群就会运行。

如果由于暂时性网络故障(例如分区)而丢失了仲裁,则一旦网络恢复并恢复仲裁,etcd 就会自动安全地恢复; Raft 强制执行集群一致性。对于断电,etcd 会将 Raft 日志持久化到磁盘; etcd 将日志重放到故障点,并恢复集群参与。

对于永久性硬件故障,可以通过运行时重新配置从群集中删除节点。

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

Cluster Size 群集大小 Majority 大多数 Failure Tolerance 容错
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3
8 5 3
9 5 4

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

etcd 是否适用于跨区域或跨数据中心部署?
#

跨区域部署 etcd 可以提高 etcd 的容错能力,因为成员位于单独的故障域中,代价是跨越数据中心边界导致的共识请求延迟更高。

由于 etcd 依赖于成员仲裁来达成共识,因此跨数据中心的延迟会有些明显,因为至少大多数集群成员必须响应共识请求。此外,群集数据必须在所有对等节点之间复制,因此也会有带宽成本。

延迟时间越长,默认的 etcd 配置可能会导致频繁的选举或心跳超时。

如何备份 etcd 集群?
#

在删除不正常的成员之前,我应该添加成员吗?
#

替换 etcd 节点时,务必先删除该成员,然后再添加其替换

etcd 采用基于仲裁模型的分布式共识;(N/2)+1 成员,即多数成员,必须先就提案达成一致意见,然后才能提交提案集。这些建议包括键值更新和成员身份更改。该模型完全避免了裂脑不一致的任何可能性。不利的一面是永久性的法定人数损失是灾难性的。

这适用于成员身份:如果一个 3 成员集群有 1 个被关闭的成员,它仍然可以向前推进,因为仲裁人数为 2 人,并且 2 名成员仍然有效。但是,向 3 成员集群添加新成员会将法定人数增加到 3 人,因为 4 名成员的多数需要 3 票。由于法定人数增加,这个额外的成员在容错方面是无效的;群集距离不可恢复还有一个节点故障。

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

另一方面,如果首先从集群成员身份中删除已关闭的成员,则成员数将变为 2,仲裁仍为 2。通过添加新成员进行删除后,仲裁人数也将稳定在 2。因此,即使无法启动新节点,仍然可以通过剩余活动成员的仲裁来删除新成员。

为什么 etcd 不接受成员资格更改?
#

etcd 设置 strict-reconfig-check ,以拒绝会导致仲裁丢失的重新配置请求。放弃仲裁确实有风险(尤其是当群集已经运行不正常时)。尽管在添加新成员时,如果存在仲裁丢失,则禁用仲裁检查可能很完美,但这可能会导致完全成熟的群集不一致。

对于许多应用程序来说,这将使问题变得更糟(“磁盘几何损坏”是最可怕的候选者)。

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

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

etcd 警告 “request ignored (cluster ID mismatch)” 是什么意思?
#

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

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

“mvcc: database space exceeded"是什么意思,该如何解决?
#

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

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

  1. Compact etcd’s history.
  2. Defragment 对每个 etcd 端点进行碎片整理
  3. Disarm 撤防警报。

etcd 警告“etcdserver/api/v3rpc: transport: http2Server.HandleStreams failed to read frame: read tcp 127.0.0.1:2379->127.0.0.1:43020: read: connection reset by peer”是什么意思?
#

当服务器收到客户端流过早关闭的 TCP RST 标志时,这是 gRPC 端警告。

例如,客户端关闭了其连接,而 gRPC 服务器尚未处理 TCP 队列中的所有 HTTP/2 帧。某些数据可能在服务器端丢失,但只要客户端连接已经关闭,就可以了。

只有旧版本的 gRPC 会记录这一点。etcd >=v3.2.13 默认使用 DEBUG 级别记录此内容,我们可以在启动 etcd 的时候启用标志时 --log-level=debug 就可以输出 debug 信息。

Performance 性能
#

应该如何对 etcd 进行基准测试?
#

可以使用基准测试工具 benchmark 。我们也可以在这个地址查看 https://etcd.io/docs/v3.5/op-guide/performance/ 当前的基准测试结果。

etcd 警告“apply entries took too long”是什么意思?
#

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

第一可能是由磁盘速度慢引起的
#

磁盘可能在 etcd 和其他应用程序之间遇到争用,或者磁盘太慢(例如,共享虚拟化磁盘)。若要排除慢速磁盘导致此警告,请监视backend_commit_duration_seconds(p99 持续时间应小于 25 毫秒)以确认磁盘速度相当快。如果磁盘速度太慢,则为 etcd 分配专用磁盘或使用更快的磁盘通常可以解决问题。

第二个可能的原因是 CPU 资源不够导致的
#

如果对计算机 CPU 使用率的监控显示使用率过高,则可能没有足够的计算容量用于 etcd。将 etcd 移动到专用机器,增加进程资源隔离 cgroup,或将 etcd 服务器进程重新设置为更高的优先级通常可以解决问题。

访问过多密钥(例如,获取整个密钥空间)的昂贵用户请求也可能导致长时间的应用延迟。但是,每个请求访问少于几百个密钥应始终是高性能的。

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

etcd 警告“failed to send out heartbeat on time” 是什么意思?
#

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

通常,此问题是由于以下两方面引起的:

由磁盘速度慢引起的
#

在领导者发送附加了元数据的检测信号之前,它可能需要将元数据保存到磁盘。磁盘可能在 etcd 和其他应用程序之间遇到争用,或者磁盘太慢(例如,共享虚拟化磁盘)。若要排除慢速磁盘导致此警告,请监视 wal_fsync_duration_seconds(p99 持续时间应小于 10 毫秒)以确认磁盘速度相当快。如果磁盘速度太慢,则为 etcd 分配专用磁盘或使用更快的磁盘通常可以解决问题。为了判断磁盘是否足够快,可以使用 fio 等基准测试工具。

第二个可能原因是 CPU 匮乏
#

如果对计算机 CPU 使用率的监控显示使用率过高,则可能没有足够的计算容量用于 etcd。将 etcd 移动到专用机器,使用 cgroups 增加进程资源隔离,或者将 etcd 服务器进程置于更高的优先级通常可以解决问题。

网络速度慢也可能导致此问题
#

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

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

etcd 警告“snapshotting is taking more than x seconds to finish …”是什么意思,如何解决?
#

etcd 发送其完整键值存储的快照,以刷新慢速关注者和备份。快照传输时间慢会增加 MTTR;如果集群正在以高吞吐量引入数据,则慢速关注者可能会在完成快照接收之前需要新的快照来实时锁定。

为了捕获缓慢的快照性能,etcd 会在发送快照花费超过 30 秒并超过 1Gbps 连接的预期传输时间时发出警告。

Related

etcd 基本操作
etcd devops
etcd(读作et-see-dee)是一种开源的分布式统一键值存储,用于分布式系统或计算机集群的共享配置、服务发现和的调度协调etcd 有助于促进更加安全的自动更新,协调向主机调度的工作,并帮助设置容器的覆盖网络。 etcd 是许多其他项目的核心组件。
2023 年要学习的 10 大 DevOps 技能
devops linux
DevOps 是两个不同领域的混合体,即开发和运维。这提高了更快地发布软件应用程序的能力,与传统软件开发方法相比,具有快节奏的改进和演变。它使团队能够更快地根据市场进行创新和适应,促进版本的增加,这有助于轻松识别和修复错误,并在改进团队间协作的帮助下鼓励可靠性、安全性和可扩展性。
Kubernetes 工具
devops Kubernetes
不可否认的是,复杂性是会减慢任何进程的限制之一–无论是软件开发还是其他。我们需要使用正确的工具来简化复杂性或完全消除它。在这一点上,当涉及到大规模的软件开发、部署和维护时,毫无疑问,复杂性可能在任何阶段出现。我们必须识别并使用正确的工具来尽快解决复杂性。要知道,Kubernetes是强大的容器编排系统之一,用于自动部署、扩展和维护软件应用。在处理Kubernetes中的大型工作负载时,不可避免地会出现复杂情况。然而,有很多Kubernetes工具在很大程度上简化了Kubernetes的管理。一下是基于不同类别列出的各种Kubernetes工具。同时,你将快速了解这些工具的目的和重要功能。