20 | 基于Raft的分布式KV系统开发实战(二):如何实现代码?
20 | 基于Raft的分布式KV系统开发实战(二):如何实现代码?
讲述:于航
时长13:35大小12.44M
如何实现接入协议?
如何实现 KV 操作?
如何实现分布式集群?
创建集群
写操作
读操作
内容小结
课堂思考
赞 11
提建议
精选留言(18)
- wjh_all_in2020-03-30这里实现一致性,没有采用Quorum NWR,而是把所有读请求都转移到主节点,这在实际的生产系统会成为瓶颈吧?
作者回复: 加一颗星:),Raft和Quorum NWR是不同时使用的,相互独立的算法,Quorum NWR一般用于AP型系统中,临时提供强一致性。是存在瓶颈这个问题,但可以通过分集群,也就是multi raft等方法来解决。
10 - 方块睡衣2020-04-01老师请留意下项目地址
作者回复: 文章里有链接,在这里,我再贴下,https://github.com/hanj4096/raftdb
6 - 小晏子2020-03-30如果移除节点,那要考虑是移除主节点还是非主节点吧,如果是主节点那么需要重新发起选主流程,并将主节点数据同步到其他节点,如果是非主节点,那么要通知主节点该节点移除不需要在发送日志给它了。
作者回复: 加一颗星:),如果是领导者节点,可以先kill掉相关进程,触发领导者心跳超时和领导者选举,将领导者变成跟随者,再移除节点。
共 2 条评论5 - 还有这种操作2020-03-30老师有没有代码示例,或者项目示例
作者回复: 感谢唔多志同学帮忙回复:)。 为了方便其他同学看到,在这里,我再贴下链接地址,https://github.com/hanj4096/raftdb
共 2 条评论3 - 杜享平2021-04-02可以再丰富一下,如果数据量比较大,单机存不下,必须对数据做分片处理,这个时候应该怎么设计共 2 条评论1
- 羽翼19822020-03-31一路过来追老师的课,收获还是蛮多的;不过比起实现的细节,我还是想更多了解设计和架构上的知识,特别是这些理论在成熟的开源分布式系统上应用(Kafka,TiDB,ETCD,Cassandra等等),希望老师能够同通过加餐的形式补充这些内容
作者回复: 感谢一路相伴,多交流:)。另外,感谢反馈,反馈我记下了,后面会综合大家的共性问题,做补充。
1 - Geek_ae855f2023-01-27 来自浙江谢谢老师的课程,几个月前就看了理论篇和开篇词,但一直没进行实战篇,因为自己基础不行,现在重新补了实战篇感觉收获很大。raft算法的一致性的强弱是基于上层业务确定的嘛
- 王应发2022-04-24读写都在主节点上面,那性能和单件差不多了
- 姑射仙人2021-10-05老师,Store中的m就代表实现的存储系统实际的数据载体,为什么要在内存中用map表示。实际场景中此处是否可以替换成自己需要的,比如基于数据库的存储?如果可以的话,那么Snapshot为什么还要Restore到内存中的map中去,如果数据量特别大,Restore到存中的map会特别耗时,而且还会和底层存储产生一致性问题。
- Geek43292021-01-22当raft将指令应用到状态机后,将执行applySet功能,创建key和value到内存中。这一点没看明白,我理解Raft主要管理复制日志,但是日志如何应用到状态机这个需要应用自己实现fsm的几个接口。状态机存储这个也是应用自己决定,可以选择内存,文件等。这个地方应用到状态机完成后内存中已经有了kv,后面为什么还要执行其他操作呢?
- 🤔 2⃣ 0⃣ 1⃣...2020-11-12$GOPATH/bin/raftdb -id node02 -haddr raft-cluster-host02:8091 -raddr raft-cluster-host02:8089 -join raft-cluster-host01:8091 ~/.raftdb $GOPATH/bin/raftdb -id node02 -haddr raft-cluster-host02:8091 -raddr raft-cluster-host02:8089 ~/.raftdb 老师,添加第二个节点,这两条命令都要执行一遍吗?我执行第一条就被阻塞了展开
作者回复: 加一颗星:),不需要,第一条命令是创建新节点并启动,在创建新节点时执行这条命令;第二条命令是启动节点,节点创建后,每次启动节点,执行这条命令就可以了。
- 🤔 2⃣ 0⃣ 1⃣...2020-11-12$GOPATH/bin/raftdb -id node02 -haddr raft-cluster-host02:8091 -raddr raft-cluster-host02:8089 -join raft-cluster-host01:8091 ~/.raftdb
- Heaven2020-08-26那么整体流程还是按照写操作的流程 获取到store中进行执行 如果不报错,就说进行了RemoveServer() 报错了,查看报错信息,如果是因为不是领导者节点,那么直接返回客户端领导者的地址,让其进行重定向 如果是因为删除节点是领导者节点,无法删除导致的,那么直接返回客户端错误信息 (我这里认为是无法删除领导者节点的,应该由管理人员直接杀死领导者节点的进程)展开
作者回复: 加一颗星:),是的,重启领导者节点进程,集群会重新选举领导者,这个领导者将“下台”。
- Heaven2020-08-26那么整体流程还是按照写操作的流程 获取到store中进行执行 如果不报错,就说进行了RemoveServer() 报错了,查看报错信息,如果是因为不是领导者节点,那么直接返回客户端领导者的地址,让其进行重定向 如果是因为删除节点是领导者节点,无法删除导致的,那么直接返回客户端错误信息 (我这里认为是无法删除领导者节点的,应该由管理人员直接杀死领导者节点的进程)展开
作者回复: 加一颗星:),是的,重启领导者节点进程,集群会重新选举领导者,这个领导者将“下台”。
- 向永俊2020-08-05基于Hashicorp,如果在分布式kv系统中,需要实现cas功能,应该怎么实现
作者回复: 加一颗星:),比较并交换,是一种技术,基于raft实现这种技术?没看明白,能具体说说吗?补充下信息。
共 4 条评论 - Geek_5735ca2020-04-241.hddr和rddr代表什么含义? 2.单机上怎么模拟多个ip地址?
作者回复: 加一颗星:),问题1:hddr是HTTP服务的通讯地址,rddr是raft服务相互通讯的地址,比如心跳、日志复制等。问题2:可以的,配置不同的端口和数据存储目录。
- 沉淀的梦想2020-03-31项目地址在哪里?自己实现 Raft 的话,正确性要如何测试呢?
作者回复: 感谢一步同学帮忙补充项目地址。需要自己设计测试用例,考虑Safety和Liveness,做数据一致性检查等,以及在生产环境中做监控和观察系统运行,这也是实现算法最复杂的地方。
共 2 条评论 - Michael Tesla2020-03-31老师能不能推荐一些课外的相关资料呢?
作者回复: 迭戈·安加罗(Diego Ongaro)的博士论文,《Paxos Made Live》,可以多多看看,另外,建议在实战中理解技术,因为文字和代码之间有鸿沟,实战能帮助我们理解理论。
共 2 条评论