为了账号安全,请及时绑定邮箱和手机立即绑定

分布式杂谈之存储

标签:
架构 微服务

BigTable

What is the relationship between table , tablet and sstable?

Table 就是用户可见的表,它有 Row,Column,和不同 Version 的 Value。Table 会从逻辑上划分为多个 Tablet 以方便存储。

Tablet 是一个存储单元。在 BigTable 的架构中,是由一个 Master Server 和多个 Tablet Server 组成的。而 Tablet 这一层抽象有些类似传统数据库概念中的 sharding,跟在 HBase 中的 Region 是差不多的思想。Tablet 的读写是由 Tablet Server 来处理的。

SSTable 是一种文件的格式,全称是 “Sorted Strings Table”,是指按照 Key 的排序在文件中存储 <Key, Value> 对。在逻辑上 SSTable 会包含多个 Block,每个 Block 为了方便寻址会有一个 index,所有的 Block index 会写在 SSTable 文件的最后,每当 SSTable 文件被 open 的时候,会将索引加载到内存里,这样每次 Lookup 的时候只有一次硬盘读取。SSTable 也支持全部读取到内存里,这样在 Lookup 的时候没有任何硬盘的读取。这个跟 HBase 中 HFile 的文件格式实现很相似。

Describe what will happen when a read operation or write operation arrives.

读取和写入是以 Tablet 作为一个 Unit 进行的。

在进行写操作的时候,Tablet Server 会先做一些检查,保证请求的合法以及权限问题。权限的检查是通过检查一个在 Chubby 中的列表进行的,这个列表会被 Client Library 缓存住。一次被允许的写操作会先进入 Commit Log,在处理 Log 的时候采取了批处理来提高吞吐。在操作被 Commit 后,它的内容会被插入 MemTable 里,当 MemTable 的 size 超过一个阈值的时候,会让当前的 MemTable 进入一个 frozen 的状态,随后创建一个新的 MemTable,Frozen 的 MemTable 就可以以 SSTable 的形式写入 GFS。

在进行读操作的时候,Tablet Server 会在做了一些检查保证合法后,在 MemTable 和 SSTable 的一个 merge 后的 view 中来进行读操作,这样可以保证可以读到最新的值。

Describe which applications are BigTable suitable for and not suitable for.

BitTable 适合那些对可用性要求比较高的业务场景,同时对于跨行的事务性没有要求的应用。但是正因为没有跨行事务的支持,所以我觉得引用场景很局限。目前在谷歌内部应该也逐渐被 Spanner 和 F1 所取代吧。

Dynamo

// TODO Wait to read

Spanner

What is external consistency? What’s the difference between external consistency and serializability?

External consistency 在文中的描述是:如果事务 2 发生在事务 1 提交之后,那事务 2 的时间戳要比事务 1 提交的时间戳要大,也就是 linearizability。

Serializability 是数据库隔离性上的一个级别,这意味着数据库中所有的事务都是可以被序列化来执行的,只有完全没有冲突的事务才可以并发地执行。

External consistency 是一致性上的概念,在分布式场景下,external consistency 是更难做到的,因为时序对时间的精度要求很高,在分布式场景下,有可能出现因为不同机器系统时间不一致导致事务 2 拿到一个比事务 1 提交的时间戳更小的时间戳。

Serializability 是隔离性上的概念,如果做到了 external consistency,就一定可以做到 serializability。

How does Spanner achieve the external consistency?

Spanner 之前的 Percolator 和 Spanner 都是使用全局的时钟来解决 external consistency 的。但是 Spanner 创新地使用了原子钟和 GPS 来作为全局的时钟,以此来实现 external consistency。

在事务的执行中,Spanner 会保证,每个事务的 commit timestamp 都会在其 start 和 commit 之间。Spanner 依赖的底层容器集群系统 Borg 会维护一个 True Time API,这个 API 会返回精度为 ε 的时间区间 [t - ε, t + ε]。因此每个事务会在 start 和 commit 的时候分别调用一次 True Time API,拿到两个时间区间 [t1 - ε,t1 + ε][t2 - ε,t2 + ε],因此在区间 [t1 + ε,t2 - ε] 之间的时间都是可用的,如果 t1 和 t2 很接近,那最多需要等 2ε。

What will happen if the TrueTime assumption is violated? How the authors argue that TrueTime assumption should be correct?

这会导致 True Time API 不能再用来保证 external consistency,文章中提到,CPU 造成的问题比时钟问题多六倍,因此跟硬件造成的错误相比,时钟造成的问题不值一提,可以被视为是值得信任的。

Distributed Transaction with RDMA and HTM

How does DrTM detect conflicts between remote reads and local writes?

在检测事务的冲突上,DrTM 使用了 HTM 和 RDMA 两种技术,HTM 是一个硬件的特性,在硬件级别提供了有限的事务性内存的支持。RDMA 是 Remote Direct Memory Access,提供了远程直接访问内存,不阻塞 CPU 的操作。

在处理事务冲突时,是在 transaction layer 去做的。对于远程的读和本地的写操作引起的冲突,最简单的方法是用 RMDA 锁住一个 remote record,不管是读还是写。但是这样会大大降低并行性,因此文章进行了一些改进,引入了基于租约的锁,来保证读共享。而在读和本地写产生冲突时,读会通过 RDMA abort 本地的 HTM 事务,从而避免冲突。

Why DrTM has the deadlock issue and how does it avoid the deadlock?

首先,在 DrTM 的 fallback handler 中,不能像传统的实现那样,一个简单的锁就可以解决问题,而是 fallback handler 通过 2PL,对于任何 record 都是以 remote 的形式进行访问。这里就有可能产生死锁。因为涉及到 remote locks 的顺序。

为了避免这个问题,DrTM 声明了一个全局的释放和申请锁的顺序,避免了死锁的问题。

What’s the limitation of DrTM?

首先,DrTM 没有做到很好的可用性,这是它最大的局限性。还有就是需要硬件特性的支持,导致在很多现有的硬件上没有办法完全复刻 DrTM 的工作,而需要一些适配性的工作。

Key-Value Store with RDMA

What makes in-memory key-value store systems suitable for RDMA optimization?

因为 In Memory 的 Key-value Store 的大多数请求都是读操作,因此对于 RDMA 来说,这样的特点使得其实现比较简单,只需要对 get 请求做修改就可以了,这样既可以利用 RDMA 的优点,又不需要对系统做过多的修改。

How does Pilaf ensure the data consistency of ‘get’ operations? Does it have any problems?

利用了一个『Self verifying』的数据结构,它包括一个 root 和很多 pointer,然后会记录一个 checksum。client 通过检查 checksum 可以检测到读写不一致。当遇到了数据竞争时,client 会自动地进行重试操作。

文中提到有两个应用场景会有问题,一个是在 server 修改 hash table 的时候 client 也在读 hash table,这会导致 client 从不合法的内存地址读取内容。

另外是 client 的指针引用可能非法的。比如当 server 在删除一个 key-value 对的时候,client 自身维护的引用就会已经是失效的。

Why does Pilaf need two round-trips to perform a ‘get’ operation? Can we reduce the number of round-trips to one using existing RDMA operations? Why/How?

因为涉及到两次读操作,一次是读哈希表,一次是读真正的 key-value 的内容。可以考虑合并两个内存块,但是这样应该会使得可以存储的空间变小。

RDF Store with RDMA

What are the bottlenecks of existing RDF systems?

一共有两种不同的实现,分别是 Triple store and triple join 和 Graph store and graph exploration。前者是以 triple 的方式来将 RDF 数据存储在关系型数据库中,因此查询有两个步骤,scan 和 join。scan 会分为子查询,最后再借由 hash join 之类的 join 的操作将查询的结果 join 在一起。由此可知如果数据非常大的时候,最后的 join 会是很大的问题。

第二种方式是以图的方式来存储和查询 RDF。这样的方式以 Trinity.RDF 为代表,有一些剪枝的优化。但是最后也会有一个 final join 的过程。

纵观之前的实现,最后的 join 是一个最大的问题。

What are the differences between Wukong and prior graph-based designs? What are the benefits?

最大的不同在于索引的存储方式。之前的基于图的设计都是用独立的索引数据结构来存索引,但是 Wukong 是把索引同样当做基本的数据结构(点和边)来存储。并且会考虑分区来存储这些索引。

这样做有两个好处,第一点就是在进行图上的遍历或者搜索的时候可以直接从索引的节点开始,不用做额外的操作。第二点是这样使得索引的分布式存储变得非常简单,复用了正常的数据的存储方式。

What is full-history pruning and what’s the difference compared with the prior pruning approach? Why can Wukong adopt full-history pruning?

Full-history 就是说所有的历史记录都会被记录下来。之前是只记录一次的。之所以可以这样做是因为一方面 RDF 的查询都不会有太多步,而且 RDMA 在低于 2K bytes 的时候性能都是差不多的,所以 Wukong 可以这样做。

Ambry

Ambry 是一个针对 Media 的分布式对象存储系统,是 LinkedIn 做的一项工作。LinkedIn 作为一个社交产品,会有很多媒体数据需要处理,在之前是采取了文件系统存数据,Oracle 存元数据的方法。随着规模的扩大发现不行,于是就有了这个系统。

Ambry 是一个比较中规中矩的分布式系统,比较让人印象深刻的只有一些 threshold。因为社交数据有一个特性:越是冷的数据会越冷,因此 Ambry 针对这个观察做了一些优化,同时在负载均衡上用了 threshold + round-robin 的方式,很 simple 但是效果不错。除此之外在数据存储上有分层的概念在里面,索引是逐层进行的。最上面是 bloom filter,然后是顺序的 segment,最下面是 partition 里真实的数据。

文章很简单,算是很多工程上的点拼在了一起写的论文,有点像最近读的 F2FS,此外 Ambry 感觉也参考了很多文件系统的设计,有一些共性在里面。比如 log structured update 和 journal 等等。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消