<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>分布式系统 · 我的博客</title><link>https://blog.example.com/tags/distributed-systems/</link><description>分布式系统 标签下的全部文章</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 12 Nov 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.example.com/tags/distributed-systems/rss.xml" rel="self" type="application/rss+xml"/><item><title>从零理解 Raft：示例长文档</title><link>https://blog.example.com/posts/raft/</link><pubDate>Thu, 12 Nov 2026 10:00:00 +0800</pubDate><guid isPermaLink="true">https://blog.example.com/posts/raft/</guid><description>一篇用 HTML 直接编写的阅读型长文档示例，验证 doc 布局与 RSS 全文输出。</description><category>分布式系统</category><category>阅读笔记</category><content:encoded>&#10;&lt;section&gt;&#10; &lt;p&gt;这篇文档是 HTML 长文档通道的示例。源文件是 &lt;code&gt;content/posts/raft/index.html&lt;/code&gt;，正文只保留片段，不带 &lt;code&gt;html&lt;/code&gt;、&lt;code&gt;head&lt;/code&gt;、&lt;code&gt;body&lt;/code&gt; 外壳。&lt;/p&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;为什么需要共识&lt;/h2&gt;&#10; &lt;p&gt;单机系统只需要一个写入者；一旦复制到多台机器，就必须在“部分节点不可用”的前提下仍然对同一顺序达成一致。Raft 把这个问题拆成三块：选举、日志复制和安全性。&lt;/p&gt;&#10; &lt;p&gt;节点只有三种状态：Follower、Candidate、Leader。任意时刻最多一个 Leader，任期号单调递增。&lt;/p&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;选举流程&lt;/h2&gt;&#10; &lt;ol&gt;&#10; &lt;li&gt;Follower 在选举超时后转为 Candidate，任期加一，并向其他节点拉票。&lt;/li&gt;&#10; &lt;li&gt;获得多数票的 Candidate 成为 Leader，开始发送心跳。&lt;/li&gt;&#10; &lt;li&gt;如果收到任期更大的消息，立即退回 Follower。&lt;/li&gt;&#10; &lt;/ol&gt;&#10; &lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&lt;td&gt;Follower&lt;/td&gt;&lt;td&gt;被动接收日志与心跳&lt;/td&gt;&lt;/tr&gt;&#10; &lt;tr&gt;&lt;td&gt;Candidate&lt;/td&gt;&lt;td&gt;发起投票，等待多数派&lt;/td&gt;&lt;/tr&gt;&#10; &lt;tr&gt;&lt;td&gt;Leader&lt;/td&gt;&lt;td&gt;接收写入并复制日志&lt;/td&gt;&lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;日志复制&lt;/h2&gt;&#10; &lt;p&gt;Leader 把客户端请求追加为日志条目，并行发送给所有 Follower。多数节点确认后条目即为已提交，随后在状态机上按序应用。&lt;/p&gt;&#10; &lt;pre&gt;&lt;code&gt;AppendEntries(term, leaderId, prevLogIndex, prevLogTerm, entries, leaderCommit)&lt;/code&gt;&lt;/pre&gt;&#10; &lt;p&gt;Follower 只有在 &lt;code&gt;prevLogIndex&lt;/code&gt; 与 &lt;code&gt;prevLogTerm&lt;/code&gt; 都匹配时才接受新条目，否则拒绝并要求 Leader 回退。&lt;/p&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;与 RSS 的关系&lt;/h2&gt;&#10; &lt;p&gt;这篇文档会以全文进入 &lt;code&gt;/rss.xml&lt;/code&gt;，正文 HTML 做 XML 转义后放入 &lt;code&gt;content:encoded&lt;/code&gt;。订阅器里保留语义结构，但不保证站内样式；页面样式只作用于站点本身。&lt;/p&gt;&#10;&lt;/section&gt;&#10;</content:encoded></item></channel></rss>