《数据密集型应用系统设计》章节总结 第六章 数据分区

数据分区与数据复制

分区与数据往往结合使用,也就是在每个分区有多个副本,这样可以提升系统的容错性。

键/值数据的分区

分区的主要目的是将数据与查询分布到所有节点,如果分布不均匀,那么某些节点会承担更多的数据量和查询请求,称之为倾斜

随机分布数据能够很好的均匀分布数据,但是后续查询时也不知道原先插入的数据位于哪个分区了,这显然不合理。

基于关键字区间分区

基于原有的关键字划分区间进行分区,比如通过键的首字母划分,分区边界可以手动划分,缺点很明显,容易导致热点数据,例如以x开头的单词会很少。

基于关键字哈希值分区

基于关键字的哈希值划分空间,优点:均匀度高,缺点:丧失了范围查询能力。

一致性哈希:哈希环

负载倾斜与热点

哈希能够很好的分散数据,但是也存在对于某个热点数据频繁访问的问题,例如:黄晓明离婚的微博。

此时可以通过应用层减少该问题:为该微博的请求附加一个随机数,形成不同的关键字,从而分配到不同的分区,但是这也会带来一些问题,例如如何确定热点数据。

分区与二级索引

之前讨论的分区方案都是针对键/值型数据库,键/值型模型较为简单,然而如果存在二级索引会使得情况更加复杂,二级索引是关系型数据库的必备特性,在文档性数据库也十分常见,而许多键/值型数据库并不支持二级索引,对于二级索引的分区通常有两种方式:基于文档和基于词条。

基于文档分区的二级索引

各个分区维护自身独立的二级索引,在使用二级索引查询时,需要将请求发送至所有分区,再将各个分区的结果进行合并。

基于词条的二级索引分区

将二级索引分区,相当于重新建立另一套键/值型数据库,映射关系为<二级索引中的字段值,关键字索引中的关键字>,此时使用二级索引查询时根据值查询特定的分区,再根据需求确定是否需要再利用关键字索引进行查询。

分区再平衡

随着时间推移,数据库会发生一些变化:查询压力增加、数据量增多、原有节点放弃使用,此时需要将一个节点的数据和请求转移到另外一个节点,这个迁移过程称为再平衡,再平衡过程应当满足:

  • 再平衡之后,数据和查询请求仍然能够均匀分配
  • 平衡执行过程中数据库仍然能够提供读写服务
  • 避免不必要的迁移,减少网络和磁盘I/O

动态再平衡策略

为什么不用取模?

哈希值取模很不适合再平衡

固定数量的分区

创建远超节点数量的分区,例如redis创建16384个分区,每个节点承担一定数量的分区,在引入新的节点后,每个旧节点都匀出来一部分分区给新的节点。各个节点可以依据性能承担不同数量的分区,能者多劳。

固定数量的分区的缺点:无法控制单个分区的大小,分区过小造成过大的开销,分区过大则影响查询效率,增大单机负载

动态分区

当分区大小超过一个阈值就拆分为两个分区,相应的也支持合并操作。

按节点比例分区

前两种方式都是令分区数量和节点数量无关,该方法在新节点加入集群时增加新的分区。

自动与手动再平衡

自动再平衡可以根据节点的故障状态自动的进行数据迁移,节点建立等工作

请求路由

三种路由方式:

  • 由任意的节点路由至其他的节点
  • 由专门的路由层进行路由
  • 由客户端确定应当查询的节点

并行查询执行

对于分析型应用,可能存在大量的联结、过滤、分组等操作,此时需要并行查询多个表从而提高效率。

小结

本章讨论遵循以下逻辑进行:

  • 分区的方法:
    • 基于关键字的分区
    • 基于关键字哈希值的分区
  • 二级索引处理方式
    • 各个分区独立建立二级索引
    • 为各个分区建立分布式的二级索引
  • 分区再平衡策略
  • 请求路由方式

你可能感兴趣的:(《数据密集型应用系统设计》章节总结 第六章 数据分区)