首页 > 其他分享 >[已过万次测试] MIT 6.5840 2023 Lab 4 Shard KV Server TaskA, TaskB, Challenge 通关总结

[已过万次测试] MIT 6.5840 2023 Lab 4 Shard KV Server TaskA, TaskB, Challenge 通关总结

时间:2023-07-14 21:46:51浏览次数:51  
标签:6.5840 Challenge shard Shard TaskB 节点 config 转移

MIT 6.5840 2023 Lab 4 Shard KV Server TaskA, TaskB, Challenge

前言

这波是终于写完了MIT 6.5840 的所有lab了。lab均是独立完成,没有任何参考,哈哈,还是挺有成就感的。lab4其实在上周就已经写完了,不过比较懒,拖了一周才开始写总结。

本次lab4,在所有lab中,个人认为难度仅次于lab2,也就是仅次于Raft。由于是在已经实现lab3的情况下,因此工作量不是特别大。这次的shard分区感觉还是挺有意思的。废话不多说,直接进入正题吧。

一些小细节

其实这次试验,由于有了lab3的经验,思路其实还是比较清晰的。

  • 对于TaskA,也就是config服务的实现,和lab3基本没啥区别,而且还没snapshot的要求,因此还是较为简单的。主要需要解决的问题就是如何实现 最少步数 的shard转移。为什么要实现最小呢?这是因为实现了最小步数后,节点之间的转移就必然形成了一个 有向无环图(DAG) 或者 DAG集合,这个性质在TaskB中很重要,因此需要实现 最小。如何实现最小,其实很简单,贪心就行了。每次选择shard数最大的节点Max(server id 升序),以及shard数最小的节点(server id降序),然后将Max中的一个shard转移给Min中的一个shard即可,直到平衡。至于为什么和server id有关,这是因为转移需要确定性,而golang中的map遍历的顺序是不确定的。

  • 对于TaskB,Challenge:所有操作无脑写日志搞进Raft里面来实现线性化即可。由于我在一开始考虑了challenge进行设计,因此这里就和Challenge的内容一起简单写了。TaskB中,主要的问题其实就是状态机状态类型的添加(config状态,转移状态等),同时在转移的时候,还需要将节点的幂等性状态一同转移(也就是记录client相关内容,用于识别client重复提交的内容)。要实现Challenge,主要就是要实现转移的分片,我是根据转移目标进行分片,也就是新的config来了之后,我会解析现有config与新config之间的差别从而建立转移规则,然后对于每个目标节点,分别将log塞入raft,最后在commit时进行转移(主从节点均要转移)。有一个小细节,所有节点必须全部经历所有config(从config 0 到 最新的config),不能跨config更新。每次发送时,当前节点对于目标节点就是一个client,用client请求的处理逻辑来处理转移请求即可。client收到(也就是转出节点)转移成功请求后,取消对对应所有shard的服务,从而完成Challenge,同时接收方接收后开始服务Shard。此时,之前提到的幂等性状态的同时转移就很重要了。同时中,由于转移是在commit时完成的,因此在转移过程中需要接锁。同时,TaskA中的 最小 从而实现的 DAG 也在此处避免了分布式死锁。

过多的工程细节这里就不说了,有小伙伴有问题的话可以评论区留言或者私信,我会尽量解答的。(看番去了,润!)

万次测试通过图

标签:6.5840,Challenge,shard,Shard,TaskB,节点,config,转移
From: https://www.cnblogs.com/alyjay/p/17555050.html

相关文章

  • shardingJDBC分表
    spring:shardingsphere:datasource:names:ds-0ds-0:connectionTimeout:500000#连接超时时间type:com.zaxxer.hikari.HikariDataSourcejdbcUrl:username:password:driver-class-name:com.mys......
  • sharding-jdbc分库连接数优化
    一.背景:配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件,整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库.当每增加一台客户端主机,一个MYSQl实例最......
  • SpringBoot整合Sharding-JDBC水平分表
    本文使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用方法。首先创建两张表,t_order_1和t_order_2,这两张表是订单表拆分后的表,通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_......
  • 解决高可用集群篇(三)-- MySQL主从复制&ShardingSphere读写分离分库分表的具体操作步
    高可用集群篇(三)--MySQL主从复制&ShardingSphere读写分离分库分表1.什么是MySQL主从复制?MySQL主从复制是指将一个MySQL数据库服务器作为主服务器,其他MySQL服务器作为从服务器,通过将主服务器上的数据变更同步到从服务器上,实现数据的复制和同步的过程。主从复制的实现方式主......
  • mysql分库分表 sharding-jdbc 5.0的代码实现 (二)
    分库分表之前试过了分表不分库,详情见:https://www.cnblogs.com/expiator/p/17524493.html这次再试下分库分表。依赖包SpringBoot用的是2.6.13版本。<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-......
  • MIT6.5840 lab2,3 记录
    参考链接课程地址如何Debug:没有它可怎么活,几万行的日志怎么看Students'GuidetoRaftraft算法可视化:直观展示raft可视化简单入门raft讲解视频:强烈推荐感想感觉理论+实践来学一个东西才学的深刻,特别是对于我这样对抽象理解不太行的,每次见识了一个算法或系统真正如何运行......
  • ShardingJDBC 01_概念及主要功能
    1ShardingJDBC是什么Sharding-JDBC是ApacheShardingSphere生态圈中一款开源的分布式数据库第三方组件。ShardingSphere由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar3款相互独立的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,适用于Java......
  • CS202 Caesar’s Challenge
    CS202Assignment3--Caesar’sChallenge(groupassignment)Due:11:59pm06/26/2023(Monday)IntroductionAsarenowneddetective,SherlockHolmesreceivesalotofmail.Someofhismailincludedpuzzlesfromhisrivals,attemptingtobethefirsttoconfuseS......
  • ShardingSphere5入门到实战
    ShardingSphere5入门到实战第01章高性能架构模式互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。高性能数据库集群的第一种方式是“读写分离”,第二种方式是“数据库分片”。1、读写分离架构读写分......
  • 倒计时 2 天!预约本周六 ShardingSphere 线上圆桌会,赢取惊喜好礼!
    ......