1. 分片(Partition):解决数据集尺度与单机容量、负载不匹配的问题,分片之后可以利用多机容量和负载。
  2. 复制(Replication):系统机器一多,单机故障概率便增大,为了防止数据丢失以及服务高可用,需要做多副本

数据系统在分布式系统中会有三级划分:

数据集(如 Database、Bucket)——分片(Partition)——数据条目(Row、KV)。

通常,每个分片只属于一个数据集,每个数据条目只属于一个分片。单个分片,就像一个小点的数据库。但是,跨分区的操作的,就要复杂的多。

本章首先会介绍数据集切分的方法,并讨论索引和分片的配合;然后将会讨论分片再平衡,集群节点增删会引起数据再平衡;最后,会探讨数据库如何将请求路由到相应的分片并执行。

分片和复制

分片通常和复制结合使用。每个分片有多个副本,可以分散到多机上去(更泛化一点:多个容错阈);同时,每个机器含有多个分片,但通常不会有一个分片的两个副本放到一个机器上。

如果使用多副本使用主从模型,则分片、副本、机器关系如下:

  1. 从一个分片的角度看,主副本在一个机器上,从副本们在另外机器上。
  2. 从一个机器的角度看,既有一些主副本分片,也有一些从副本分片。

image.png

键值对的分片

分片(Partition) 的本质是对数据集合的划分。但在实践中,可以细分为两个步骤:

  1. 对数据集进行逻辑划分
  2. 将逻辑分片调度到物理节点

因此,在分片时,有一些基本要求:

  1. 分片过程中,要保证每个分片的数据量多少尽量均匀,否则会有数据偏斜skew),甚而形成数据热点
  2. 分片后,需要保存路由信息,给一个 KV 条目,能知道去哪个机器上去查;稍差一些,可以知道去哪几个机器上去找;最差的,如果需要去所有机器逐一查询,但性能一般不可接受。

这两条是互相依赖和制约的。比如说,假设分片数目确定,为了分片均匀,每来一条数据,我们可以等概率随机选择一个分片;但在查询每个数据条目时,就得去所有机器上都查一遍。