6.824 lab2c, 2d

Lab 2C

实验2C要求实现Raft服务器currentTerm、votedFor和log三个状态的持久化,难度不高,只需要填充相应函数,并在每次回复RPC之前这三个状态被修改之后调用持久化函数。

但实验2C的测试还是有可能因为2A、2B的实现不完善而发生错误。

我在测试时多次碰到该错误:

— FAIL: TestFigure8Unreliable2C (41.85s)
config.go:609: one(5768) failed to reach agreement

Read More

6.824 lab1

6.824简介

6.824为MIT的分布式系统课程。同TinyKV类似,6.824的主要内容也为实现Raft共识算法。以笔者做完Lab1的感受,相比TinyKV,6.824仅提供了基本框架,在测试用例当中并未对实现过程中所使用的数据结构进行具体要求,因此编程自由度较高。

相关资料

6.824 Home Page: Spring 2022

MIT6.824分布式系统课程中文翻译 - 知乎 (zhihu.com)

如何的才能更好地学习 MIT6.824 分布式系统课程? - 知乎 (zhihu.com)

【MIT 6.824 Distributed Systems Spring 2020 分布式系统 中文翻译版合集】_哔哩哔哩_bilibili

Read More

In Search of an Understandable Consensus Algorithm - Raft

摘要

Raft是一个用于管理replicated log的共识算法(consensus algorithm)。Raft与Paxos一样高效。相比Paxos,Raft更加易懂,且为应用到实际系统当中提供了更好的基础。为了提高可理解性,Raft将共识算法的几个关键元素分开,例如leader election、log replication和safety,并且它通过执行更强的一致性减少了需要考虑的状态数目。

引入

共识算法能够让一群机器作为一个团结一致的群体运行,且能够容忍其中部分成员的失效。因此,共识算法在建立可靠的大规模软件系统当中发挥了重要作用。目前,几乎所有的共识算法都是基于Paxos,或受其影响的。但Paxos有两个缺点:

  1. 难以理解。
  2. 不能为构建实际系统提供一个很好的基础。为了应用到实际系统,需要进行复杂的更改。
Read More

TinyKV Project 1 - Standalone KV

任务目的

熟悉Go语法,熟悉面向对象程序设计。

任务说明

Project1需要实现一个单节点、非分布式的K/V存储gRPC服务,本质上是对BadgerDB进行封装,以实现Put/Delete/Get/Scan四种基本操作,以及对Column Family的支持。

该Project大致分为两部分:

  1. StandAloneStorage类的实现。StandAloneStorage类实现了Storage接口,Storage接口提供了用于操作K/V数据库的Start、Stop、Write、Reader四个方法,对于StandAlone的数据库来说,这四个方法就是对底层的BadgerDB进行读写。
Read More

Prim算法 vs Dijkstra算法

Prim算法用于求最小生成树,Dijkstra算法用于求单源最短路径。两者的用途不同,但算法实现非常类似,都采用了贪心算法,都是将顶点从一个集合加到另一个集合当中。但不同的是两者的选点标准:假设已加入的点集为U,未加入的点集为V。Prim算法在V中选取与U中任意顶点直接距离最短的那个顶点加入U,Dijkstra算法选取V中与初始顶点距离最短的那个顶点加入U。

0-1背包问题笔记

一、原始版本

0-1背包问题的原始版本为:

有N件物品和一个最大容纳重量为W的背包。第i件物品的重量是weights[i],价值是values[i] ,每件物品只能用一次,问将哪些物品装入背包之后物品的总价值最大。

通用的解题模板为:设计一个二维数组dp[N+1][W+1],使用两层循环遍历,最后返回二维数组的最后一个值,代码如下。

Read More

我的实用软件清单

我的电脑上装了很多奇奇怪怪的小工具,今天做一个总结,以供查阅。

一、系统工具类

DiskInternals Linux Reader:在Windows下访问Linux文件系统

官网:Access to Ext 2/3/4, HFS and ReiserFS from Windows| DiskInternals

免费版只支持保存文件,收费版能够mount to system。

DiskGenius:磁盘分区管理软件

官网:数据恢复软件,硬盘分区工具,系统备份软件 - DiskGenius官方网站

有一次帮朋友重装系统的时候不小心留了一片剩余空间,最后用这个工具合并的。

Read More

记一次几乎踩了所有坑的Ubuntu双系统安装

前言

我的破本本用虚拟机跑Linux实在是顶不住,于是我昨天晚上一时兴起,想要给笔记本装 Windows 10 + Ubuntu 20.04 LTS 双系统。我的笔记本是UEFI引导,128GB SSD + 1TB机械硬盘,分区表格式都是GPT,Windows 10装在SSD上,计划在机械硬盘上分出128GB装Ubuntu(至于为什么才分这么点,显然是因为1T的硬盘几乎快被游戏填满了,逃)。

要么是我电脑的硬件兼容性太差,要么是我运气不佳,这次安装我居然步步踩坑,从昨天晚上折腾到今天晚上才把所有问题解决。这篇文章记录了我踩坑的全过程,仅供参考,切勿当作教程使用。

一、安装过程

首先进行分区,我参考网上一篇教程,在SSD上划分出200M作为EFI引导分区,然后在机械硬盘上划分出128GiB空间作为Ubuntu主分区(注意:划分过程需要耐心等待,印象中花费了超过半个小时)。为了方便随后的安装过程中根据分区大小和位置找分区,我把分区结果拍了下来。

Read More