您的位置 首页 > 德语词汇

raft是什么意思 创建raft节点需要什么

大家好,如果您还对raft是什么意思不太了解,没有关系,今天就由本站为大家分享raft是什么意思的知识,包括创建raft节点需要什么的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

1、为了更好地理解raft协议,下面列举一下用到的术语表,有一个基本的认识。本文主要是看一下使用hashicorp的raft包创建节点所需要的参数,从而更好理解一下raft协议的部分内容。

2、节点的三种角色之一.集群的首脑,负责发起”提议“、”提交“被多数派认可的决断.

raft是什么意思 创建raft节点需要什么

3、节点的三种角色之一.需要对leader的”提议“、”提交“和candidate的”竞选“进行响应.

4、节点的三种角色之一.是一种处于竞选流程中的临时状态,根据多数派投票的结果会切为leader或follower的稳定态.

5、中强一致性.对于写请求,服务端保证最终一定能提供出正确的结果,但需要同步时间.同步期间,可能被读到不一致的老数据.

6、强一致性.服务端要求做到写入立即可读.

7、记录写请求明细的日志.(单指raft算法下狭义的预写日志)

8、两阶段提交的第一个阶段.指的是leader向所有节点发起日志同步请求的过程.

9、两阶段提交的第二个阶段.指的是leader认可一笔写请求已经被系统采纳的动作.

10、指的是将预写日志记录内记录的写操作应用到状态机的过程.

11、任期是用于标识leader更迭的概念.每个任期内至多只允许有一个leader.

12、同一任期内,集群出现两个leader,导致秩序崩盘.

13、下面是创建一个节点的方法,我们看一下创建一个raft节点所需要的参数

14、funcNewRaft(conf*Config,fsmFSM,logsLogStore,stableStableStore,snapsSnapshotStore,transTransport)(*Raft,error){\n}*Config配置文件存储raft协议所需要的配置信息FSM(finalstatemachine)有限状态机,主要用于apply数据的方式、快照的恢复等LogStore存储日志(任期command等)StableStore存储日志节点信息SnapshotStore快照存储的实现一般要持久化存储Transport节点之间数据传输的实现一般使用tcpLogStore

在基础的Get和Set基础上有查找和日志功能

15、源码接口可以看到只有Get和Set方法,关注的只是存储

16、用于持计划存储使用的,比如节点重启之后数据还能不能存在。一般可以使用文件持久化或者三方软件。

17、最重要的就是这个FSM,对应了raft协议的很多内容

18、raft协议有个关键的概念就是状态机和预写日志。

19、状态机(statemachine)是节点实际存储数据的容器,写请求的最后一步是将结果写入状态机,而读请求也需要从状态机中获取数据进行响应.

20、预写日志(writeaheadlog,简称wal)是通过日志的方式记录下每一笔写请求的明细(例如setx=3这样一笔记录),使得变更历史有迹可循.在raft算法中,写请求会先组织成预写日志的形式添加到日志数组中,当一个日志(写请求)达到集群多数派的认可后,才能够被提交,将变更应用到状态机当中。

21、两阶段提交:leader节点收到一个请求,首先进行预写日志,并向集群中其它节点进行同步这个请求,半数节点都进行预写日志,给予leader节点一个ack回复,然后进入正式的提交阶段写入状态机。

22、我们看一下创建raft节点fsm,需要创建什么,分别实现了什么接口

23、typeMyFsmstruct{\n}\n\nfunc(mMyFsm)Apply(log*raft.Log)interface{}{\n\treq:=NewCacheRequest()\n\terr:=json.Unmarshal(log.Data,req)\n\tSet(req.Key,req.Value)\n\n\treturnerr\n}\n\nfunc(mMyFsm)Snapshot()(raft.FSMSnapshot,error){\n\treturnNewMySnapshot(),nil\n}\n\nfunc(mMyFsm)Restore(snapshotio.ReadCloser)error{\n\tfmt.Println("myfsmrestore")\n\terr:=json.NewDecoder(snapshot).Decode(GetCache())\n\tiferr!=nil{\n\t\tlog.Println("restoreerror:",err)\n\t\treturnerr\n\t}\n\treturnnil\n}

Apply对应两阶段提交,预写日志持久化操作;

24、Restore对应了节点恢复的操作,进行了节点持久化;

25、快照生成的代码看一下,这里时进行状态机内容的持久化操作,接收的内容都通过Persist写入了可以持久化的存储里面了。

26、typeMySnapshotstruct{}\n\nfuncNewMySnapshot()*MySnapshot{\n\treturn&MySnapshot{}\n}\n\nfunc(this*MySnapshot)Persist(sinkraft.SnapshotSink)error{\n\tb,err:=json.Marshal(GetCache())//写json快照\n\tiferr!=nil{\n\t\treturnerr\n\t}else{\n\t\t_,err:=sink.Write(b)\n\t\tiferr!=nil{\n\t\t\tlog.Println("snapshotwriteerror",err)\n\t\t\treturnsink.Cancel()\n\t\t}\n\t}\n\treturnnil\n}\n\nfunc(this*MySnapshot)Release(){\n\tlog.Println("快照生成完成")\n}

这里就是创建一个节点所需要的内容了。

好了,文章到这里就结束啦,如果本次分享的raft是什么意思和创建raft节点需要什么问题对您有所帮助,还望关注下本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023