《Time, Clocks, and the Ordering of Events in a Distributed System》中文版

分布式系统中的时间,时钟,以及事件顺序

原文:Time, Clocks, and the Ordering of Events in a Distributed System
作者:Leslie Lamport
发表日期:1978 年 07 月
译者:ou@http://ouonline.net/

摘要

本文研究了“分布式系统中一个事件在另一个事件之前发生”这个概念,并用它来定义事件的偏序关系。给出了用于同步逻辑时钟系统的分布式算法,该算法可以用来确定事件的全序关系。用解决同步问题的方法来说明全序的使用。这个算法被专门用来同步物理时钟,并得出时钟同步的最大偏离范围。

引言

时间的概念是我们思维的基础。它源自一个更基础的概念,即事件发生的顺序。如果某事发生在我们的时钟读数为 3:15 之后并且在其读数变为 3:16 之前,我们就说 3:15 发生了某事。事件的时间顺序概念充斥着我们对系统的思考。例如,在航空公司的预定系统中,我们指定如果在航班满员之前提出预定请求,那么应该允许该请求。然而,我们会看到,在考虑分布式系统中的事件时,必须仔细重新检查这个概念。

一个分布式系统由空间上分离的不同进程的集合组成,这些进程通过交换消息来互相通信。一个互相连接的计算机的网络,例如 ARPA,就是一个分布式系统。单个计算机也可以被看作是一个分布式系统,其中的中央控制单元,存储单元和输入输出通道都是独立的进程。如果消息传输延迟与单个进程中事件发生的间隔相比不能忽略,则这个系统就是分布式的。

我们将主要关注空间上分离的计算机系统。但是,我们的许多结论将会更通用。特别地,单台计算机上的多进程系统会遇到与分布式系统类似的问题,因为某些事件的发生顺序不可预测。

在分布式系统中,有时候无法决定两个事件中的哪一个先发生。因此,“先发生”关系只是系统中事件的偏序关系。我们发现这个问题经常出现,是因为人们没有完全意识到这个事实以及它的含义。

在本文中,我们讨论了由“先发生”关系定义的偏序,并给出了一种分布式算法,用于将偏序扩展为所有事件的一致全序。这个算法可以为实现分布式系统提供有用的机制。我们通过一个解决同步问题的简单方法来说明它的用法。如果由这个算法得到的顺序和用户感知的顺序不同,则可能会发生意外的异常行为。通过引入真实的物理时钟可以避免这种情况。我们介绍了一种用来同步这些时钟的简单的方法,并推导出它们漂移的不同步程度的上限。

偏序

如果事件 a 发生的时间早于事件 b,大部分人可能会说 …

阅读全文…

《Reconfiguring a State Machine》中文版

重新配置状态机

原文:Reconfiguring a State Machine
作者:Leslie Lamport, Dahlia Malkhi, Lidong Zhou
发表日期:2010 年 01 月 29 日
译者:ou@http://ouonline.net/

摘要

重新配置意味着更改分布式系统中的执行任务的进程。我们介绍几种方法(包括一些新方法),用来重新配置一个使用状态机方式来实现的系统。本文将讨论这些方法与之前的重新配置算法之间的关系——特别是在组通信中的视图变更。

目录

  • 1 引言
  • 2 状态机
    • 2.1 准备工作
    • 2.2 垃圾回收
    • 2.3 重新配置的简单方法
    • 2.4 正确性
  • 3 重新配置的复杂方法
    • 3.1 停止状态机
      • 3.1.1 “停止标记”法

阅读全文…

《Paxos Made Simple》中文版

深入浅出 PAXOS

原文:Paxos Made Simple
作者:Leslie Lamport
发表日期:2001 年 11 月 01 日
译者:ou@http://ouonline.net/

摘要

Paxos 算法,如果用简明的语言来描述,其实很简单。

目录

  • 1 引言
  • 2 共识算法
    • 2.1 问题描述
    • 2.2 选定一个值
    • 2.3 获得被选定的值
    • 2.4 推进
    • 2.5 实现
  • 3 实现一个状态机
  • 参考文献

1 引言

Paxos 是一个用来实现具有容错特性的分布式系统的算法。很多人认为 …

阅读全文…

emacs GUI 使用 fcitx

前段时间用 emacs GUI 的时候发现不能输入中文,搜了下发现有挺多人遇到问题,参考资料 [1] 里面有解释说是 emacs 的一个遗留问题,只要把 LC_CTYPE 设置成 zh_CN.UTF-8 就行。但是我试了下发现没效果,继续搜索之后发现还有个可能是字体的问题(见参考资料[2,3]),装完字体就好了。这里把需要的配置都总结下备忘,因为字体的问题一点都没有报错,完全不知道从何查起。

这里的环境是 fcitx 4.2.9.7,emacs 26.3。

编辑 ~/.xprofile(或 ~/.bashrc),加入以下内容:

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

编辑 ~/.xprofile(或 ~/.bashrc),设置 LC_CTYPE

export LC_CTYPE=zh_CN.UTF-8

安装缺少的字体(emacs 默认使用带 r-normal--14 的字体,如果找不到 …

阅读全文…

使用 overlayfs+chroot 搭建临时环境

最近在写一个小工具,依赖的库比较多,但是这些依赖都不常用,不想为了开发而装在常用的机器上。想用以前用 chroot 搞的一个开发环境(看 这里),可惜更新源验证总出问题,搜索了几个方案后还是没解决。我只是想搞个隔离的测试环境,不需要限制资源,docker 又庞大配置又麻烦(其实根本原因是我讨厌 golang),又不想重新配置一份环境,于是搜了下 docker 相关的底层技术,最后发现 overlayfs+chroot 就能完美解决我的需求,在这里记录一下,内核版本是 5.6。

overlayfs 介绍

顾名思义,overlayfs 就是把多个目录组合在一起形成一个新的文件系统,在 2014 年被合并进 kernel v3.18。先来看下使用时的命令行参数:

mount -t overlay overlay -o lowerdir=<lowerdir1>:<lowerdir2>:<...>,upperdir=<upperdir>,workdir=<workdir> <mountpoint>

大概介绍下这里的三个参数:

  • lowerdir:只读目录,多个目录用 “:” 分隔。
  • upperdir:可读可写目录。如果 upperdirlowerdir 中有同名的文件,会优先展示 upperdir 中的文件(换言之就是

阅读全文…

博客迁移到 vps

几周前在 linode 上买了个最低配的 vps(不要问我为什么买,我也不知道,反正就是买了),流量翻墙也用不完,于是想着把博客迁过来,还能省点钱。

nginx 和 php

这里

另外还需要在 /etc/nginx/sites-enabled/default 中的 server{} 部分加上

index index.html index.php;

安装数据库

自从 MySQL 被 Oracle 收购后,开源界为了避免版权问题,fork 了一个分支 MariaDB:

apt-get install mariadb-server

为了能让 php 访问数据库,还需要安装对应的插件:

apt-get install php-mysql

备份原博客

从 cpanel 打开文件管理器,将 public_html …

阅读全文…

nginx 支持 php

记录一下 nginx 和 php 的配置过程。运行环境是 Debian 10 stable。

安装:

apt-get install nginx php-fpm

然后编辑 nginx 的配置文件 /etc/nginx/sites-available/default,去掉以下几行的注释:

location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
}

这个配置是告诉 nginx,如果请求中有 .php 结尾的文件,就把它交给 php-fpm 来处理。

改完保存后重启 nginx 和 php-fpm:

/etc/init.d/nginx restart
/etc/init.d/php7.3-fpm 

阅读全文…

从 vim 转到 emacs

没错,这次真的转到 emacs 了,而且估计再也回不去了……

几年前有尝试过转到 emacs 的 经历,但是当时用的并不熟练,所以大概坚持了几周就放弃了。最近换了工作,组里要求统一使用 emacs,说是为了结对编程方便,统一操作,还提供了统一的配置文件。刚开始的时候我当然是拒绝的,心想作为一个已经用了 vim 将近 10 年而且还打算继续用一辈子的铁杆粉怎么可能这么容易动摇,顶多工作时间用 emacs,其余时间还是拥抱心爱的 vim。

但是大部分时间还是在工作,为了干活时不那么痛苦,于是一点点地把 vim 的习惯尽量迁移到 emacs 上。第一时间就是打开 .vimrc,对照 elisp 的 手册 一点点地搬过来。首先上手的是 evil。稍稍配置后基本就和默认的 vim 差不多了。这倒是让我很意外,于是把 vim 删了,在工作之外也开始有意识地用 emacs,渐渐地居然也习惯了没有 vim 的日子。主要矛盾解决后剩下的事情就好办多了,我的配置很久都没有什么大改动,也没有动力尝试什么新插件之类,几个常用的 vim 插件都有对应的 emacs 版本。另外比较惊喜的是,这些插件的扩展都做得不错(可以给插件写插件),调整起来相当方便,相对于对应功能的 vim 插件来说,感觉设计和代码质量上都要好很多,尽管有些功能觉得还是没有 vim …

阅读全文…

博客的几个改动

周末两天把博客捣腾了一下。从表面来看,只是换了个代码高亮的配色,但改动远不止看到的内容。

首先是 wordpress 版本从之前的 3.4.x 升级到了当前的最新版 4.5.x。一直拖着没升级的原因是,之前对 wp 的代码有些改动(看 这里),每次升级都需要重新 diff 改回来。反正像这样的个人小站也没啥入侵价值,所以一直没有怎么关注安全补丁啥的,能用就用着。而今天下定决心要升级是因为准备把文章内容全都改成 markdown,这样能用上一些较新的支持 markdown 的插件。支持 markdown 的静态 blog 也有很多,但是有一点不喜欢的是,评论都是用的第三方,像多说和 disqus 之类,万一这些网站挂了评论就没了。

文章 markdown 化。这也是会有这篇博客的直接原因。这两天趁着周末把全站的 90+ 篇文章都转成 markdown 了,把里面的 html 和 wordpress 特有的标记都去掉了。还有个不起眼但是很费时的改动,就是把全站文章的格式都按照 中文文案排版指北 调整了一遍。不过有些单词大小写和使用还是不够规范。

新增了些插件。为了去掉这些标记,新增了几个插件。下面是在用的插件列表:


阅读全文…

Linux 异步 IO 之 eventfd

经过 3 个月的休(tou)息(lan),是时候写点东西了……

eventfd

较新版本的 Linux 内核(2.6.22 之后)提供了一个新的系统调用 eventfd() 来实现事件通知(参考资料 [1]):

#include <sys/eventfd.h>

int eventfd(unsigned int initval, int flags);

函数返回一个可用于 read()/write()/epoll()/close() 的 fd,fd 包含一个由内核维护的 8 字节的无符号整数,初始值由第一个参数 initval 制定。write() 的 buffer 大小都限定为 8 字节,如果 buffer 大小不等于 8 字节则会返回错误,如果提供给 read() 的大小小于 8 …

阅读全文…