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

20 | 基于Raft的分布式KV系统开发实战(二):如何实现代码?

HTTP 307重定向
Get()
level()
一致性模型
HTTP 307重定向
Set()
方法2
-join参数
Bootstrap
Delete()
handleKeyRequest()
HTTP DELETE请求
Get()
handleKeyRequest()
HTTP GET请求
applySet()
raft.Apply()
Set()
handleKeyRequest()
HTTP POST请求
代码移除一个节点
实际场景落地
重新实现系统
大系统架构设计
架构设计技巧
细节技术
raft.VerifyLeader()
HTTP 307重定向
HTTP请求类型
读操作
写操作
创建集群
删除操作
查询操作
赋值操作
handleJoin()
handlerKeyRequest()
ServeHTTP()
"/key"和"/join"2个HTTP RESTful API
HTTP协议
课堂思考
课下实践
实战能力
重点内容
分布式集群
KV操作
接入协议
总结
架构设计
基于Raft的分布式KV系统开发实战

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

你好,我是韩健。
学完上一讲后,相信你已经了解了分布式 KV 系统的架构设计,同时应该也很好奇,架构背后的细节代码是怎么实现的呢?
别着急,今天这节课,我会带你弄明白这个问题。我会具体讲解分布式 KV 系统核心功能点的实现细节。比如,如何实现读操作对应的 3 种一致性模型。而我希望你能在课下反复运行程序,多阅读源码,掌握所有的细节实现。
话不多说,我们开始今天的学习。
在上一讲中,咱们将系统划分为三大功能块(接入协议、KV 操作、分布式集群),那么今天我会按顺序具体说一说每块功能的实现,帮助你掌握架构背后的细节代码。首先,先来了解一下,如何实现接入协议。

如何实现接入协议?

在 19 讲提到,我们选择了 HTTP 协议作为通讯协议,并设计了"/key"和"/join"2 个 HTTP RESTful API,分别用于支持 KV 操作和增加节点的操作,那么,它们是如何实现的呢?
接入协议的核心实现,就是下面的样子。
图1
我带你走一遍这三个步骤,便于你加深印象。
在 ServeHTTP() 中,会根据 URL 路径设置相关的路由信息。比如,会在 handlerKeyRequest() 中处理 URL 路径前缀为"/key"的请求,会在 handleJoin() 中处理 URL 路径为"/join"的请求。
在 handleKeyRequest() 中,处理来自客户端的 KV 操作请求,也就是基于 HTTP POST 请求的赋值操作、基于 HTTP GET 请求的查询操作、基于 HTTP DELETE 请求的删除操作。
在 handleJoin() 中,处理增加节点的请求,最终调用 raft.AddVoter() 函数,将新节点加入到集群中。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了基于Raft的分布式KV系统的代码实现细节。作者首先讲解了接入协议的实现,包括HTTP RESTful API的设计和路由信息的设置。其次,深入解析了KV操作的实现,包括赋值、查询和删除操作的具体流程,以及在领导者节点上执行的必要性。最后,介绍了如何创建和管理分布式集群,包括集群的创建和节点的加入过程。文章通过具体的代码实现细节,帮助读者深入理解了分布式KV系统的架构和实现细节,为读者提供了宝贵的技术指导。文章还提到了实现3种一致性模型,使用户可以根据场景特点选择相应的一致性级别。此外,作者强调了技术的重要性,以及在课程结束后将讲解大系统的架构设计技巧。整体而言,本文内容丰富,涵盖了分布式系统开发的多个方面,对于想要深入了解分布式KV系统的读者具有很高的参考价值。

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

全部留言(18)

  • 最新
  • 精选
  • wjh_all_in
    这里实现一致性,没有采用Quorum NWR,而是把所有读请求都转移到主节点,这在实际的生产系统会成为瓶颈吧?

    作者回复: 加一颗星:),Raft和Quorum NWR是不同时使用的,相互独立的算法,Quorum NWR一般用于AP型系统中,临时提供强一致性。是存在瓶颈这个问题,但可以通过分集群,也就是multi raft等方法来解决。

    2020-03-30
    10
  • 方块睡衣
    老师请留意下项目地址

    作者回复: 文章里有链接,在这里,我再贴下,https://github.com/hanj4096/raftdb

    2020-04-01
    7
  • 小晏子
    如果移除节点,那要考虑是移除主节点还是非主节点吧,如果是主节点那么需要重新发起选主流程,并将主节点数据同步到其他节点,如果是非主节点,那么要通知主节点该节点移除不需要在发送日志给它了。

    作者回复: 加一颗星:),如果是领导者节点,可以先kill掉相关进程,触发领导者心跳超时和领导者选举,将领导者变成跟随者,再移除节点。

    2020-03-30
    2
    5
  • 还有这种操作
    老师有没有代码示例,或者项目示例

    作者回复: 感谢唔多志同学帮忙回复:)。 为了方便其他同学看到,在这里,我再贴下链接地址,https://github.com/hanj4096/raftdb

    2020-03-30
    2
    3
  • 羽翼1982
    一路过来追老师的课,收获还是蛮多的;不过比起实现的细节,我还是想更多了解设计和架构上的知识,特别是这些理论在成熟的开源分布式系统上应用(Kafka,TiDB,ETCD,Cassandra等等),希望老师能够同通过加餐的形式补充这些内容

    作者回复: 感谢一路相伴,多交流:)。另外,感谢反馈,反馈我记下了,后面会综合大家的共性问题,做补充。

    2020-03-31
    1
  • 🤔 2⃣ 0⃣ 1⃣ 9⃣🙄 ...
    $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 老师,添加第二个节点,这两条命令都要执行一遍吗?我执行第一条就被阻塞了

    作者回复: 加一颗星:),不需要,第一条命令是创建新节点并启动,在创建新节点时执行这条命令;第二条命令是启动节点,节点创建后,每次启动节点,执行这条命令就可以了。

    2020-11-12
  • Heaven
    那么整体流程还是按照写操作的流程 获取到store中进行执行 如果不报错,就说进行了RemoveServer() 报错了,查看报错信息,如果是因为不是领导者节点,那么直接返回客户端领导者的地址,让其进行重定向 如果是因为删除节点是领导者节点,无法删除导致的,那么直接返回客户端错误信息 (我这里认为是无法删除领导者节点的,应该由管理人员直接杀死领导者节点的进程)

    作者回复: 加一颗星:),是的,重启领导者节点进程,集群会重新选举领导者,这个领导者将“下台”。

    2020-08-26
  • Heaven
    那么整体流程还是按照写操作的流程 获取到store中进行执行 如果不报错,就说进行了RemoveServer() 报错了,查看报错信息,如果是因为不是领导者节点,那么直接返回客户端领导者的地址,让其进行重定向 如果是因为删除节点是领导者节点,无法删除导致的,那么直接返回客户端错误信息 (我这里认为是无法删除领导者节点的,应该由管理人员直接杀死领导者节点的进程)

    作者回复: 加一颗星:),是的,重启领导者节点进程,集群会重新选举领导者,这个领导者将“下台”。

    2020-08-26
  • 向永俊
    基于Hashicorp,如果在分布式kv系统中,需要实现cas功能,应该怎么实现

    作者回复: 加一颗星:),比较并交换,是一种技术,基于raft实现这种技术?没看明白,能具体说说吗?补充下信息。

    2020-08-05
    4
  • Geek_5735ca
    1.hddr和rddr代表什么含义? 2.单机上怎么模拟多个ip地址?

    作者回复: 加一颗星:),问题1:hddr是HTTP服务的通讯地址,rddr是raft服务相互通讯的地址,比如心跳、日志复制等。问题2:可以的,配置不同的端口和数据存储目录。

    2020-04-24
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部