夏溪辰的博客

xiaxichen's blog

ETCD 数据结构&操作

64
2023-12-04

ETCD

简介

Etcd 是一个开源的分布式键值存储系统,用于可靠地存储和检索数据。它由 CoreOS 开发并开源,现在由云原生计算基金会(CNCF)维护。Etcd 是一个高可用、一致性、分布式的系统,被广泛用于构建分布式系统、服务发现、配置管理和分布式协调等场景。

Etcd 提供了一个简单的键值存储接口,类似于一个分布式的字典或配置文件。它支持基本的 CRUD 操作(创建、读取、更新和删除),并支持事务操作。每个键值对都由一个唯一的键来标识,并且可以使用目录结构来组织和管理键值对。

特点

Etcd 的主要特点和功能如下:

  1. 分布式一致性:Etcd 使用 Raft 一致性算法来确保在集群中的不同节点之间的数据强一致性。Raft 算法提供了强一致性保证,并且可以在节点故障或网络分区的情况下保持数据一致性。
  2. 高可用性:Etcd 架构设计为具有高可用性。通过将数据复制到多个节点,并选择具有最新数据的节点进行读取和写入操作,即使在节点故障的情况下,Etcd 仍然可以继续提供服务。
  3. 分布式事务支持:Etcd 支持事务操作,可以将多个读取和写入操作组合成一个原子的、不可分割的操作。这确保了在一个事务中的所有操作要么全部成功,要么全部失败。
  4. 监视和通知机制:Etcd 提供了监视和通知机制,允许应用程序订阅指定键的更改事件。当键的值发生变化时,Etcd 可以通知订阅了相关事件的应用程序,使得应用程序可以实时感知和响应数据的变化。
  5. 安全性:Etcd 支持基于 TLS 的加密通信,并提供身份验证和访问控制机制,确保数据在传输和存储过程中的安全性。

Etcd 被广泛应用于云原生领域,特别是在容器编排系统(如 Kubernetes)中用于服务发现、配置管理和集群协调等关键功能。它提供了一个可靠的基础设施,用于构建分布式系统,并保证数据的一致性和高可用性

数据结构

  1. 键值对(Key-Value):Etcd 的最基本的数据结构是键值对。每个键都是一个字符串,可以使用目录结构来组织和管理键。对应于每个键,可以存储一个关联的值,值可以是任意字符串。
  2. 目录(Directory):Etcd 允许创建目录结构来组织键值对。目录是一种特殊的键,它本身没有关联的值,而是包含了一组子键。通过目录结构,可以以层次结构方式组织和管理键值对,提供更灵活的数据组织方式。
  3. 序列(Sequence):Etcd 提供了序列机制,用于生成自增的整数序列。可以通过创建一个序列键,并使用 Get 操作获取序列的当前值。每次获取序列值后,序列的值会自动递增。
  4. 租约(Lease):Etcd 支持租约机制,用于为键值对设置过期时间。租约是一种时间期限,可以与键值对关联。当租约过期时,对应的键值对将自动被删除。通过租约,可以实现基于时间的数据过期和自动清理。
  5. 监视(Watch):Etcd 提供了监视机制,可以订阅指定键的变化事件。当指定的键发生变化时,Etcd 将发送通知给订阅者。监视机制可用于实时感知和响应数据的变化,用于构建事件驱动的应用程序。

这些数据结构提供了丰富的功能和灵活性,可以根据需求来组织和管理数据。通过键值对、目录、序列和租约,可以构建各种类型的分布式系统,实现服务发现、配置管理、分布式锁等功能。监视机制则提供了实时的数据变化通知,用于构建响应式的应用程序。

主要操作

增删改查

  1. Put:将一个键值对写入到 Etcd 中。通过指定键和相应的值来创建或更新一个键值对。如果键已经存在,则会更新对应的值。
  2. Get:根据给定的键从 Etcd 中检索相应的值。可以使用精确匹配的键获取单个键值对,也可以使用前缀匹配的键获取一组键值对。
  3. Delete:根据给定的键从 Etcd 中删除相应的键值对。可以使用精确匹配的键删除单个键值对,也可以使用前缀匹配的键删除一组键值对。
  4. Watch:监视给定键的变化,并在变化发生时接收通知。可以订阅特定键的变更事件,例如创建、更新或删除操作。当指定的键发生变化时,Etcd 将发送通知给订阅者。
  5. Lease:Etcd 提供了租约机制,用于为键值对设置过期时间。可以创建一个租约并将其与键值对关联,当租约过期时,键值对将自动被删除。
  6. Transaction:Etcd 支持事务操作,可以将多个读取和写入操作组合成一个原子的、不可分割的操作。事务操作可以保证在一个事务中的所有操作要么全部成功,要么全部失败。
  7. Compact:Etcd 支持紧凑操作,用于清理过期的键值对并释放底层存储空间。紧凑操作可以减小存储空间的使用,并提高 Etcd 的性能。

demo

当使用 Etcd 时,可以使用 Etcd 的客户端库或 Etcd 提供的命令行工具来执行操作。下面是一些示例操作的代码片段,使用的是 Etcd 的 Go 客户端库(go-etcd):

  1. 安装 go-etcd 客户端库:
go get github.com/coreos/go-etcd/etcd
  1. 导入所需的包:
import (
    "github.com/coreos/go-etcd/etcd"
    "fmt"
)
  1. 连接到 Etcd 服务器:
client := etcd.NewClient([]string{"http://localhost:2379"})

这里假设 Etcd 服务器运行在本地,监听在默认端口 2379。

  1. 写入键值对:
client.Set("/mykey", "myvalue", 0)

将键 /mykey 的值设置为 myvalue

  1. 读取键值对:
response, err := client.Get("/mykey", false, false)
if err != nil {
    fmt.Println(err)
} else {
    if len(response.Node.Nodes) == 0 {
        fmt.Println("Key not found")
    } else {
        fmt.Println(response.Node.Nodes[0].Value)
    }
}

获取键 /mykey 的值,并打印输出。

  1. 监视键的变化:
watcher := client.Watch("/mykey", 0, false)
for {
    select {
    case response := <-watcher.Event:
        fmt.Println(response.Node.Value)
    }
}

监听键 /mykey 的变化,并在变化发生时打印输出。

  1. 删除键值对:
_, err := client.Delete("/mykey", false)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println("Key deleted")
}

删除键 /mykey