FUSE 简介
文件系统是存储和管理文件和目录的层级结构,但是从广义的各种变种来说不仅仅如此,有形形色色的基于 VFS 实现的文件系统在此基础上实现了更丰富的功能。例如,基于 CVS 接口的文件系统可以备份老数据,ftpfs 可以在文件系统接口上实现匿名 FTP 。关于 FUSE 这项技术,它并不是全新的,它是一种运行在用户态的文件系统(常规实现将会嵌入到内核态中去)。在运行时,文件系统是一个可执行的二进制文件,链接到 FUSE 的 so 文件。好处是,你不需要去理解内核编程,也不需要理解文件系统的内部接口。
在使用上,首先要安装 FUSE 内核模块。其次,你要基于 FUSE 开发程序,运行一个 Server process, 一个 FUSE client process,其中前者运行着想要的功能,可能在某个服务器集群中;后者则是运行业务逻辑的服务器。在数据通信上,当读写请求到 FUSE …
read more请为 Web 开发一些 Small, Composable 的工具吧!
Unix 的哲学是 1) 一样工具做一样事情,做好这件事情 2) 程序互相协作 3) 文本流作为标准接口。这套哲学至今仍然工作得很好,相应地,Web 可以适应这套哲学,而 App 不能。遗憾的是,unix toolset 还没法很好地继承 Web API,作者希望开发者可以往这方面去想想怎么改进基于 Web 的整套 toolset。这些工具不一定要是全新的,但是必须得是有用的。举个例子,例如 screenshots.firefox.com, 或者去开发一个普通人懂的 Pastebin,archive.org, Deep Linking, scraping, Clipboard 管理,Etherpad 等等。他们很小,不难写,运行起来也简单。
read morePython MANIFEST.in 文档
MANIFEST.in
文件用于定义可被包括到 python distribution 里面的文件列表。当运行 python setup.py sdist
的时候,他会查找 MANIFEST.in
文件并会生成 MANIFEST 文件,而生成的这个文件则包含了所有将会被包含到包里的文件列表。
这个文件的命令将会在执行完打包的标准默认流程后被执行。这个文件由一条一条的命令组成,例如 include *.txt
, recursive-include your-package *.txt
等。这个文件的命令是顺序敏感的。常用的命令包括:include, exclude, recursive-include, recursive-exclude, global-include, global-exclude, prune, graft。其中模式识别支持 glob 语法。
这个文件适合包含各种非 Python 的,或者不在 setup.py packages 的定义中的文件 …
read morePython 3.7 的一个新语法:Data Class
Data Class 是 Python 3.7 引入的新语法,用于为类生成 Boilerplate 代码,减少写重复的代码,可以是 attrs 库的语言级别的替代品。示例:
from dataclass import dataclass
@dataclass
class MyClass:
field: str = 'default'
- 使用
@dataclass
迭代器使其变为 data class - 默认帮你实现好的方法:
__init__
,__repr__
,__str__
__eq__
。其中 init 支持 keyword arguments, 并有类型注解;eq 需要数据类型一致,顺序一致,值一致。 - 可以通过
inspect.signature(MyClass …
Monitoring 和 Observability 的区别
有人开玩笑,开发不喜欢 Monitoring ,就造了个新名词 Observability 让开发们觉得这事就是潮流得跟上!曾经其实所有 Ops 监控的东西,都叫 Monitoring,从视觉上看那就是 Nagios 面版,没啥技术含量。但后来人们发现,这个面版上只是 up/down 完全不够用了,那些简单的 pings 根本看不出问题出在哪里。测个节点挂没挂,服务进程死没死其实已经不足以保证服务的正常运行了。我们真正要登录到服务器去看报错日志和实时的打点数据才有可能找到根因,这就引入了 APM。
Google SRE 一书中将 Monitoring System 认定为要解决两个问题:什么坏了,为什么坏了:既要发现病症,也要发现病灶。当然,前提是,你需要先发制人知道系统在某个域里面可能会发生什么问题,然后做到相关监控,进而做到 Whitebox Monitoring。例如说,对于存储系统最关注 disk-space,对于代理最关注 …
read moreUber 工程师们使用 MySQL 存储 Schemaless 的数据
本文介绍了驱动 Uber 自 2014 到 2018 年以来的存储 trip 这种 schemaless 数据的解决方案。本文是 Part 1.
- 问题:
- 2014 年的存储 trip 数据的数据库空间到当年年底马上就要到顶放不下了。
- 关于不用商用/开源的可扩展 datastore 考量:
- 能线性扩展
- 需要写可靠(Write Availability),即写入失败有个机制可以重试。(尝试理解了下,他们希望尽可能的存储数据,对于写失败不是一股脑的报错)
- 能通知下游依赖。先前这个流程是 error-prone 的:中间一步失败,即使部分成功,还得全部再执行一遍。他们希望改成错误能隔离开。
- 需要 index
- 需要 Operation 能够快速响应,即便在半夜。
- 考量的对象有 Cassandra, Riak, MongoDB …
分布式日志系统从头实现 - 数据复制
分布式日志系统的一个特性是要满足高可用,以避免单点故障(SPOF),而为了保障数据的高可用,我们的解决方法是复制数据。复制数据的手段不外乎两种:gossip/multicast 协议,或者consensus 协议,至于算法,则有 2PC/3PC, Paxos, Raft, Zab, 链式复制等等。在分布式系统中,由于日志的顺序是重要的,所以我们一致性是更优的做法,这就要求我们引入:Leader 负责给写操作排序;复制写操作给集群剩下的节点。至于 Leader 什么时候认为操作结束又引入了两种设计:1) 等待所有节点都同步了;2)等待多数节点都同步了。例如对于 Kafka,使用 1), 对于 NATS Streaming,使用 2)。本文就详细对比了这两种实现。
Kafka Leader 维护了一个 In-sync replica set …
read more