介绍

etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。它是一款云原生时代的首选元数据存储产品,已经成为云原生和分布式系统的存储基石。

简要基础架构图

etcd 的leaseId java使用 etcd readindex_API

Client层

  • 组成
  • client v2 API 客户端库
  • client v3 API 客户端库
  • 作用
  • 提供了简洁易用的 API
  • 支持负载均衡、节点间故障自动转移
  • 极大降低业务使用 etcd 复杂度,提升开发效率、服务可用性

API 网络层

  • client 访问 server的通信协议
  • v2API
  • HTTP/1.x 协议
  • v3API
  • gRPC 协议
  • HTTP/1.x 协议(通过 etcd grpc-gateway 组件支持)
  • server 节点之间的通信协议
  • 节点间通过 Raft 算法实现数据复制和 Leader 选举等功能时使用的 HTTP 协议

Raft 算法层(基石和亮点)

  • 核心算法组成
  • Leader 选举
  • 日志复制
  • ReadIndex
  • 作用
  • 用于保障 etcd 多个节点间的数据一致性、提升服务可用性等

功能逻辑层(核心特性实现层)

  • KVServer 模块
  • 限速判断(保证集群稳定性,避免雪崩)

etcd 的leaseId java使用 etcd readindex_API_02

  • 生成一个唯一的 ID,将此请求关联到一个对应的消息通知 channel,然后向 Raft 模块发起(Propose)一个提案(Proposal)
  • 等待此 put 请求,等待写入结果通过消息通知 channel 返回或者超时。etcd 默认超时时间是 7 秒(5 秒磁盘 IO 延时 +2*1 秒竞选超时时间),如果一个请求超时未返回结果,则可能会出现 etcdserver: request timed out 错误
  • MVCC 模块
  • 读场景
  • etcd 的leaseId java使用 etcd readindex_API_03

  • 写场景
  • etcd 的leaseId java使用 etcd readindex_HTTP_04

  • treeIndex 模块(内存树形索引模块)
  • 保存用户 key 和版本号的映射关系
  • boltdb 模块
  • 基于 B+ tree 实现的 key-value 键值库,支持事务,提供 Get/Put 等简易 API 给 etcd 操作
  • 每次修改操作,生成一个新的版本号 (revision),以版本号为 key, value 为用户 key-value 等信息组成的结构体
  • 数据隔离
  • boltdb 里每个 bucket 类似对应 MySQL 一个表
  • 用户的 key 数据存放的 bucket 名字的是 key
  • etcd MVCC 元数据存放的 bucket 是 meta
  • Auth 鉴权模块
  • Lease 租约模块
  • Compactor 压缩模块
  • Quota 模块(配额)
  • Apply模块
  • etcd 的leaseId java使用 etcd readindex_API_05

存储层

  • 预写日志 (WAL) 模块
  • 可保障 etcd crash 后数据不丢失
  • 快照 (Snapshot) 模块
  • boltdb 模块
  • 保存了集群元数据和用户写入的数据

每个人都有潜在的能量,只是很容易被习惯所掩盖,被时间所迷离,被惰性所消磨~