视频笔记:为容器定制的持久化存储方案 - Infinit - Quentin Hocquet
视频笔记:为容器定制的持久化存储方案 - Infinit - Quentin Hocquet
视频信息 #
Persistent storage tailored for containers
by Quentin Hocquet
@ mefyl
CTO @ Infinit
在 Docker Distributed System Summit 2016 上的讲座
2016-10-10
https://www.youtube.com/watch?v=k0m-XwCoxo0
视频链接:https://www.youtube.com/watch?v=k0m-XwCoxo0
幻灯链接:http://www.slideshare.net/Docker/persistent-storage-tailored-for-containers
容器和存储 #
容器非常快捷、可扩展、很灵活
- 非常快速的启动、停止
- 非常快速和容易的横向扩展
- 统一的开发和生产环境
- 而且还可以非常灵活的定制各种需求
但是容器更倾向于无状态化,对于无状态的服务,在容器世界里更容易使用。但是并不意味着我们的服务都是无状态的,而且服务有状态是很重要的,因此我们需要持久化存储。
理想化的持久化存储应该可以做到:
- 可以像容器一样容易的创建、启动
- 可以跟容器的横向扩展同时进行扩展
- 应该和容器一样对于开发、测试、生产环境以同样的方式工作
- 而且应该和容器一样可以使用各种需求
Infinit 存储平台 #
Infinit 存储在设计初期就考虑了容器的应用场景。提供了多种 API,从 POSIX 文件系统,Object (如AWS S3,OpenStack Swift)到 Block (iSCSI)。它将所有节点的本地存储聚合在一起,成为统一的存储池。
Infinit 是完全分布式的 #
没有 Leader,没有 follower,所有的节点都是平等的。
- 在一个节点和一万个节点上,工作方式一样
- 没有单点故障,没有瓶颈
- 节点很容易添加和删除,无论是容量还是速度
- 拥有面向开发和生产环境统一的 API
- 每个设置都可以定制
因此 Infinit 可以:
- 和容器一样轻松的创建和运行。
- 可以伴随容器池的扩容而扩容
- 确保开发、测试、生产环境一致
- 对于各种需求都可配置:加密、冗余、压缩等
如何做到的? #
Infinit 的基本原则:
- 将所有节点至于一个 overlay network 下进行查询和路由
- 将数据以块(block)的形式存储于Distribute Hashtable (DHT) (可以视为分布式键值库),并且确保每个块是一致的。
- 使用密码学的访问控制来执行任何 Leader 的命令
- 使用symmetrical operations来确保稳定性和灵活性
这里的 overlay network 并非 docker overlay network,而是指将上千节点联系起来,可以互相查询、发现、路由的一组算法和实现。
密码访问控制非常强大,利用密钥机制,确保能访问该 Block 的节点,必然拥有密钥,所以必然可以读取信息,以及解密,而无需去询问第三方机构获得权限。
因为我们是 symmetirc 的,并且使用了密码学访问控制,因此所有的块必须自签名以及加密。
深入:DHT Blocks #
DHT Blocks 分为两大类 Mutable blocks
和 Immutable blocks
。
可变更的块(mutable block
):
- 这就很容易产生冲突
- 而且很容易出现过期和失效,需要经常检查
- 很难去验证以及加密解密
不可变的块(immutable block
):
- 不会有冲突
- 不会失效,可以一直缓存
- 非常容易去验证,因为每个块是 addressable 的:
address = hash (content)
不可变的块 可以从任意节点获取,然后在本地磁盘用 LRU 缓存。
由于 Immutable Block
的特性很赞,所以在设计 Infinit 的时候会尽可能的使用 Immutable Block
。
深入:文件系统层 #
文件基本上就是一个带元数据的 Mutable Block
和一个 Immutable Block
组成的FAT (File Allocation Table)
。
文件的内容是使用 Immutable Block
进行存储的,可以随意缓存。因为每次文件变更,会先上传一个替代的 Immutable Block
,结束后只需要很短暂的修改 inode
,即可完成版本替换。因此可以轻易的确保原子读写。
POSIX 的 API 是顺序的,而 Infinit 是高度并行的。因此提供了目录预读、以及文件信息预读的功能,可以让后台以高度并行批量的方式获取信息,降低前台响应时间。
深入:Consensus #
由于是基于 Block 的 Consensus,因此每个 Block 都有一组 Quorum,使用 Paxos 算法。这样的设计导致没有单点故障,而且由于每个 Block 的 quorum 都不同,也没有单一瓶颈问题。
这里没有使用 Raft,而使用了更复杂的 Multipaxos 的算法。
深入:Overlay #
overlay 层是 Infinit 平台中很重要的一个定制点:
比如,算法的选择:
数据存储位置:rack-aware
机架,zone-aware
区域,reliability-aware
可靠性、ensure local
本地存储。