Skip to content

Etcd ​

Etcd 是一个分布式键值存储系统,用于可靠地存储和检索数据。它是由 CoreOS 开发并开源的,现在是 Cloud Native Computing Foundation(CNCF)的一个孵化项目。

Etcd 提供了一个简单的接口,允许应用程序以键值对的形式存储和检索数据。它的设计目标是提供高可用性、一致性和分布式的数据存储解决方案。

Etcd 的主要特点包括:

  1. 分布式存储:Etcd 使用 Raft 一致性算法来实现数据的分布式存储。它将数据分布在多个节点上,以提供高可用性和容错性。

  2. 强一致性:Etcd 保证在分布式环境下的强一致性。它使用 Raft 算法来确保数据的一致性和可靠性,即使在节点故障或网络分区的情况下也能保持数据的一致性。

  3. 高可用性:Etcd 支持多节点部署,可以容忍节点故障。当节点发生故障时,Etcd 会自动进行故障转移,保证数据的可用性。

  4. 监视和通知:Etcd 提供了监视功能,可以监视指定键的变化,并在变化发生时发送通知。这使得应用程序可以实时获取数据的变化。

  5. 安全性:Etcd 支持基于 TLS 的安全通信,并提供访问控制机制,可以限制对数据的访问和操作。

TIP

Etcd 在分布式系统中有广泛的应用,特别是在容器编排系统(如 Kubernetes)中被广泛使用,用于存储和共享集群的配置信息、服务发现和状态信息等。它提供了一个可靠和高效的分布式存储解决方案,为构建可扩展的分布式应用程序提供了支持。

Etcd 保证数据一致性 ​

Etcd 通过使用 Raft 一致性算法来保证数据的一致性。 Raft 是一种分布式一致性算法,它将集群中的节点分为Leader、Follower和Candidate三种角色,通过选举机制选出Leader节点来处理客户端的请求。

当客户端向Etcd发送写请求时,Leader节点会将该请求复制到其他节点的日志中,并等待大多数节点确认接收到该日志条目。一旦大多数节点确认接收到该日志条目,Leader节点会将该请求应用到自己的状态机中,并将结果返回给客户端。同时,Leader节点会通知其他节点将该请求应用到自己的状态机中。

如果Leader节点失去连接或崩溃,剩余的节点会通过选举机制选出新的Leader节点。新的Leader节点会根据自己的日志和其他节点的日志进行比较,保证自己的日志是最新的,并将缺失的日志条目复制给其他节点,以保持数据的一致性。

通过Raft算法,Etcd能够保证数据在集群中的一致性,并且在Leader节点失效时能够快速选举出新的Leader节点,保证系统的可用性和数据的一致性。

可运行最小实验:把 revision 当作门卫 ​

下面的纯 Go 模型不依赖 Etcd 服务,只演示“带版本写入”的核心思想;它不是对 Raft 的缩水实现。真正接入 Etcd 时,还要观察租约、watch、线性读和集群故障。

go
package main

import "fmt"

type Store struct {
	value    string
	revision int64
}

func (s *Store) PutIfRevision(expected int64, value string) bool {
	if s.revision != expected {
		return false
	}
	s.value = value
	s.revision++
	return true
}

func main() {
	store := Store{value: "v1", revision: 7}
	fmt.Println(store.PutIfRevision(7, "v2"), store.value, store.revision)
	fmt.Println(store.PutIfRevision(7, "v3"), store.value, store.revision)
}

运行 go run main.go,预期输出 true v2 8 与 false v2 8。第二次写入失败不是服务闹脾气,而是版本条件保护了并发更新。

深入检查:把两个客户端的 expected revision 都设为 7,证明只有一个能成功;再设计租约过期、watch 断线和 leader 切换时的恢复记录。

练习:把「Etcd」变成可验证能力 ​

  1. 从本文任选一个示例,在可丢弃环境重跑;记录运行时/服务版本、输入、关键输出和清理动作。
  2. 保持其他条件不变,只制造一个边界:空值、重复请求、并发、超时、断连、权限不足或资源耗尽。
  3. 用四句话复盘:现象是什么、原理在哪一层、证据是什么、生产中如何止损。

验收清单

  • [ ] 示例能从空环境重复执行,必要依赖和版本已写明。
  • [ ] 同时保留成功路径与至少一个失败路径,不用“应该没问题”冒充证据。
  • [ ] 结论写明适用边界,并能链接回对应学习路线的能力域。
  • [ ] 练习结束后已清理临时数据、凭据、端口或进程。

对照 中间件练习答案与复盘尺。先交自己的证据再翻答案;答案是镜子,不是传送门。

用心记录每一步成长