分布式协议与算法实战
韩健
腾讯资深工程师
23193 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
分布式协议与算法实战
15
15
1.0x
00:00/00:00
登录|注册

19 | 基于Raft的分布式KV系统开发实战(一):如何设计架构?

一致性模型
读操作实现
写操作实现
创建集群
Raft算法实现
幂等性
删除操作
查询操作
赋值操作
路由设计
HTTP RESTful API设计
HTTP协议
与客户端交互的通讯协议
客户端访问系统的接入层API
节点故障时的替换
分布式集群
KV操作
接入协议
代码实现
架构设计
实际场景问题处理
常用API接口用法
代码实现
课堂思考
设计一个基本的分布式KV系统
分布式KV系统开发实战能力
Raft算法
基于Raft的分布式KV系统开发实战

该思维导图由 AI 生成,仅供参考

你好,我是韩健。
学完前面 2 讲之后,相信你已经大致了解了 Raft 算法的代码实现(Hashcorp Raft),也掌握了常用 API 接口的用法,对 Raft 算法的理解也更深刻了。那么,是不是掌握这些,就能得心应手的处理实际场景的问题了呢?
在我看来,掌握的还不够,因为 Raft 算法的实现只是工具。而掌握了工具的用法,和能使用工具得心应手地处理实际场景的问题,是两回事。也就是说,我们还需要掌握使用 Raft 算法开发分布式系统的实战能力,然后才能游刃有余的处理实际场景的问题。
我从这个角度出发,在接下来的 2 节课中,我会分别从架构和代码实现的角度,以一个基本的分布式 KV 系统为例,具体说一说,如何基于 Raft 算法构建一个分布式 KV 系统。那么我希望你能课下多动手,自己写一遍,不给自己留下盲区。如果条件允许的话,你还可以按需开发实现需要的功能,并将这套系统作为自己的“配置中心”“名字路由”维护下去,不断在实战中加深自己对技术的理解。
可能有同学会问:“老韩,为什么不以 Etcd 为例呢?它不是已经在生产环境中落地了吗?”
我是这么考虑的,这个基本的分布式 KV 系统的代码比较少,相对纯粹聚焦在技术本身,涉及的 KV 业务层面的逻辑少,适合入门学习(比如你可以从零开始,动手编程实现),是一个很好的学习案例。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

基于Raft算法的分布式KV系统设计实战 本文深入探讨了基于Raft算法的分布式KV系统的设计实战,从架构和代码实现的角度出发,详细介绍了构建一个基于Raft算法的分布式KV系统的过程。作者首先强调了掌握Raft算法的实现只是工具,而掌握使用Raft算法开发分布式系统的实战能力才是关键。文章重点讲解了分布式KV系统的核心功能,包括接入协议、KV操作和分布式集群。在接入协议方面,作者强调了设计HTTP RESTful API以及实现路由的重要性;在KV操作方面,详细介绍了赋值、查询和删除操作的设计,并强调了操作需要具有幂等性;最后,作者提到了实现分布式集群的重要性。整体而言,本文通过具体的案例和代码示例,深入浅出地介绍了基于Raft算法的分布式KV系统的设计实战,对于想要深入了解分布式系统开发的读者具有很高的参考价值。 文章还提到了实现分布式集群的方法,包括创建集群和实现写操作。在创建集群方面,作者介绍了Raft算法中创建集群的步骤;在实现写操作方面,作者提出了两种方法,分析了它们的优缺点,并推荐了一种方法。此外,文章还涉及了读操作的实现,强调了根据实际场景特点进行权衡折中,设计出最适合该场景特点的读操作。 最后,文章还提到了冷热分离理念在设计海量数据存储系统时的重要性,以及对于数据层组件性能和成本的重视。作者还提出了一个课堂思考问题,鼓励读者思考节点故障时如何替换一个节点的问题。 总的来说,本文内容丰富,涵盖了分布式系统开发的多个方面,对于想要深入了解分布式系统开发的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式协议与算法实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • zzl
    consul的读一致性default模式,是从leader节点读的,为啥不一定是最新数据呢?zookeeper的leader节点,读取的数据一定是最新的吗?

    作者回复: 加一颗星:),问题1,此时访问的领导者可能不是真正的领导者,比如3节点集群(A、B、C),A是领导者,发生了网络分区,B、C选举出了新领导者C,当我们继续加一颗星:),访问节点A时,A可能仍处于稳定状态(在 leader leasing 时间内),认为自己领导者(其实它已经不是了),这时它返回数据给客户端,这份数据可能不是最新的。问题2:这个说法不严谨,必须确认主节点仍是领导者,但因为zab不支持该功能,所以,这个做法落地性差,已修正。

    2020-04-15
    3
    15
  • 骨汤鸡蛋面
    按照老师的表述以及对源码的理解,是否可以认为 应用层组件与 raft 库的分工 1. 应用层负责 设计协议接入层以及FSM 的实现(接入和底层存储) 2. raft 负责接入层和持久化之间(raft 也有log存储的部分)

    作者回复: 加一颗星:),可以这么理解,更准确的说,Raft实现的是算法逻辑,领导者选举、日志复制、成员变更等。

    2020-05-22
    2
  • lingjiango
    节点故障后是不是可以先容忍一部分,在容忍的过程中是不是部分节点又恢复正常了?

    作者回复: 加一颗星:)。问题1:可以容忍少数节点故障,也就是说,当少数节点故障时,系统能稳定运行。问题2:节点故障,需要我们做监控来发现,然后修复的。另外,其实你可以通过20讲的raftdb程序,来测试下Raft的节点故障容错能力,感性体验下。

    2020-04-07
    2
  • hello
    老师,请教您一个问题呀,数据的冷热分离,比如基于时间的日志数据可以比较好区分,如果没有明显时间跨度的数据有什么好办法实现冷热分离吗?或者都有哪些冷热分离的策略可供参考?多谢!

    作者回复: 加一颗星:),冷热的本质区别是访问速度,根据实际场景妥协权衡,比如,可以考虑数据类型,对访问效率要求高的业务数据,全部是热数据,要求不高的,冷数据;另外实现时间局部性,访问到的冷数据,在热数据中停留些时间,再老化,下沉为冷数据。

    2020-03-27
    2
  • 阿卡牛
    目前市面上有哪些成熟开源的分布式KV框架可直接用

    作者回复: 比如redis、memcached、etcd、zookeeper等。

    2020-03-27
    3
    2
  • 华子
    请问老师以后会不会介绍multiple raft group相关内容?

    作者回复: 加一颗星:),我后面做个补充吧。

    2020-04-17
    1
  • 钟友兵
    韩老师,有点不太明白使用boostrap启动,称为领导者。一般分布式系统,系统安装配置指定master 。这里的话麻烦解释一下

    作者回复: 加一颗星:),创建集群时,才需要以bootstrap的形式启动,第一个节点是领导者,这是Hashicorp Raft实现的一个功能,方便添加节点创建集群。正常启动,是不需要bootstrap的,领导者由选举产生。具体可以参考下raftdb的Store.Open()的实现。使用Raft,是不需要指定领导者(也就是master的)。

    2020-05-10
  • pedro
    问老师一个问题,如果POST请求新增一个kv键值对,第一个请求新增成功后,应该会给出成功的响应,但若是重复POST请求,第二次应该会失败,这样怎么保证幂等性呢?

    作者回复: 加一颗星:),SET操作(比如SET X = 1)具有冥等性的,执行多次,和执行一次,效果是一样的,即使有多个日志项,后面也会去重压缩处理的,不会有影响的。

    2020-03-27
    3
  • roseduan
    我使用 Go 语言实现了一个单机版的kv数据库:https://github.com/roseduan/rosedb,后续改造为分布式的,多谢老师的指点。也希望大家一起来学习!
    2021-05-19
    3
    11
  • Heaven
    可以在多次发出同步日志的时候,都获得超时的恢复,考虑进行节点的替换,在RemoveServer函数中,可以通过传入失效这个节点的集群的ID来进行删除
    2020-08-25
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部