Raft论文翻译

Raft 论文原文传送门: In Search of an Understandable Consensus Algorithm (Extended Version) 这篇文章大头是原文翻译,但我在很多地方加入了自己的理解, 主要作为我自己的笔记,不保证读者可以看懂,但你若有问题可以写在评论区,我会回复。 论文第 9 节及以后没有在本文记录笔记,因为这之后的内容不再是 Raft 共识算法的一部分。 0. 摘要 Raft 是一种用于管理复制日志的共识算法。 Raft 产生的结果和 (multi-)Paxos 一样,并且和 Paxos 一样高效,但是 Raft 的结构和 Paxos 不同。这使 Raft 比 Paxos 更容易理解,也为在构建实际系统提供了更好的基础。 为了更容易理解,Raft 分离了共识的关键要素,例如领导选举(leader election),日志复制(log replication)和安全性(safety)。 Raft 加强了一致性,以减少必须考虑的情况的数目。 一个用户研究的结果说明,对于学生来说,Raft 比 Paxos 更容易学。 Raft 还包括一种用于更改集群成员的新机制,该机制使用重叠多数(overlapping majorities)来保证安全。 1. 导论 共识算法允许一组机器作为一个一致的组来工作,这个组能够在其部分成员故障时幸存。因此,在构建可靠的大规模软件系统中,共识算法扮演着关键的角色。在过去十年间,关于共识算法的讨论被 Paxos 统治:大部分共识实现都是基于 Paxos 或受 Paxos 影响的,并且 Paxos 成为了给学生讲关于共识内容的主要工具。 不幸的是,尽管有数次让 Paxos 更平易近人的尝试,其还是相当难于理解。此外,Paxos 的架构需要复杂的修改以支持实际的系统。结果就是,系统构建者和学生都在为 Paxos 苦苦挣扎。 在我们与 Paxos 斗争之后,我们开始寻找一个新的共识算法,期望此算法能够为系统构建和教育提供更好的基础。我们的主要目标是可理解性,我们的方法不太寻常:我们能否为实际系统定义一个共识的算法,并且以比 Paxos 容易学得多的方式描述这个算法?此外,我们希望此算法能够促进对系统构建者至关重要的直觉的发展。不仅仅是算法能够工作很重要,能明显看出为什么可以工作也很重要。...

九月 10, 2024

使用 Hugo ShortCode短代码

介绍 Hugo 提供了多个内置的 Shortcodes, 以方便作者保持 Markdown 内容的整洁. Hugo 使用 Markdown 为其简单的内容格式. 但是, Markdown 在很多方面都无法很好地支持. 你可以使用纯 HTML 来扩展可能性. 但这恰好是一个坏主意. 大家使用 Markdown, 正是因为它即使不经过渲染也可以轻松阅读. 应该尽可能避免使用 HTML 以保持内容简洁. 为了避免这种限制, Hugo 创建了 shortcodes. shortcode 是一个简单代码段, 可以生成合理的 HTML 代码, 并且符合 Markdown 的设计哲学. Hugo 附带了一组预定义的 shortcodes, 它们实现了一些非常常见的用法. 提供这些 shortcodes 是为了方便保持你的 Markdown 内容简洁. 使用短代码 这里有两个配对的短代码示例: 示例1:使用百分号 {{% mdshortcode %}}在*中间*处`处理`的内容。{{% /mdshortcode %}} 示例2:使用尖括号 {{< highlight go >}} 这里有一堆代码 {{< /highlight >}} 上面的示例使用了两种不同的界定符,第一个示例中使用了%字符,第二个示例中使用了<>字符。 使用百分号作为最外层分隔符的短代码将在发送到内容渲染器时完全渲染。这意味着短代码的渲染输出可以成为页面的目录、脚注等的一部分。 使用尖括号表示短代码的内部内容不需要进一步渲染。通常,不使用Markdown的短代码包括内部HTML: {{< myshortcode >}}<p>你好 <strong>世界!</strong></p>{{< /myshortcode >}} 使用原始字符串参数的短代码 你可以使用原始字符串字面量将多行作为参数传递给短代码:...

九月 5, 2024

Hugo博客PaperMod主题 侧边导航栏

在single.html页面,添加右侧边栏代码即可。post-toc可优化手机上自动隐藏侧边栏 {{- define "main" }} <!-- 左侧边栏 --> <aside></aside> <article class="post-single"> ... </article> <!-- 右侧边栏 start--> <aside> <div class="post-toc" style="position: fixed;max-width:300px; right:5px;overflow:auto; top: 100px;bottom:50px"> {{- partial "toc.html" . }} </div> <style> @media only screen and (max-width: 1224px) { .post-toc { display: none; } } </style> </aside> <!-- 右侧边栏 end--> {{- end }}{{/* end main */}} 参考资料 Hugo博客侧边导航栏 Hugo 主题创建 添加侧边栏 在PaperMod中引入侧边目录和阅读进度显示 hugo-PaperMod主题 Sulv-Blog-Hugo博客目录放在侧边-PaperMod主题

九月 5, 2024

使用 Hugo 和 PaperMod 主题创建个人博客

介绍 Hugo是一个用 go 语言编写的开源网站构建框架,截止目前GitHub星数超过70k,它具有功能强大的模板系统、丰富的主题、完善的文档以及全平台支持的客户端,提供开箱即用的分类系统、评论系统、代码高亮、多语言支持等功能,非常适合用来搭建博客网站。 在本地撰写阶段,借助 Hugo 内置服务器可以做到毫秒级热更新,实现所见即所得。同时,得益于 Hugo 采用静态站点生成的架构,Hugo 站点可以很容易的部署到各种 HTTP 服务器,且通过本地预览即可确认线上部署效果。 基于成本和使用习惯考虑,选择使用 GitHub Pages 进行部署,并且根据功能不同进行仓库拆分。话不多说,来开始吧。 hugo安装 如果是win10系统,可以用choco install hugo安装。或者从github网站下载extended版本。 下载完成,配置系统环境变量。然后使用命令hugo version查看是否安装正确。 $ hugo version hugo v0.133 创建站点 运行以下命令,使用 PaperMod 主题创建 Hugo 网站。下一部分将解释每个命令的用途。 # 创建站点 hugo new site hugoblog # 进入站点目录 cd hugoblog # 初始化仓库 git init # 添加子模块 git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod # 修改配置 echo "theme: 'PaperMod'" >> hugo.yaml # 启动服务 hugo server -D 在终端中显示的 URL 中查看您的网站。按下 Ctrl + C 停止 Hugo 的开发服务器。...

九月 4, 2024

413.等差数列划分

题目 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。 子数组 是数组中的一个连续序列。 示例 1: 输入:nums = [1,2,3,4] 输出:3 解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。 示例 2: 输入:nums = [1] 输出:0 提示: 1 <= nums.length <= 5000 -1000 <= nums[i] <= 1000 思路与代码 方法一:双指针法 有几个关键点我们必须要清晰,等差数列,子数组。 等差数列是指从第二项起,每一项与它的前一项的差等于同一个常数的一种数列 子数组是数组中的一个连续序列,连续,长度至少为3 一个子数组如果分为前后两部分,前面不是等差数列,那么后面部分就不用判断了 因此,对于每个起始位置,我们只需要向后进行一遍扫描,不断累加,直到不再构成等差数列为止,此时,已经没有必要再向后扫描了。 代码 int numberOfArithmeticSlices(vector<int>& nums) { int len = nums.size(); int res = 0; for (int i = 0; i < len - 2; i++) { int d = nums[i + 1] - nums[i]; for (int j = i + 1; j < len - 1; j++) { if (nums[j + 1] - nums[j] == d) res++; else break; } } return res; } 时间复杂度:$O(N^{2})$...

八月 11, 2021