分布式,可靠的,kv分布式系统
Raft算法
- 从多个节点选出leader,leader负责数据的同步和分发。
quorum=(n+1)/2
- 3个节点容忍1个故障
- 5个节点容忍2个故障
API
- PUT(key,value)/Delete(key)
- Get(key)/Get(keyFrom,keyEnd) key的范围
- Watch(key/keyPrefix)
- Transactions(if/then/else ops).commit() 满足条件,执行操纵
- Leases:Grant/Revoke/KeepAlive
etcd的数据版本号机制
- term:全局单调递增 (整个集群leader的任期,leader进行切换,term加1)
- revision: 全局单调递增 (代表的kv修改一次,revision加1)
- KeyValue:
- create_revision:创建的次数
- mod_revision:修改的次数
- version:此次key修改的次数
一个数据有多个版本,通过定期Compaction来清理历史数据
lease(租约)
性能优化
Ratf层
- 网络IO
- 节点之间的RTT/带宽
- 磁盘IO 写入延迟
Storage
- 磁盘IO fdatasync延迟
- 索引层所的block
- boltdb Tx的锁
- boltdb本身的性能
其他
- 内核参数
- grpc api层的延迟
服务端性能优化 -硬件
- 升级CPU/memory
- 选取优秀的ssd
- 网络带宽优先级
- 独占部署
服务端性能优化 - 软件
- 没存索引层:提升etcd内存索引性能,优化内部锁的使用减少等待时间
- lsase规模使用:优化lease revoke过期失效的算法,解决了lease规模性的问题
- 后端boltdb使用优化:端酒batch size limit /interval,根据不同的硬件和工作负载配置(以前是固守保守值)
- 完全并发读,优化调用boltdb tx读写锁使用,提升读性能
- 基于segregated hashmap的etcd内部存储freelist分配回收算法
客户端性能优化
- put 避免大value,精简再精简
- 避免创建频繁变化的key/value
- 避免创建按大量lease,尽量选择复用