丨基于raft的分布式kv系统开发实战二如何实现代码_第1页
丨基于raft的分布式kv系统开发实战二如何实现代码_第2页
丨基于raft的分布式kv系统开发实战二如何实现代码_第3页
丨基于raft的分布式kv系统开发实战二如何实现代码_第4页
丨基于raft的分布式kv系统开发实战二如何实现代码_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在上一讲中,咱们将系统划分为三大功能块(接入协议、KV操作、分布式集群),那么今天我会按顺序具体说一说每块功能的实现,帮助你掌握架构背后的细节代码。首先,先来了解一下,如何实现接入协议。19到,我们选择了HTTP议作为通讯协议,并设计了"/key"和"/join"2HTTPRESTfulAPI,分别用于支持KV操作和增加节点的操作,那么,它们是如何实现的呢?接入协议的实现,就是下面的样子图我带你走一遍这三个步骤,便于你加深印在ServeHTTP()中,会根据URL路径设置相关的路由信息。比如,会在handlerKeyRequest()处理URL径前缀为"/key"的请求,会在handleJoin处理URL路径为"/join"的请求。在handleKeyRequest()中,处理来自客户端的KV操作请求,也就是基于HTTPPOST请求的赋值操作、基于HTTPGET请求的查询操作、基于HTTPDELETE请求的删除操handleJoin(,处理增加节点的请求,最终调用raft.AddVoter()数,将新节点在这里,需要你注意的是,在根据URL设置相关路由信息时,你需要考虑是路径(比如strings.HasPrefix(r.URL.Path,“/key”)),还是完整匹配(比如r.URL.Path“/join”),避免在实际运行时,路径匹配出错。比如,如果对"/key"做完整匹配(r.URL.Pathkey”),那么下面的查询操作会因为路径匹配出错,无法找到路由信代代1curl-XGETraft-cluster-另外,还需要你注意的是,只有者节点才能执行raft.AddVoter()函数,也就是说handleJoin()函数,只能在者节点上执行说完接入协议后,接下来咱们来分析一下第二块功能的实现,也就是,如何实现KV操作如何实现KV上一节课,我提到这个分KV统会实现赋值、查询、删除3操作,那具体怎么实现呢?你应该知道,赋值操作是基于HTTPPOST请求来实现的,就像下面的样子。代代1curl--d'{"foo":也就是说,我们是通过HTTPPOST请求,实现了赋值操作图同样的,我们走一遍这个过程,加深一下印当接收到KV操作的请求时,系统将调用handleKeyRequest()进行处理handleKeyRequest()数中,检测到HTTP类型为POST求时,确认了这是一个赋值操作,将执行store.Set()函数。Set数中,将创建指令,并通过raft.Apply()数将指令提交给Raft。最终指令Raft指令应用到状态机后,最终将执行applySet()数,创建相应的key值到在这里,补充一下,FSM结构复用了Store结构体,并实现了fsm.Apply()fsm.Snapshot()、fsm.Restore()3个函数。最终应用到状态机的数据,map[string]string的形式,存放在Store.m中。那查询操作是怎么实现的呢?它是基于HTTPGET请求来实现代代1curl-XGET也就是说,我们是通过HTTPGET请求实现了查询操作。在这里强调一下,相比需要图我们走一遍这个过程,加深一下印当接收到KV操作的请求时,系统将调用handleKeyRequest()进行处理handleKeyRequest()数中,检测到HTTP类型为GET求时,确认了这是一个赋值操作,将执行store.Get()函数。Get()函数在内存中查询指定key对应的值而最后一个删除操作,是基于HTTPDELETE请求来实现的代代1curl-XDELETE也就是说,我们是通过HTTPDELETE请求,实现了删图同样的,我们走一遍这个过程当接收到KV操作的请求时,系统将调用handleKeyRequest()进行处理handleKeyRequest()数中,检测到HTTP类型为DELETE时,确认了这是一个删除操作,将执行store.Delete()函数。Delete数中,将创建指令,并raft.Apply()数,将指令提交给Raft。最终当前Raft将指令应用到状态机后,最终执行applyDelete()函数,删除key和值需要向Raft状态机中提交指令的操作,是必须要在者节点上执行的,也就是所谓的需要数据的查询操作(比如客户端设置查询操作的读一致性级别consistent),是必须在者节点上执行的说完了如何实现KV操作后,来看一下最后一块功能,如何实现分布式集群创建集实现一个Raft集群,首先我们要做的就是创建集群,创建Raft集群,主要分为两步。首先,第一个节点通过Bootstrap的方式启动,并作为者节点。启动命令就像下面的样代代1$GOPATH/bin/raftdb-idnode01-haddrraft-cluster-host01:8091-raddrraft-这时将在Store.Open()函数中,调用BootstrapCluster()函数将节点启动起接着,其他节点会通过-join参数指定者节点的地址信息,并向者节点发送,包含代代1$GOPATH/bin/raftdb-idnode02-haddrraft-cluster-host02:8091-raddrraft-当者节点接收到来自其他节点的增加节点请求后,将调用handleJoin()函数进行处理,并最终调用raft.AddVoter()函数,将新节点加入到集群中。在这里,需要你注意的是,只有在向集群中添加新节点时,才需要使用join数。当节点代代1$GOPATH/bin/raftdb-idnode02-haddrraft-cluster-host02:8091-raddrraft-写操在9讲中,我们选择了方法2处理该请求,并将者的地址信息转发给客户端。后续客户端就可以直接者(了演示方便,我们以赋值操作为例)。图我们来看一下具体的内容调用Set()函数执行赋值操如果执行Set数成功,将执行步骤3;如果执行Set数出错,且提示出错的原因步骤4;如果执行Set()函数出错,且提示出错的原因不是因为当前节点不是者,将执行步骤5。赋值操作执行成功,正常系统运行出错,返回错误信息给客而为了更好的利用curl客户端的HTTP重定向功能,我实现了HTTP307重定向,这样,你在执行赋值操作时,就不需要关心节点是否是者节点了。比如,你可以使用下面令,节点2(也就是raft-cluster-host02,0)执行赋值操作。代代1curl-XPOSTraft-cluster-host02:8091/key-d'{"foo":"bar"}'-如果当前节点(也就是节点2)不是者,它将返回包含者地址信息的HTTP307重定向响应给curl。这时,curl根据响应信息,重新发起赋值操作请求,并直接者节点(也就是节点1,0)。具体的过程,就像下面的Wireshark截图。图写请须在者节执行然查作属操作以在节点行,但是如何实现却更加复杂,因为读操作的实现关乎着一致性的实现。那么,具体怎么实现读操说的是,我们可以实现3一致性模型(也就是stale、default、consistent),这具体的读操作的代码实现,就像下面的样图我们走一遍这个过程当接收到HTTPGET查询请求时,系统会先level数,来获取当前请求的读一调用Get()函数,查询指定key和读一致性级别对应的Get();如果执行Get()到者节点上执行查询操作,将执行步骤5;如果执行Get()出错,且提示出错的原因不是因为当前节点不是者,将执行步骤。查询操作执行成功,返回查询到的值给客户系统运行出错,返回错误信息给客在这里,为了更好地利用curl客户端的HTTP重定向功能,我同样实现了HTTP307重定向(具体原理,前面已经介绍了,这里就不啰嗦了)。比如,你可以使用下面令,来实现一致性级别为consistent的查询操作,不需要关心节点(raft-cluster-host02)是11curl-XGETraft-cluster-host02:8091/key/foo?level=consistent-代本节课我主要带你了解了接入协议、KV作、分布式集群的实现,我希望你记住下面三个我们可以借助HTTP请求类型,来实现相关的操作,比如,我们可以通过HTTPGET请求实现查询操作,通过HTTPDELETE请求实现删除操作。你可以通过HTTP307重定向响应,来返回者的地址信息给客户端,需要你注意的是,curl已支持HTTP307重定向,使用起来很方便,所以推荐你优先考虑curl,在日常中执行KV操作。在Raft中,我们可以通过raft.VerifyLeader()来确认当前者,是否仍是者展和支撑海量服务的QQ,是由多个组件(协议接入组件、名字服务、组件等)虽然这个分布式KV系统比较简单,但它相对纯粹聚焦在技术,能帮助你很好的理解Raft算法、HashicorpRaft实现、分布式系统开发实战等。所以,我希望你不懂就问,有问题,我续优化项目会针家共疑问发实关代从代2个角度,帮助你更透彻的理解技术。我希望你能在课下采用自己熟悉的编程语KV我提到了通过join数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论