第一章
可靠性:即使发生了某些错误,系统仍可以继续正常工作。
可扩展性:描述系统应对负载增加的能力。
可维护性:维护与缺陷修复,监控系统来保持正常运行、故障排查、适配新平台、搭配新场景、技术缺陷的完善以及增加新功能。
第三章 数据存储与检索
索引:背后的基本想法都是保留一些额外的元数据,这些元数据作为路标,帮助定位想要的数据。
适当 的索引可以加速读取查询,但每个索引者l 会减慢写速度。
哈希索引
通常采用 hash map (或者hash table,哈希表)来实现。
最简单的索引策略 就是: 保存内存中的hash map,把每个键一一映射到数据文件中特定的字节偏移量, 这样就可以找到每个值的位置。所有的key可以放入内存才行。
为什么不原地更新文件,用新值覆盖旧值,而是使用追加的方式?
- 追加和分段合并主要是顺序写,它通常比随机写入快得多,特别是在旋转式磁性硬盘上。
- 如果段文件是追加的或不可变的,贝 Jj并发和崩愤恢复要简单得多。
- 合并旧段可以避免随着时间的推移数据文件出现碎片化的问题 。
哈希表索引也有其局限性 :
- 日合希表必须全部放入内存,所以如果有大量的键,就没那么幸运了。
- 区间查询效率不高。例如,不能简单地支持扫描 kittyooooo幸口kitty99999区间内的所有键,只能采用逐个查找的方式查询每一个键 。
SSTables和LSM-Tree
要求key-value对的顺序按键排序。
SSTable相比哈希索引的日志段,具有以下优点:
- 合并段更加简单高效,即使文件大于可用内存。方怯类似于合并排序算法中使用的方法。
- 在文件中查找特定的键时,不再需要在内存中保存所有键的索引。因为是根据键排序的。
- 由于读请求往往需要扫描请求范围内的多个key value对,可以考虑将这些记录保存到一个块中并在写磁盘之前将其压缩。
使用红黑树维护排序结构。
为了防止崩溃恢复,在磁盘上保留单独的日 志,每个写入都会立即追加到该日志。
基于合井和压缩排序文件原理的存储引擎通常都被称为LSM存储引擎。
B-trees
B-tree将数据库分解成固定大小的块或页,传统上大小为 4 KB (有时更大),页是内部读/写的最小单元。
每个页面都可以使用地址或位置进行标识,这样可以让一个页面引用另 一个页面,类 似指针,不过是指向磁盘地址,而不是内存。
某一页被指定为B-tree的根:每当查找索引中的一个键时,总是从这里开始。该页面包含若干个键和对子页的引用。
B-tree中一个页所包含的子页引用数量称为分支因子。 在实际中,分支因素取决于存储页面引用和范围边界所需的空间总量,通常为几百个。
如果要添加新键,则需要找到其范围包含新键的页,并将其添加到该页。如果页中没有足够的可用空间来容纳新键,则将其分裂为两个半满的页,并且父页也需要更新以包含分裂之后的新的键范围。
重做日志:这是一个仅支持追加修改的文件,每个 B-tree的修改必须先更新重做日志然后再修改树本身的页。当数据库在崩溃后需要恢复时 ,该日志用于将B-tree恢复到最近一致的状态。
根据经验, LSM-tree通常对于写入更’快,而B-tree被认为对于读取更快。