菜单

核心服务器

相关源文件

核心服务器是etcd的核心组件,实现了用于处理客户端请求、共识、存储和集群管理的服务器端功能。本页重点介绍etcd服务器的内部架构和操作,包括请求处理、Raft共识集成和生命周期管理。

有关存储引擎的具体信息,请参阅存储引擎。有关Raft共识实现的详细信息,请参阅Raft共识

服务器架构

etcd服务器围绕EtcdServer类型构建,该类型协调系统的所有主要组件。从高层次来看,服务器将面向客户端的API与底层的Raft共识实现和持久化存储连接起来。

核心组件

来源:server/etcdserver/server.go208-300 server/etcdserver/raft.go80-104

etcd代码库中的EtcdServer结构包含以下关键元素

  1. Raft集成:通过raftNode组件管理共识
  2. KV存储:通过mvcc.WatchableKV提供MVCC存储
  3. 集群管理:通过RaftCluster跟踪成员
  4. 租约管理:通过lease.Lessor处理生存时间(TTL)键
  5. 认证:通过auth.AuthStore管理访问控制

服务器结构

EtcdServer结构包含代表服务器状态的核心字段

来源:server/etcdserver/server.go208-300 EtcdServer结构包含许多字段和方法,用于管理服务器的操作、状态以及与其他组件的交互。

服务器生命周期

启动过程

服务器引导过程涉及几个关键步骤来初始化etcd服务器

来源:server/etcdserver/bootstrap.go54-117 server/etcdserver/server.go303-453 server/etcdserver/server.go537-608

引导过程有以下主要阶段

  1. 引导环境:设置数据目录,检查配置
  2. 确定服务器状态:检查现有数据或建立新集群
  3. 初始化组件:设置后端、WAL、快照器等
  4. 创建EtcdServer:构建带有其依赖项的服务器
  5. 启动服务器:启动goroutine来处理请求

服务器的引导过程在NewServer()中启动,该函数调用bootstrap()来准备环境和组件初始化。

服务器启动与初始化

当通过NewServer()创建新服务器时,会初始化几个关键组件

来源:server/etcdserver/server.go303-453 server/etcdserver/server.go537-608

实际的服务器启动发生在调用Start()时,它会启动几个goroutine来处理

  1. 主循环:处理Raft条目并将其应用于状态机
  2. Raft交互:管理共识操作
  3. 后台任务:清除文件,监控版本,处理线性化读取

服务器运行循环

主服务器循环处理Raft条目并管理服务器状态

来源:server/etcdserver/server.go766-866

主服务器循环处理几种类型的事件

  • 需要应用于状态机的Raft条目
  • 需要撤销的已过期租约
  • 可能需要服务器关机的错误信号
  • 用于优雅关机的停止信号

请求处理

请求流程

etcd中的请求在执行前会经过几个层

来源:server/etcdserver/v3_server.go104-246 server/etcdserver/server.go1497-1588

读写请求的处理方式不同

  1. 读取操作:

    • 如果一致性允许,可以从本地状态机直接提供服务
    • 线性化读取在继续之前会等待领导者确认
    • 读取请求使用可串行化模式或确保线性化一致性
  2. 写入操作:

    • 必须通过Raft共识协议
    • 向Raft提出,通过共识提交,然后应用
    • 严格按顺序应用以保持一致性

Raft请求处理

写入请求通过Raft共识进行处理

来源:server/etcdserver/server.go1531-1588 server/etcdserver/v3_server.go144-201

Raft请求处理的关键步骤

  1. 请求准备:创建一个包含操作的InternalRaftRequest
  2. 领导者检查:确保存在领导者或等待一个
  3. 提案:通过Node.Propose()将请求提交给Raft
  4. 等待处理:使用通知通道等待结果
  5. 结果处理:处理响应或处理超时

应用机制

一旦Raft提交了条目,就需要将它们应用于状态机

来源:server/etcdserver/server.go766-997 server/etcdserver/raft.go176-340 server/etcdserver/apply/uber_applier.go

应用机制确保

  • 所有条目都按相同的顺序在所有节点上处理
  • 正确处理配置更改和正常操作
  • 跟踪结果并返回给等待的客户端
  • 状态更改是原子性进行的

集群管理

成员管理

etcd服务器通过RaftCluster类型管理集群成员

来源:server/etcdserver/api/membership/cluster.go42-62 server/etcdserver/api/membership/cluster.go404-484

集群成员通过以下操作进行管理

  • AddMember:向集群添加新成员
  • RemoveMember:从集群中移除成员
  • UpdateAttributes:更新成员的属性
  • PromoteMember:将学习者成员提升为投票成员

这些操作通过Raft执行以确保共识。

集群版本管理

Etcd跟踪集群版本以确保成员之间的兼容性

来源:server/etcdserver/api/membership/cluster.go596-633 server/etcdserver/server.go2081-2123

版本管理的关键方面

  • 集群版本是所有成员中版本最低的版本
  • 版本更改通过 Raft 传播以实现一致性
  • 版本升级会在成员升级时自动进行
  • 版本降级需要显式操作

健康监控与损坏检查

etcd 服务器包含监控和确保数据完整性的机制

来源:server/etcdserver/corrupt.go87-178 server/etcdserver/corrupt.go179-295

损坏检查的工作方式是

  1. 初始检查:启动时执行,以验证数据一致性
  2. 定期检查:集群成员之间定期进行哈希比较
  3. 压缩哈希检查:压缩操作后进行验证
  4. 警报系统:检测到损坏时触发警报

结论

etcd 核心服务器负责 etcd 实例的生命周期管理,通过 Raft 共识处理客户端请求,一致地应用状态机更改,并维护集群成员。它为所有 etcd 操作提供中心协调点,确保分布式环境中的数据一致性、持久性和可用性。

通过将 Raft 共识与持久化存储引擎集成,etcd 服务器提供了一个可靠的分布式键值存储,可以在节点故障时保持一致性。