<?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>分布式 on 涯余的博客</title><link>https://hangyan.github.io/categories/%E5%88%86%E5%B8%83%E5%BC%8F/</link><description>Recent content in 分布式 on 涯余的博客</description><generator>Hugo</generator><language>zh</language><managingEditor>hang.yan@hotmail.com (涯余)</managingEditor><webMaster>hang.yan@hotmail.com (涯余)</webMaster><lastBuildDate>Tue, 10 Sep 2019 14:51:05 +0000</lastBuildDate><atom:link href="https://hangyan.github.io/categories/%E5%88%86%E5%B8%83%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>Raft 协议笔记</title><link>https://hangyan.github.io/post/2019-09-10-raft-notes/</link><pubDate>Tue, 10 Sep 2019 14:51:05 +0000</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2019-09-10-raft-notes/</guid><description>&lt;p&gt;关注于 Raft 可能更多是因为 kubernetes/etcd 的原因，二者似乎变成了 raft 最大的&lt;code&gt;客户&lt;/code&gt;，时不时地重新理解一下这个协议还是很有必要的。&lt;/p&gt;
&lt;p&gt;之所以这样讲，是因为分布式协议本身就很难理解。即使 raft 论文中一再声称它的主要目的之一便是容易理解，比 paxos 更好懂，但对于一般从业者来说，要想完整地理解它还是有困难的。所以经常需要温故而知新。并且，在网上一搜，关于 raft 协议的 blog 也是汗牛充栋，每个人都在试着理解，记录。可能后续还需要参考下别人的笔记，互相印证。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;论文地址: &lt;a href="https://raft.github.io/raft.pdf"&gt;In Search of an Understandable Consensus Algorithm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="基本知识"&gt;基本知识&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;leader&lt;/code&gt; 的概念是核心之一。raft 作为一个分布式系统，各个 server 通过固定的算法选举出 leader , 然后 leader 负责状态的维护，处理 client 的请求，维护整个集群的状态等等。跟民主制度里面多党选举有点像， 一旦大多数投票通过，总统就拥有至高权力。&lt;/p&gt;
&lt;p&gt;除了 leader 之外，还有另外两个角色是 &lt;code&gt;follower&lt;/code&gt;以及&lt;code&gt;candidate&lt;/code&gt;。选举状态下，大家都是&lt;code&gt;candidate&lt;/code&gt;,正常工作情况下，就分成了&lt;code&gt;leader&lt;/code&gt;和&lt;code&gt;follower&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Raft 并没有使用系统时钟来作为同步机制，因为太不可靠了，而且维护起来很麻烦。raft 使用了一个 &lt;code&gt;term&lt;/code&gt; 的概念来代表时序。&lt;/p&gt;
&lt;h2 id="leader-election"&gt;Leader election&lt;/h2&gt;
&lt;p&gt;一般的流程如下所示:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;server 启动时，成为 follower&lt;/li&gt;
&lt;li&gt;如果 follower 在 election timeout 的时间内，没有收到 leader 发来的 heartbeat， 那么它就假定没有 leader, 准备开始选举&lt;/li&gt;
&lt;li&gt;follower 将自己变为 candidate， 然后给自己投一票， 然后发信息给其他 server 问其他 server 是否可以给自己投票。结果要么是大多数投了它，它成为 leader, 或者另外一个 candidate 成为了 leader, 或者没有 leader (splite vote,没有 server 获取到大多数 vote)，那么就进行一下次投票。&lt;/li&gt;
&lt;li&gt;在 election 的过程中，有可能其他的 candidate 已经成为了 leader, 并给当前的 candidate 发来了同步数据的请求。这时候就可以通过 term 的比较来判定，如果发过来的 term 数不小于自己的，那么就承认发送者的 leader 地位，并且把自己切换回 follower 状态。否则的话拒绝请求并且继续选举。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里面有一个问题，所有人都在给所有人发请求要求 vote 自己，怎么能达到有一个 candidate 获取到 大多数 vote 呢? raft 采用了 randomized election timeout 来解决这个问题。不同 server 的 lection timout 不一样，避免了大部分情况下的 splite vote 情况。如果发生 splite vote, 重来一次。这种机制跟 TCP 的拥塞控制有些类似。&lt;/p&gt;</description></item><item><title>Sinfonia: a new paradigm for building scalable distributed systems</title><link>https://hangyan.github.io/post/2019-07-24-sinfonia-paper/</link><pubDate>Wed, 24 Jul 2019 17:22:10 +0000</pubDate><author>hang.yan@hotmail.com (涯余)</author><guid>https://hangyan.github.io/post/2019-07-24-sinfonia-paper/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;论文链接: &lt;a href="http://www.sosp2007.org/papers/sosp064-aguilera.pdf"&gt;Sinfonia: a new paradigm for building scalable distributed systems&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sinfornia 像是一个构建分布式系统的 SDK 。目前的市面上分布式系统已经非常多了，比如 etcd, zookeeper, ceph 等等。但他们都是分别实现的，彼此之间的代码并无太多借鉴。Sinfonia 的实践是很难得的，可以说比大部分的分布式软件都更有指导价值一些。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://hangyan.github.io/images/sinfonia/arc.png"&gt;&lt;/p&gt;
&lt;p&gt;这个图中展示了 Sinfonia 中关键的几部分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;user library: SDK 部分，隐藏了分布式系统处理内部细节的 SDK。用户基于 user library 来开发分布式应用&lt;/li&gt;
&lt;li&gt;minitranscations: Sinfonia 的核心概念。一个分布式的事物机制&lt;/li&gt;
&lt;li&gt;application node: 应用节点&lt;/li&gt;
&lt;li&gt;memory node: 维持分布式系统内部状态的节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;图中没有画出的有&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理节点: 用于执行一些定期的 recover 任务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;directory node&lt;/code&gt;: Application Node 访问 Memory Node 使用的是逻辑 id, directory node 记录了逻辑 id 与 真实地址的映射。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="memory-node"&gt;Memory Node&lt;/h2&gt;
&lt;p&gt;Memory Node 存储了应用的状态数据，根据不同情况，可能是存在 RAM 中，也可能是在磁盘上。 user library 封装了操作 Memory Node 中数据的方式。Application Node 可以与 Memory Node 是同台机器也可以是不同机器(有些 Application 出于性能考虑会需要 Applicaiton Node 与 Memory Node 为同台机器，Sinfonia 会告知 Application 此种情况以便让其尽量把数据写在本机)。&lt;/p&gt;</description></item></channel></rss>