概述
**ETCD是什么? **
ETCD是一个强一致性的分布式键值存储,提供了一种可靠的方式来存储需要被分布式系统或机器集群访问的数据。它能够优雅地处理网络分区期间的领导者选举,并且即使在领导节点发生故障时也能容忍机器故障。
特点
-
简单接口:使用标准的HTTP工具(如curl)进行读写操作。
-
键值存储:将数据存储在层次化组织的目录中,类似于标准文件系统。
-
监听变更:监听特定的键或目录的变化,并对值的变更做出反应。
核心功能
一致性保证:Raft一致性算法
Raft(Replication and Fault Tolerant)是一个允许网络分区(Partition Tolerant)的一致性协议,它保证了在一个由N个节点构成的系统中有(N+1)/2(向上取整)个节点正常工作的情况下的系统的一致性。
每个网络节点只能有如下三种身份:
Raft实现主要分为三大部分:领导选举、日志复制和安全性。
Watch机制:如何实时监听数据的变化
事件
指与某个键或键范围相关的变化操作。这些操作包括键的创建、修改和删除。当你通过watch机制监听某个键或键范围时,ETCD会将这些变化封装成事件,并发送给客户端。
需要解决的四大核心问题
- client 获取事件的机制,etcd 是使用轮询模式还是推送模式?
- 事件是如何存储的?watch 命令中的版本号具有什么作用?
- client 和 server 端出现短暂网络波动等异常因素后,导致事件堆积时,server 端会丢弃事件吗?若你监听的历史版本号 server 端不存在了,你的代码该如何处理?
- 如果有上万个 watcher 监听 key 变化,当 server 端收到一个写请求后,etcd 是如何根据变化的 key 快速找到对应的 watcher?
配置文件解析
name: etcd-0001
data-dir: /cg_sp0/etcd/data
# 设置 etcd 数据库的最大存储大小
quota-backend-bytes: 8589934592
# 设置自动压缩的保留时间
auto-compaction-retention: "1“
# 设置自动压缩的模式为“周期性”
auto-compaction-mode: periodic
# 指定与其他 etcd 节点通信的监听地址和端口
listen-peer-urls: http://172.13.87.20:2380,http://127.0.0.1:2380
# 指定用于接受客户端请求的监听地址和端口
listen-client-urls: http://172.13.87.20:2379,http://127.0.0.1:2379
# 指定向其他 etcd 节点通告的 URL
initial-advertise-peer-urls: http://172.13.87.20:2380
# 指定 向客户端通告的 URL
advertise-client-urls: http://172.13.87.20:2379,http://127.0.0.1:2379
# 设置集群的初始令牌,用于区分不同的 etcd 集群
initial-cluster-token: 172.13.87.30
# 指定初始集群成员
initial-cluster: etcd-0002=http://172.13.87.22:2380,etcd-0001=http://172.13.87.20:2380
# 设置集群的初始状态为“new”,表示这是一个新的 etcd 集群
initial-cluster-state: new
参考文献
ETCD官网 etcd.io/
The Raft Consensus Algorithm raft.github.io
ARC: Analysis of Raft Consensus. www.cl.cam.ac.uk/techreports…
Tutorials etcd.io/docs/v3.5/t…
watch机制原理分析 www.lixueduan.com/posts/etcd/…