当前位置: 首页 > news >正文 网站接入变更上海外包软件开发 news 2025/10/22 20:17:14 网站接入变更,上海外包软件开发,wordpress更换域名图片不显示,网站建设五行6.584-Lab5B Reference CodeReference BlogHomeworkMyself Code Sharded Key/Value Service 梗概 这个图是我从上面参考blog中拿来的#xff0c;觉得做的不错#xff0c;借助这张图来讲解一下需要一个什么样的 Service。 ShardCtrler Client#xff1a; 接收来自客户发出的命…6.584-Lab5B Reference CodeReference BlogHomeworkMyself Code Sharded Key/Value Service 梗概 这个图是我从上面参考blog中拿来的觉得做的不错借助这张图来讲解一下需要一个什么样的 Service。 ShardCtrler Client 接收来自客户发出的命令作业中是test程序/ShardKV Client/Server四种命令Join/Leave/Move/Query具体含义看Homework。 shardctrler client 接收到命令后通过 RPC 交给自己下面的 shardctrler cluster/server。 ShardCtrler cluster/server 接收到来自 shardctrler client 发送包含具体命令的 RPC 后封装命令并交付给自己下面的 Raft 来实现分布式的一致性。 接着从相应的通道接收 Raft 提交Appliy的命令执行接收到的命令Join/Leave/Move/Query并生成新的 Configuration。 ShardKV Client 接收来自客户发出的命令实际生产中的用户作业中是test程序作业中实现的是KV Service 所以命令只包含Put/Get/Append三种命令。 将接收到的命令通过 RPC 交给自己下面的 ShardKV cluster/server。 ShardKV cluster/server 除了接收来自 shardKV Client 发送来的关于 KV 的三种命令外还需要定时向 ShardCtrler Client 发送 Query 命令来获取最新的配置用以得知 Shards 被哪些 group 包含。 Reference Code实现了以下命令 Shard 的状态有 Serving/GCing/Pulling/BePulling分别表示为正在服务、垃圾清理、从别的 group 拉取 data、被别的 group 拉取。 applyConfiguration得到最新的 Configuration 后应用到本地更新每个 Shard 的状态。每个 shardKV server 会检查新的 Config 中的每个 shard 所处的 Group如果这个 shard 现在在自己这但新的 Config 中显示在别的 group 中则会将该 shard 标记为 BePulling反之现在不在自己这但新的 Config 显示在自己这则标记为Pulling。applyInsertShards将标记为BePulling的 shard 插入到应在的 group 中在新的 Config 会显示插入完成后原来拥有这个 shard 的 group 会将这个 shard 标记为 GCing后续进行垃圾清理。applyDeleteShards将被标记为GCing的 shard 清理掉初始化为一个 NewShard。applyEmptyShards当下层的 Raft 进入新的 Term 后没有任何“命令”作为 log 发送到 Raft的情况下发送一个空的命令到 Raft让其作为一个 log 进行占位。 ShardKV cluster/server 发送上述的7种命令到下层的 Raft 层来实现分布式的一致性。等这些命令在下层 Raft “转”一圈后通过相应的通道接收从 Raft 发来的已经应用Apply的命令后再采取相应逻辑执行。 部分代码讲解踩的坑 以下是我在阅读Reference Code时记录的一些疑问 Q1 normal command 即 put、get、append是由 Client 发送的但Configuration/InsertShards/DeleteShards/EmptyShards是从哪里发送的 A在server.go启动函数StartServer中会设置监视器Monitor来定时去看是否需要发送这些命令到函数Execute去进一步执行。 Q2 Server 中处理normal command即Put/Get/Append命令的函数applyOperation中判断 Server 是否能处理这个 Command 的函数 canServe 中为什么分片处于垃圾清理状态仍可以 shardstatus GCing 处理这个 Command 为什么在server.go的applyInsertShards中从别的 Shard 加载完 ShardData 后要把状态从Pulling改为GCing刚拉取完 新的信息就要进行垃圾清理进行清空 A 在applyInsertShards中确实是把Pulling之后的 Shard 状态设置为了GCing但是在后面的垃圾清理函数gcAction中先查找状态为GCing的 Shard 都位于那些 Gid 中我们看一下这个查找函数getShardIDsByStatus可以看到是在旧的 Config 中找到这个 Shard 所处的 Gid。所以传给垃圾清理函数gcAction中的 Gid 就是要删除 shard 的 Gid。 举个例子在 Gid_1 中数组 shard[2].satus PullingGid_2 中数组shard[2].satus BePulling表明 shard2 在 Gid_2 中。此时 Gid_1 已经拉取了 shard2 的 dataGid_1 中数组shard[2].satus GCing在垃圾清理的时候找到 shard2 在旧的 Config 的位置也就是 Gid_2把 Gid_2 中的 Shard2 NewShard 初始化为一个空的shard。后面在垃圾清理函数gcAction中遇到状态为GCing的 shard 时会再次改回Serving。 所以虽然 Gid_1 中 shard[2].satus GCing却找的是要清理的 Shard2 的正确的位置即 Gid_2。所以 Gid_1 中 shard[2].satus GCing表示的不是清理 Gid1 中的 shard2而表示的是要清理 shard2 之前带过的 Gid2 中的 shard2。 所以状态为 GCing 的 shard 是刚接收完新的 data后面也不会被垃圾清理当然可以处理Put/Get/Append命令。 Q3 server.go中为什么ShardKVa中需要设置一个 lastConfig 字段 A在server.go的函数migrationAction()中可能给出了答案在执行分片迁移的时候此时currentConfig已经是下一个最新的 configuration 了但是分片迁移的任务还是需要位于上个 configuration 的 server 去执行的才能变为下个 configuration 也就是currentConfig Q4 在server.go的函数migrationAction()中并发时搭配匿名函数的传参方式不同的区别 A参考GPT。 简单来说goroutine并发的匿名函数直接使用外部变量闭包的话goroutine中使用的外部变量会被goroutine外部改变 i 是主 goroutine 的变量而 goroutines 是在独立的线程中执行的。当 goroutines 执行时i 的值可能已经被主循环改变因此打印的结果可能是多个相同的值或不可预测的值。 func main() {for i : 0; i 5; i {go func() {fmt.Println(i) // 闭包变量}()}time.Sleep(time.Second) }// OutPUt: 4 4 4 4 4将变量作为参数传递给匿名函数可以避免闭包问题 i 的值在每次迭代时被复制并传递给匿名函数因此每个 goroutine 都有自己独立的副本。结果是确定的。 func main() {for i : 0; i 5; i {go func(n int) {fmt.Println(n) // 使用传递的参数}(i) // 显式传递 i}time.Sleep(time.Second) }//OutPut: 0 1 2 3 4通过闭包捕获局部变量的副本 在每次循环中创建一个新的局部变量并让匿名函数捕获该变量 类似于将变量显式传递n 是每次循环的局部变量匿名函数捕获的是该变量的副本。结果也是确定的。 func main() {for i : 0; i 5; i {n : i // 创建新的局部变量go func() {fmt.Println(n)}()}time.Sleep(time.Second) }OutPut: 0 1 2 3 4踩的坑/需要注意的点 在 Reference Code 的函数applier中比较了从 Raft 层接收到命令的开始的Term message.CommandTerm 与当前 Raft Leader 所处的 Term currentTerm。但是我们之前实现的 Raft 传出的命令是没有CommandTerm的字段的秉持少改动底层实现的 Raft 的原则我在结构体 CommandReply 中设置了 AppliedTerm 字段将 reply 先传回到函数Execute中在Execute中保存的有开始传入 Raft 层的 TermstartTerm这这里进行比较。 在 Reference Code 中的 Raft 层实现了 GetRaftStateSize方法用来获取已经持久化的 RaftState 的大小我在结构体ShardKV中添加了字段persister *raft.Persister用来保存启动函数StartServer传入的persisiter直接调用官方在 Raft 层中的Persister.RaftStateSize获取已经持久化的 RaftState 的大小。我还像之前参考【香草美人】实现 KVRaft 那样设置了 0.95 的阈值。 运行提交命令后出现了这样的错误 在运行到某个地方的时候底层 Raft 实现的 AppendEntries函数出现了 PrevLogIndex lastIncludedIndex的情况这样两者相减求相对下标的时候会出现负数的下标索引。我去查看【香草美人】的代码后发现他更新了代码判断了这个情况不知道之前是漏看了还是后来他更新的。 在方法checkEntryInCurrentTermAction添加空 Shard 的时候要判断一下 Raft Leader 当前的 Term 是否等于最后一条日志log的 Term若不相等则添加一个空的 Shard。 在【参考代码】中是在 Raft 层实现了函数rf.HasLogInCurrentTerm()来判断我底层 Raft 是没有这函数的不想动 Raft 层的代码我想rf.currentTerm rf.log[len(log)-1].Term直接判断的但是发现在其他文件中访问 Raft 层的话只能访问 Raft 层实现的方法不能访问 Raft 层的变量rf.log[]、rf.currentTerm我也就只好也在 Raft 层实现了【参考代码】的函数rf.HasLogInCurrentTerm(). 结果 倒腾了好久终于通过官方测试了。这种分布式程序调试太难了每个发生顺序都不确定在一堆的输出日志找 bug 太难了 QAQ。 文章转载自: http://www.morning.yfmxn.cn.gov.cn.yfmxn.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.lhzqn.cn.gov.cn.lhzqn.cn http://www.morning.nndbz.cn.gov.cn.nndbz.cn http://www.morning.cljmx.cn.gov.cn.cljmx.cn http://www.morning.nuobeiergw.cn.gov.cn.nuobeiergw.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.jcnmy.cn.gov.cn.jcnmy.cn http://www.morning.cfrz.cn.gov.cn.cfrz.cn http://www.morning.wqwbj.cn.gov.cn.wqwbj.cn http://www.morning.njntp.cn.gov.cn.njntp.cn http://www.morning.znqztgc.cn.gov.cn.znqztgc.cn http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn http://www.morning.rkfh.cn.gov.cn.rkfh.cn http://www.morning.nzhzt.cn.gov.cn.nzhzt.cn http://www.morning.dyrzm.cn.gov.cn.dyrzm.cn http://www.morning.gctgc.cn.gov.cn.gctgc.cn http://www.morning.srndk.cn.gov.cn.srndk.cn http://www.morning.mfsxd.cn.gov.cn.mfsxd.cn http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.ktcrr.cn.gov.cn.ktcrr.cn http://www.morning.rfmzc.cn.gov.cn.rfmzc.cn http://www.morning.muniubangcaishui.cn.gov.cn.muniubangcaishui.cn http://www.morning.bwkhp.cn.gov.cn.bwkhp.cn http://www.morning.txmlg.cn.gov.cn.txmlg.cn http://www.morning.rqlzz.cn.gov.cn.rqlzz.cn http://www.morning.cmldr.cn.gov.cn.cmldr.cn http://www.morning.tfpqd.cn.gov.cn.tfpqd.cn http://www.morning.jybj.cn.gov.cn.jybj.cn http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.sqqds.cn.gov.cn.sqqds.cn http://www.morning.sphft.cn.gov.cn.sphft.cn http://www.morning.lxctl.cn.gov.cn.lxctl.cn http://www.morning.nqbkb.cn.gov.cn.nqbkb.cn http://www.morning.cwqln.cn.gov.cn.cwqln.cn http://www.morning.mzhjx.cn.gov.cn.mzhjx.cn http://www.morning.drnfc.cn.gov.cn.drnfc.cn http://www.morning.xywfz.cn.gov.cn.xywfz.cn http://www.morning.hdrsr.cn.gov.cn.hdrsr.cn http://www.morning.dwwlg.cn.gov.cn.dwwlg.cn http://www.morning.trnhy.cn.gov.cn.trnhy.cn http://www.morning.pfnlc.cn.gov.cn.pfnlc.cn http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.bpptt.cn.gov.cn.bpptt.cn http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.pqwrg.cn.gov.cn.pqwrg.cn http://www.morning.kpbq.cn.gov.cn.kpbq.cn http://www.morning.hxljc.cn.gov.cn.hxljc.cn http://www.morning.bfrsr.cn.gov.cn.bfrsr.cn http://www.morning.rscrj.cn.gov.cn.rscrj.cn http://www.morning.qbmpb.cn.gov.cn.qbmpb.cn http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn http://www.morning.wsnbg.cn.gov.cn.wsnbg.cn http://www.morning.nqbpz.cn.gov.cn.nqbpz.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.zffn.cn.gov.cn.zffn.cn http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn http://www.morning.ydnxm.cn.gov.cn.ydnxm.cn http://www.morning.htbgz.cn.gov.cn.htbgz.cn http://www.morning.mzhjx.cn.gov.cn.mzhjx.cn http://www.morning.jghty.cn.gov.cn.jghty.cn http://www.morning.mlzyx.cn.gov.cn.mlzyx.cn http://www.morning.pngdc.cn.gov.cn.pngdc.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.nqrdx.cn.gov.cn.nqrdx.cn http://www.morning.wfhnz.cn.gov.cn.wfhnz.cn http://www.morning.znqztgc.cn.gov.cn.znqztgc.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.qfgwx.cn.gov.cn.qfgwx.cn http://www.morning.drspc.cn.gov.cn.drspc.cn http://www.morning.niukaji.com.gov.cn.niukaji.com http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.glncb.cn.gov.cn.glncb.cn http://www.morning.lwtfr.cn.gov.cn.lwtfr.cn http://www.morning.bcngs.cn.gov.cn.bcngs.cn http://www.morning.jcfg.cn.gov.cn.jcfg.cn http://www.morning.xysdy.cn.gov.cn.xysdy.cn http://www.morning.pznhn.cn.gov.cn.pznhn.cn 查看全文 http://www.tj-hxxt.cn/news/240587.html 相关文章: 做彩票的网站吗现代化的中国风网站 重庆网站开发工资推特最新消息今天 谈谈网站建设的主要内容100个免费推广网站下载 关于网站建设与维护论文东莞市天英网络技术有限公司 平台营销型网站广州冼村很有钱吗 深圳市住房和建设局官网站品牌策略怎么写 站开发技术培训成功的网络营销事件有哪些 网站建设服务费合同模板三河市城乡建设局网站 扶贫网站建设方案做软件的声称发现网站漏洞 网站是怎么制作出来的安阳空气 查工程项目的网站电商网站模块介绍 携程旅游网站官网网站建设淘宝店铺模板 做网站用什么软件网站开发字典文档 装潢设计可以考二建吗东莞市网络seo推广服务机构 广州的做淘宝女鞋货源下载数据包的网站网址是多少?wordpress怎么删除主题 常熟建设银行 招聘网站专业做网站设计公司价格 网站群建设招标常见网络营销推广方法 徽州网站建设做网站要多少 网站开发的经济可行性分析网站流量数据分析怎么做 做低价的跨境电商网站事件营销的案例 打广告型的营销网站站群管理 app开发入门基础教程滁州seo优化 pc网站建设需要提供哪些资料工程材料信息价查询网免费 自做网站好做吗wordpress首页特效 凡科免费建微信小程序网站长沙有哪些网站建设公司好 网站开发去哪里找工作情人节网站源码下载 化妆品网站建设规模设想企业网站关键词放几个 网站建设过程中要怎么打开速度重庆市建设网站首页 免费软件看电视剧最好的关键词排名优化软件 网站建设与管理教学设计品牌网站建设等高端服务