04、Etcd中常见的概念

发布时间 2023-05-27 20:14:18作者: 画个一样的我

本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢。

上一章节,我们学习了 Etcdctl 的使用,从中窥探了 Etcd 的强大之处。从这一节开始,后面的内容基本上都是偏理论的东西,争取在看完这一系列文章后,能够对 Etcd 有一个入门的了解,这样在日常开发过程中,能够对 Etcd 底层的原理有一些了解,写出来的代码心里也更加有底,当然,面试的时候也可以和面试官 battle 以下。

接下来,我们先了解 Etcd 中的经常使用到的概念,这样在后续使用到时,不至于太过陌生,话不多说,干!

这里只是简单的介绍,并不会过多深入的介绍。

Raft 算法:

RAFT 算法是一种分布式一致性算法,用于保证分布式系统中的数据一致性。RAFT算法由Diego Ongaro和John Ousterhout在2014年提出,相对于Paxos算法,RAFT算法更易于理解和实现。

RAFT算法将分布式系统中的节点分为三种角色:领导者(leader)、跟随者(follower)和候选者(candidate)。在正常情况下,所有节点都是跟随者,只有领导者才能接收客户端的请求并进行处理。当领导者出现故障或网络分区时,跟随者会发起选举过程,选出新的领导者。

RAFT算法的核心是日志复制机制。每个节点都维护一个日志,用于记录系统中的操作。当客户端发送请求时,领导者会将请求添加到自己的日志中,并将该日志条目复制到其他节点的日志中。当大多数节点都复制了该日志条目后,领导者会将该条目提交,从而使得系统状态发生变化。

RAFT算法的优点是易于理解和实现,同时具有高可用性和容错性。缺点是在网络分区时可能会出现多个领导者,需要通过额外的机制来解决。

Node:

在 etcd 中,Node 通常指的是 etcd 集群中的一个成员,也就是一个运行 etcd 服务的实例。每个 Node 都有一个唯一的名称和一个 IP 地址,它们通过 Raft 协议进行通信和协调,共同维护着 etcd 中的数据。每个 Node 都可以接收客户端的读写请求,并将其转发到集群中的其他 Node 上,以保证数据的一致性和可靠性。etcd 集群中的每个节点都可以负责读写。但是,当某个节点成为leader时,它将负责处理所有的写请求,并将写操作同步到其他节点。其他节点则负责处理读请求,并从leader节点同步最新的数据。这样可以保证数据的一致性和可靠性。

Member :

在 etcd 中,Member 指的是一个节点,它可以是一个单独的 etcd 实例或一个 etcd 集群中的一个成员。每个 Member 都有一个唯一的名称和一个唯一的 ID,它们用于在 etcd 集群中识别和管理节点。每个 Member 都可以存储和管理键值对,并与其他 Member 进行通信以保持数据的一致性和可用性。在 etcd 集群中,Member 之间通过 Raft 协议进行通信和协调,以确保数据的一致性和可靠性。

etcd 中的 Member 和 node 的区别:

在 etcd 中,Member 和 node 是不同的概念。

Node 是指运行 etcd 服务的物理或虚拟机器,它可以是一个独立的服务器或者一个容器。每个 Node 都有一个唯一的名称和一个 IP 地址。一个 Node 可以包含多个 Member。

Member 是指一个 etcd 集群中的一个节点,每个 Member 都有一个唯一的 ID 和一个对应的 Raft 节点。每个 Member 都有一个唯一的 ID,这个 ID 由 etcd 集群自动生成,用于标识这个 Member。一个 Node 可以运行多个 Member,每个 Member 都有自己的数据存储和状态信息。

在 etcd 集群中,每个 Member 都有一个角色,可以是 Leader、Follower 或者 Candidate。Leader 负责处理客户端请求和集群内部的通信,Follower 和 Candidate 则负责复制 Leader 的数据和状态信息,以保证集群的一致性。

一个 Node 可以运行多个 etcd 实例,每个实例都可以作为一个 Member 加入到 etcd 集群中。因此,一个 Node 可以负责多个 Member 的读写请求。

需要注意的是,一个 Node 上的多个 etcd 实例之间需要使用不同的端口号来避免冲突。同时,每个 etcd 实例都需要有自己独立的数据目录和配置文件。

Cluster:

etcd中的Cluster指的是一组运行etcd服务的节点,这些节点通过互相通信来保持数据的一致性和可用性。Cluster中的每个节点都是一个etcd实例,它们共同组成了一个分布式的键值存储系统。Cluster中的节点可以动态地加入或离开,这使得etcd具有高可用性和可扩展性。在etcd中,Cluster是一个逻辑概念,它由多个节点组成,这些节点可以在同一台机器上,也可以分布在不同的机器上。

这里的节点指的是 member。在 etcd 中,节点(node)是指运行 etcd 服务的主机,而成员(member)是指加入 etcd 集群的节点。每个成员都有一个唯一的名称和 ID,而节点则是成员的实体。一个节点可以运行多个 etcd 实例,每个实例都可以作为一个成员加入到 etcd 集群中。

Peer:

对同一个etcd集群中另外一个 Member的叫法。

在 etcd 中,peer 指的是 etcd 集群中的成员节点,它们之间通过 Raft 协议进行通信和数据同步。每个 peer 都有一个唯一的名称和一个地址,用于在集群中进行标识和通信。peer 之间通过心跳机制保持连接,并通过选举算法选出一个 leader 节点来负责处理客户端的请求和更新集群状态。在 etcd 中,peer 之间的通信是基于 HTTP/2 协议的,可以通过配置 TLS 加密和认证来保证通信的安全性。

Client :

凡是连接etcd 服务器请求服务的,譬如,获取key-value、写数据或watch更新的程序,都统称为Client。

在 etcd 中,Client 指的是与 etcd 集群进行交互的应用程序或者工具。Client 可以向 etcd 集群发送读写请求,也可以监听 etcd 中 key 的变化。etcd 提供了多种语言的客户端库,如 Go、Java、Python 等,方便开发者使用。同时,etcd 也提供了命令行工具 etcdctl,可以方便地与 etcd 集群进行交互。

Proposal:

在 etcd 中,Proposal 是指一个写操作的建议,包括要写入的键值对和写入的类型(如创建、更新或删除)。当一个客户端向 etcd 发送写请求时,它会将请求转换为一个 Proposal,并将其发送给 etcd 集群中的一个节点。该节点会将 Proposal 复制到其他节点,并等待大多数节点确认该 Proposal。一旦大多数节点确认了 Proposal,该 Proposal 就会被提交并应用到 etcd 中,从而完成写操作。

Quorum:

在 etcd 中,Quorum 指的是集群中的大多数节点数。当集群中的大多数节点都达成一致时,就可以保证数据的一致性和可靠性。因此,etcd 使用 Quorum 算法来保证数据的一致性。

具体来说,当一个节点要进行写操作时,它必须先向集群中的大多数节点发送请求,等待大多数节点响应后才能进行写操作。这样可以保证数据的一致性,因为只有大多数节点都同意了这个写操作,才能认为这个写操作是有效的。同样,当一个节点要进行读操作时,它也必须向集群中的大多数节点发送请求,等待大多数节点响应后才能进行读操作,这样可以保证读取到的数据是最新的。

在 etcd 中,Quorum 的大小是由集群中节点数的一半加一决定的((n+1)/2)。例如,如果集群中有 5 个节点,那么 Quorum 的大小就是 3。这样做的好处是,当集群中有一个节点宕机时,仍然可以保证数据的一致性,因为还有大多数节点存活。

WAL:

etcd 中的 WAL 指的是 Write-Ahead Log,即预写日志。它是一种持久化存储机制,用于记录所有写入 etcd 数据库的操作。每次写入操作都会被追加到 WAL 中,然后再被写入内存中的数据库。这样做的好处是,即使在 etcd 异常崩溃时,也可以通过读取 WAL 中的数据来恢复数据库的状态,保证数据的一致性和可靠性。

WAL 是 etcd 中的一个重要组成部分,它可以提高 etcd 的写入性能和可靠性。在写入操作时,etcd 先将数据写入 WAL,然后再将数据写入内存中的数据库。这样做的好处是,即使在写入操作失败或者 etcd 异常崩溃时,数据也不会丢失,因为数据已经被写入了 WAL 中。当 etcd 重新启动时,它会读取 WAL 中的数据来恢复数据库的状态,保证数据的一致性和可靠性。

Snapshot:

etcd中的Snapshot指的是etcd数据库的快照,它是etcd数据库的一种备份方式。Snapshot是etcd数据库的状态的一份拷贝,包括所有的键值对以及它们的元数据信息。Snapshot可以用来恢复etcd数据库的状态,也可以用来迁移etcd数据库到其他的节点或者集群中。

etcd在运行过程中会不断地记录所有的写操作,这些写操作会被记录在WAL(Write-Ahead Log)中。当WAL文件达到一定大小时,etcd会自动触发一次Snapshot操作,将当前etcd数据库的状态保存到一个快照文件中。Snapshot文件通常比WAL文件更小,因为它只包含etcd数据库的状态,而不包含所有的写操作。

在etcd集群中,Snapshot文件可以用来快速恢复etcd数据库的状态,也可以用来迁移etcd数据库到其他的节点或者集群中。为了保证Snapshot文件的可靠性,etcd会将Snapshot文件复制到多个节点上,以防止单点故障。

像不像 redis 中的 aof 和 rdb 日志。

Proxy:

etcd中的Proxy是一个中间件,用于将客户端请求转发到etcd集群中的某个节点。它可以帮助客户端在不知道etcd集群中节点的情况下,通过代理节点来访问etcd集群。Proxy可以提高etcd集群的可用性和可靠性,因为它可以在etcd集群中的节点发生故障时,自动将客户端请求转发到其他健康的节点上。此外,Proxy还可以通过缓存etcd集群的响应来提高客户端的性能。

Leader:

在 etcd 集群中,Leader 是指被选举为当前集群的领导者的节点。Leader 负责处理客户端的请求,并将更改复制到其他节点。当 Leader 节点失效或无法正常工作时,集群将重新选举一个新的 Leader 节点。Leader 节点的选举过程是通过 Raft 算法实现的。在 etcd 中,Leader 节点具有最终的决策权,因此它是集群中最重要的节点之一。

Candidate:

在 etcd 中,Candidate 是指一个节点正在竞选成为 Leader 的状态。当一个节点启动时,它会尝试与集群中的其他节点建立连接,并尝试成为 Leader。节点会向其他节点发送请求,请求它们投票支持自己成为 Leader。如果节点收到了大多数节点的投票,它就会成为 Leader。

在 etcd 中,Candidate 状态通常是由 Follower 节点转换而来。当一个 Follower 节点无法与 Leader 节点保持连接时,它会进入 Candidate 状态,并开始竞选成为新的 Leader。在竞选期间,Candidate 节点会向其他节点发送请求,请求它们投票支持自己成为 Leader。如果 Candidate 节点收到了大多数节点的投票,它就会成为新的 Leader。如果没有节点收到了大多数节点的投票,那么竞选失败,Candidate 节点会重新进入 Follower 状态,等待下一次竞选。

Term:

在 etcd 中,Term 是指一个递增的整数,用于标识一个任期。每个任期都由一个 Leader 领导,Leader 通过向集群中的其他节点发送心跳消息来维持其领导地位。如果一个节点在一段时间内没有收到来自 Leader 的心跳消息,则它会认为 Leader 已经失去了领导地位,此时就会发起新的选举,选出新的 Leader。在新的选举中,每个节点都会增加自己的 Term 值,以便其他节点能够识别出新的 Leader。因此,Term 是 etcd 中非常重要的一个概念,它用于维护集群中的一致性和可靠性。

Index:

etcd 是一个分布式的键值存储系统,用于存储关键信息,如配置数据、服务发现信息等。在 etcd 中,Term 和 Index 是两个重要的概念。

Term 指的是一个递增的整数,用于标识一个任期。在 etcd 中,每个节点都有一个任期,任期的开始是由 Leader 发起的选举过程,选举出的 Leader 就是当前任期的 Leader。当一个节点成为 Leader 时,它会增加当前任期的 Term 值,并在该任期内负责处理所有的请求。

Index 指的是一个递增的整数,用于标识一个日志条目。在 etcd 中,每个节点都有一个日志,用于记录所有的操作。当一个节点接收到一个请求时,它会将该请求添加到自己的日志中,并为该日志条目分配一个唯一的 Index 值。Index 值的递增顺序与日志条目的添加顺序一致。

在 etcd 中,Term 和 Index 通常用于实现一致性算法,如 Raft 算法。Raft 算法是一种分布式一致性算法,用于保证多个节点之间的数据一致性。在 Raft 算法中,每个节点都有一个任期和一个日志,通过 Term 和 Index 值的比较,可以判断两个节点之间的数据是否一致。

Key:

在 etcd 中,Key 是一个字符串,用于标识存储在 etcd 中的值。Key 是 etcd 中的基本数据单元,可以是任何字符串,但是通常采用类似文件系统路径的层次结构来组织 Key。例如,/foo/bar 表示一个名为 bar 的 Key,它是 foo 目录下的一个子 Key。

Key 是 etcd 中的唯一标识符,每个 Key 都与一个值(Value)相关联。在 etcd 中,Key-Value 存储是通过分布式的 Raft 算法实现的,可以保证数据的一致性和可靠性。通过 Key,用户可以快速地访问和更新存储在 etcd 中的数据。

Key space:

etcd 中的 Key space 指的是一组由键和值组成的数据集合。etcd 将这些键值对存储在一个分布式的、高可用的键值存储系统中,可以通过 API 进行访问和操作。Key space 是 etcd 中的核心概念之一,它类似于一个分布式的字典或映射,可以用来存储和检索各种类型的数据,如配置信息、状态信息、元数据等。在 etcd 中,Key space 是一个层次结构,每个键都可以有一个或多个子键,形成一个树状结构。这种层次结构可以方便地组织和管理数据,同时也提供了一些高级功能,如事务、观察和 TTL 等。

Revision:

etcd 中的 Revision(修订版本)是一个整数,用于标识 etcd 存储中的每个修改操作。每次对 etcd 中的 key 进行修改(包括创建、更新和删除)都会增加一个新的 revision。Revision 可以用于实现版本控制、历史记录和回滚等功能。每个 etcd 节点都有自己的 revision 计数器,因此在集群中的不同节点上,revision 的值可能不同。Revision 的值是单调递增的,因此可以用于比较两个 key 的修改时间顺序。

Revision可以用于实现许多功能,例如:
1、历史查询:可以使用Revision查询etcd中的历史状态,以便了解先前的更改。
2、事务控制:可以使用Revision来实现乐观并发控制,以确保在执行更改时没有其他客户端对相同的键进行更改。
3、快照恢复:可以使用Revision来还原etcd存储的先前状态,以便在出现故障或数据损坏时进行恢复。

revision 是每个节点都有还是所有节点共享一个?

Revision 是 etcd 集群中每个节点都有的,用于记录每个节点上的数据版本号。每次对 etcd 中的数据进行修改,都会增加一个新的 Revision。Revision 的值是一个递增的整数,可以用于检查数据的变更历史和版本控制。在 etcd 中,每个 key 都有自己的 Revision,而不是整个 etcd 数据库共享一个 Revision。因此,每个节点上的 Revision 值可能会不同,但它们都是递增的。

Modification Revision:

在 etcd 中,每个键值对都有一个对应的修改版本号,称为 Modification Revision。当一个键值对被创建、更新或删除时,它的 Modification Revision 会被更新。每个修改操作都会增加一个新的 Revision,因此可以通过比较 Revision 来判断两个键值对的先后顺序。

Modification Revision 是 etcd 中的一个重要概念,它可以用于实现分布式锁、版本控制等功能。例如,可以使用 etcd 的 Watch API 监听某个键的修改,当该键的 Modification Revision 发生变化时,就可以触发相应的处理逻辑。

Modification Revision 和 revision 的区别是什么?

在 etcd 中,每个键值对都有一个与之关联的 Revision,它是一个递增的整数,表示该键值对最后一次被修改的版本号。当键值对被修改时,其 Revision 会自增。

Modification Revision 是指 etcd 中某个事务的最后一个修改操作所对应的 Revision。它是一个整数,表示该事务最后一次修改的版本号。当一个事务执行完成后,它的 Modification Revision 就会被记录下来。

Revision 和 Modification Revision 的区别在于,Revision 是针对每个键值对的,而 Modification Revision 是针对整个事务的。一个事务可能会修改多个键值对,但它们的 Revision 可能不同,而 Modification Revision 则是相同的。

Lease:

etcd中的Lease是一种时间限制的键值对,它可以让客户端在一定时间内持续地维护一个键值对。当客户端创建一个租约时,etcd会返回一个租约ID,客户端可以使用这个ID来更新、续约或者撤销租约。当租约到期时,etcd会自动删除对应的键值对。

Lease的使用场景包括:

实现分布式锁:客户端可以创建一个带有租约的键值对,如果锁的持有者在租约到期前没有续约,那么其他客户端就可以获取到锁。

实现任务队列:客户端可以创建一个带有租约的键值对,任务的执行者可以通过watch API监听这个键值对的变化,当任务被创建时,执行者会收到通知,然后开始执行任务。

实现服务注册与发现:服务可以创建一个带有租约的键值对,当服务宕机或者网络故障时,租约会自动到期,etcd会删除对应的键值对,其他服务就可以通过watch API获取到服务的变化,从而实现服务的发现。

总之,Lease提供了一种简单而有效的方式来管理分布式系统中的时间限制的资源,它可以帮助开发者实现分布式锁、任务队列、服务注册与发现等常见的分布式应用场景。

Transition:

在 etcd 中,Transition 指的是一个 key-value 的状态转换过程。当一个 key-value 的值发生变化时,它的状态就会从旧值转换为新值,这个过程就是 Transition。Transition 可以是由客户端发起的,也可以是由 etcd 自身触发的,例如当一个 key 的 TTL 过期时,它的状态就会从存在转换为不存在。在 etcd 中,Transition 是一个非常重要的概念,因为它决定了 etcd 的数据一致性和可靠性。

Watcher:

etcd 中的 Watcher 是一种机制,用于监视 etcd 中的键值对的变化。当一个 Watcher 被创建时,它会监听一个特定的键或目录,并在该键或目录的值发生变化时得到通知。Watcher 可以用于实现分布式锁、配置管理、服务发现等功能。

当一个 Watcher 被创建时,它会向 etcd 发送一个 Watch 请求,并在 etcd 中创建一个 Watcher 对象。当 etcd 中的键值对发生变化时,etcd 会检查是否有 Watcher 监听了该键或目录,如果有,则会向 Watcher 发送通知。Watcher 接收到通知后,可以执行一些操作,例如更新本地缓存、重新加载配置等。

需要注意的是,Watcher 只能监听 etcd 中已经存在的键或目录,无法监听不存在的键或目录。如果需要监听一个不存在的键或目录,可以使用 etcd 的事务操作来创建该键或目录,并在创建完成后立即创建 Watcher。

Key Range :

etcd中的Key Range指的是一组按照字典序排列的键值对,这些键值对的键都在一个范围内。在etcd中,每个键都有一个唯一的名称,而Key Range则是一组键的集合,这些键按照字典序排列,并且它们的名称都在一个范围内。

例如,如果我们有以下键值对:

/foo/bar
/foo/baz
/foo/qux


那么Key Range就是/foo/bar到/foo/qux,包含了所有以/foo/开头的键。

Key Range在etcd中非常重要,因为它们可以用来实现分布式锁、分片和路由等功能。例如,我们可以使用Key Range来实现一个分布式的计数器,每个节点都可以增加计数器的值,但是只有一个节点能够获得锁并且修改计数器的值。

Endpoint:

在 etcd 中,Endpoint 指的是客户端连接 etcd 集群的地址。Endpoint 包括 IP 地址和端口号,客户端可以通过 Endpoint 连接到 etcd 集群并进行数据的读写操作。在 etcd 集群中,每个节点都有自己的 Endpoint,客户端可以通过任意一个节点的 Endpoint 连接到整个集群。通常情况下,客户端会连接到多个节点的 Endpoint,以保证高可用性和负载均衡。

Compaction :

etcd 中的 Compaction 是指将 etcd 存储中的历史数据进行压缩,以减少存储空间的占用。在 etcd 中,每个键值对都有一个版本号,当某个键值对被修改时,会生成一个新的版本号。随着时间的推移,etcd 中存储的历史数据会越来越多,如果不进行压缩,会占用大量的存储空间。因此,etcd 提供了 Compaction 功能,可以定期将历史数据进行压缩,以减少存储空间的占用。同时,Compaction 还可以提高 etcd 的读写性能,因为压缩后的存储空间更小,读写操作的效率也会更高。

key version :

在 etcd 中,每个 key 都有一个版本号(version),它是一个整数,表示该 key 的修改次数。每次对 key 进行修改,都会使其版本号加 1。这个版本号可以用来实现乐观锁,即在修改 key 时,先获取其当前版本号,然后在修改时比较版本号是否一致,如果一致则进行修改,否则说明 key 已经被其他客户端修改过了,需要重新获取最新的值再进行修改。