etcd重要的两个功能是一致性和watch,针对这两个特性深入理解一下。
一致性raft算法
一致性要学习的是raft协议,对于raft协议,有这么几个角色
角色
Leader,有同步日志的特权,定时广播心跳给follower
Follwer,跟随者,接收从leader发出的日志
Candidate,竞选者
当leader失效的时候,Follower接收leader的心跳超时,就会转化为candidate节点,投票给自己,然后投票给其它节点,如果它获取到超过半数节点支持,就会成为新的leader。为了避免同时发起投票都成为leader节点,每个candidate发起投票使用了一段随机时间。简要理解就是这样,深入理解还有任期等复杂机制,我们先理解简要的就可以了。
一致性实现
交互图
一致性raft实现需要很多模块的配合:
接口层,使用grpc作为rpc机制
逻辑层,预先检查模块,包括Quota和Auth,其中Quota用来检查数据库配额,如果超过数据库配额,就会直接返回失败;Auth表示鉴权,如果鉴权失败,会返回错误
Raft层,是一致性的实现
逻辑层,kvserver,字面上理解,key-valueserver
存储层,wal,当有变化时,先写日志到wal,避免丢失,当大多数节点确认后,才会将日志写入boltdb状态机
存储层,使用mvcc机制,使用reeindex作为索引,boltdb作为数据库。
一个etcd,包含的东西可不少,对于关键的技术点我们需要注意。
kvServer是交互的核心,可以与k8s的apiServer对比,这两个组件都是交互核心,所有其它模块都不会直接交互,都会通过这个交互核心来交互。这是etcd和k8s设计的一个重要点。用控制和逻辑思维来认知,就是kvServer是控制,其它模块都是逻辑模块,逻辑模块只和控制模块交互。
grpc,grpc是google的开源rpc接口,可以支持多语言交互。grpc支持protobuffer和json格式,默认是protobuffer,protobuffer定义idl,客户端只要拿到idl,编译生产自己语言客户端,就可以实现对服务器的访问。
wal日志,wal是在很多组件里面都采用的一个东西,使用了lsm存储。
mvcc机制,mysql数据库也是mvcc机制,因为实际数据是写文件,当数据变化的时候,不是立即删除,而是新产生一个版本号数据存储起来,删除的时候只是标记一下。这样可以访问到历史数据,如果数据太大,就