分布式系统,程序语言,算法设计

serving a photo

概览

Haystack 的基本思想就是将索引信息放在内存中,避免额外的IO。为了做到这一点,主要进行了两方面的设计:

  1. 将小文件集合成大文件,减少文件数,从而减少了元信息的数目。
  2. 精简文件元信息,去掉一切在 Facebook 场景中不需要的 POSIX 语义中元信息。

这样就可以将数据元信息减小到一个内存可以放的下的量级,基本上每次每次数据访问同一个一次 IO 就可以完成,而非以前的好几次。

阅读全文 »

python-learn.png

绪论

使用 Logging 前可以先捋一下我们常见的日志输出需求,俗话说,不管需求的设计就是耍流氓。

  1. 能够定位事件(Event)的产生位置(代码文件&行数)和生成时间,用于调试和跟踪。
  2. 一份日志可以同时送到多个目标输出
  3. 可以通过不同级别或者更精细条件筛选日志输出。
  4. 可以方便的控制第三方模块的日志输出。
  5. 实现上面的一切的前提下,配置/设置 尽量简单。

Python 的 Logging 模块通过神奇的模块化设计,形的方式组织完美的实现了以上五点。

阅读全文 »

python-learn.png

引言

某次在用到 Python 的 socketserver 时,看到了 ForkingMixInThreadingMixIn。当时就对这种插件式语法糖感觉很神奇。最近自己写代码,也想写一些这种即插即用的插件代码,于是对 python 的 mix-in 机制探究了一番。

简单来说它是利用多继承的特性,通过插拔额外代码片段,对原类进行花样式增强的一种技术。

阅读全文 »

python-learn.png

小引

以前学 js 的时候第一次见到闭包,当时不甚了了,还为了应付面试强行记住了一个模棱两可的“定义”:在函数中嵌套定义函数,并且在外层将内层函数返回,一同返回了外层函数的环境。当时从字面意思以及当时一个经典例子试图去理解闭包,加之”闭包”这个翻译也很不容易让人味出其中的道理,导致对其总感觉懵懵懂懂。最近工作需要,用起 python,又遇到闭包,这次看到了一些新奇有趣的资料,这才算大致把一些字面上的概念(first-class functions,bind,scope等等)贯通在一起,反过来对闭包有了更深的理解。

引用资料列在最后,十分推荐大家去读读。

阅读全文 »

hexo 博客搭建

今年新年愿望之一,督促自己每周写博客。作为一个新的开始,打扫屋子清爽一番是我的一贯风格。加上感觉jeklly 引擎不怎么好使,就想换个新的引擎 hexo。去年注意到越来越多的博客开始用这个引擎,于是关注了下,感觉的确不错(主题,模式等等),说干就干。想着作为科班出身,看别人教程多low,于是直接看官方文档开搞,当然了,坑是不可避免的,下面来聊一下。

阅读全文 »

前言

上一次在做完 lab2a 即 raft 的 leader 选举之后,一直卡在日志同步这一块(log replication);直到昨晚进行了一下 appendEntries 的优化(prevLog 不匹配时,一下跳过本 term 所有 logEntries),一直困扰的 TestBackup2B 竟然神奇 Passed 的了。跑了两遍还不大信,特地将其改回去,看到果然 Fail 才放心下来,看来是效率太低超时了。

趁着还新鲜,索性今晚就将这一段时间的血泪史记下来吧。

阅读全文 »

概述

记录下在实现6.824 lab2 raft 的一些想法和经验,聊以备忘。

实验概述

6.824是MIT的一门分布式课程,我跟的是2018 spring 。在第二个实验中要求简单实现一个分布式一致性协议–raft

这是一个专为方便教学和工程实现所设计的协议,它将协议拆解为几个相对独立的模块–leader选举,log复制,安全保证。论文里图二基本给出了Raft的所有实现细节,可谓字字珠玑。但也因为太微言大义了,导致有些状态转换分散在不同描述中,假如你真只照着这幅图实现,很容易遗漏些细节。

阅读全文 »

概述

以前对二分查找的认识只停留在有序数组查找给定整数上,后来发现一类问题都可以用二分的思想来做,概括来说就是:如果要求的结果所在的集合(值域)和要搜索的数的集合(定义域)存在单调(映射)关系,就可以通过二分思想来解决,说起来有点抽象,后面将用几个例子来说明。

二分思想以其每次迭代将规模砍一半的效率,有着极其广阔的应用。

本文分两大部分,第一部分对二分查找的各个细节探讨;第二部分拓展二分查找为一般的二分思想。

阅读全文 »