etcd
-
etcd v2版本和v3版本的区别:
-
v2版本会把所有数据写入内存中,并且在kubernetes v1.11版本中弃用
-
v3版本会把所有数据持久化到磁盘中。
-
-
高可用、分布式键值对类型数据库,go写的,主要用来共享配置,存储各种资源信息和服务发现
-
etcd可以集中管理配置信息,服务端存储客户端从etcd获取,同时etcd或监听配置信息的改变,发现改变通知给客户端
-
etcd集群个数不超过7个,一般3个或5个。
特点
-
通过raft一致性算法保证多节点数据的强一致性和高可用
-
强一致性:过半节点同步成功才返回成功
-
高可用:leader选举机制
-
-
-
WAL系统中所有的修改在提交前需要先写入log文件中
-
预写日志到了一定条目数量会自动触发快照到磁盘。
-
-
通过snapshot防止WAL触发快照的次数过多
原理
-
一个用户请求过来会先由http server接收转发给store进行具体的事务处理,如果涉及到节点的修改,则会交给raft模块进行状态的变更日志的记录,然后同步给etcd集群中的其他节点,确认数据提交和同步
-
HTTP Server:用来处理用户的API请求以及其他etcd节点的同步和心跳信息的请求
-
Store: 处理etcd支持的各类功能的事物,包括数据索引、节点状态变更、监控和反馈、事件处理和直行等待等等功能都是etcd的API为用户提供
-
Raft:强一致性算法
-
WAL:Write Ahead Log预写日志是etcd数据存储的方式 ,除了在内存里存储了所有数据的状态和节点索引意外,
etcd通过WAL对数据进行持久化存储,WAL中所有的数据提交前都会事先记录日志
-
Snapshot:为了防止数据过多而进行的状态快照
-
Entry:存储了具体的日志内容
优点
-
简单:基于http+json的API使用curl就能直接使用
-
安全:可选SSL客户认证机制
-
快速:每个实例每秒支持千次的写操作
-
可信:使用raft算法实现分布式
概念词
-
Raft:etcd所采用的保证分布式系统强一致性的算法。
-
Node:一个Raft状态机实例。
-
Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。
-
Cluster:由多个Member构成可以协同工作的etcd集群。
-
Peer:对同一个etcd集群中另外一个Member的称呼。
-
Client: 向etcd集群发送HTTP请求的客户端。
-
WAL:预写式日志,etcd用于持久化存储的日志格式。
-
snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态
-
Proxy:etcd的一种模式,为etcd集群提供反向代理服务。
-
Leader:Raft算法中通过竞选而产生的处理所有数据提交的节点。
-
Follower:竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。
-
Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。
-
Term:某个节点成为Leader到下一次竞选时间,称为一个Term。
-
Index:数据项编号。Raft中通过Term和Index来定位数据
应用场景
-
消息发布订阅
-
负载均衡
-
分布式通知和协调
-
分布式锁和分布式队列
-
服务发现 service discovery
-
集群监控和leader竞选
raft算法
-
选举阶段
-
etcd集群中会有一个作为主节点leader负责写操作,多个从节点follower负责读操作
-
主节点通过发送心跳包给从节点,从节点进行响应
-
从节点一定时间没有收到心跳包,就会认为主节点不可用,自身成为候选主节点candidate,发起投票
-
投票过程中的所有节点,只会响应收到的第一个投票请求,后续请求不做响应
-
某个节点如果得到一半节点的响应投票,就会成为新的主节点
-
-
数据更新
-
主节点将修改信息记录到本地日志,并把日志复制给所有接地那,超过一半节点响应,就会认为操作成功,并通知客户端。
-
同步成功后,主节点开始将本地日志持久化到磁盘,并通知所有从节点也进行数据修改和提交。
-
-
当etcd遇到故障时会把Raft日志持久化到磁盘,并把日志发送到故障节点来恢复。
备份
-
etcd通过snapshot命令备份
-
需要先做快照
#这个是从活动成员来做快照
$ export ETCDCTL_API=3;./etcdctl --endpoints='10.201.46.112:2379,10.201.46.113:2379,10.201.46.114:2379' snapshot save ~/.snapshot.db
#cron写法
-
恢复数据会覆盖一些元数据(成员ID和集群ID),并且需要创建新的etcd数据目录
-
下边是三成员集群创建新的etcd数据目录,在三台节点执行
$ etcdctl snapshot restore snapshot.db \
--name ETCD-CLUSTER-001 \
--initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \
--initial-advertise-peer-urls http://10.201.46.112:2380
$ etcdctl snapshot restore snapshot.db \
--name ETCD-CLUSTER-002 \
--initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \
--initial-advertise-peer-urls http://10.201.46.113:2380
$ etcdctl snapshot restore snapshot.db \
--name ETCD-CLUSTER-003 \
--initial-cluster ETCD-CLUSTER-001=http://10.201.46.112:2380,ETCD-CLUSTER-002=http://10.201.46.113:2380,ETCD-CLUSTER-003=http://10.201.46.114:2380 \
--initial-advertise-peer-urls http://10.201.46.114:2380
-
启动etcd从新的数据目录开始
$ sudo sh /apps/sh/etcd.sh start
-
优化调整
-
快照条目数量:--snapshot-count,指定有多少事物被提交时触发快截取快照保存到磁盘,
-
3.2版本之前默认是1w条,之后默认调整为10w条
-
过低会导致频繁io压力,过高会导致占用高内存和etcd GC过慢,一般是10w-20w。
-
-
历史数据压缩:key空间长期的时候,如果不做压缩清理,达到上限阈值时,集群就会处于只能删除和读的状态。
-
数据压缩只是清理数据的历史版本,不影响最新版本
-
手动压缩命令:压缩清理revision 为10之前的历史数据
$ export ETCDCTL_API=3;etcdctl compaction 10
-
自动压缩使用:--auto-compaction-retention=1 表示每一小时进行一次数据压缩
-
-
碎片清理:
-
在历史数据压缩也就是执行compaction操作后,旧的revision被压缩会产生内部碎片, 内部碎片是指空闲状态并且能
被后端使用,但是依然会消耗磁盘空间,
-
清理命令:
$ etcdctl defrag -
-
浙公网安备 33010602011771号