ETCD数据存储情况( 四 )


ETCD数据存储情况

文章插图
当WAL文件中数据项内容过大达到设定值(默认为10000)时,会进行WAL的切分,同时进行操作 。这个过程可以在/.go的函数中看到 。所以,实际上数据目录中有用的和WAL文件各只有一个,默认情况下etcd会各保留5个历史文件 。
2.7 RAFT
新版Etcd中,Raft包就是对Raft一致性算法的具体实现 。关于Raft算法的讲解,网上已经有很多文章,有兴趣的读者可以去阅读一下Raft算法论文,非常精彩 。本文不再对Raft算法进行详细描述,而是结合etcd,针对算法中一些关键内容以问答的形式进行讲解 。Raft算法的相关术语参见概念词汇表一节 。
(1) Raft常见问答一览
图12 Term示意图
图13 Raft状态机
图14 节点宕机
(2) 关键部分源码解析
在etcd代码中,Node作为Raft状态机的具体实现,是整个算法的关键,也是了解算法的入口 。
在etcd中,对Raft算法的调用如下,你可以在/raft.go中的找到:
: =raft .( )
n: =raft .( 0x01 ,[ ] int64 { 0x02 ,0x03 } ,3 ,1 ,)
通过这段代码可以了解到,Raft在运行过程记录数据和状态都是保存在内存中,而代码中raft.启动的Node就是Raft状态机Node 。启动了一个Node节点后,Raft会做如下事项 。
首先,你需要把从集群的其他机器上收到的信息推送到Node节点,你可以在/.go中的函数看到 。
func( s *)( ctx.,m.)error{
ifm . Type==.{
s . stats .( types . ID ( m . From ) .( ) ,m . Size ( ) )
s . node . Step ( ctx ,m )
检测发来请求的机器是否是集群中的节点,自身节点是否是,把发来请求的机器作为,具体对Node节点信息的推送和处理则通过node.Step()函数实现 。
其次,你需要把日志项存储起来,在你的应用中执行提交的日志项,然后把完成信号发送给集群中的其它节点,再通过node.Ready()监听等待下一次任务执行 。有一点非常重要,你必须确保在你发送完成消息给其他节点之前,你的日志项内容已经确切稳定地存储下来了 。
最后,你需要保持一个心跳信号Tick() 。Raft有两个很重要的地方用到超时机制:心跳保持和竞选 。需要用户在其Raft的Node节点上周期性地调用Tick()函数,以便为超时机制服务 。
【ETCD数据存储情况】综上所述,整个Raft节点的状态机循环类似如下所示:
10
11
12
13
14
for{
{
case