分区

在不同的系统中定义不同,在 MangoDB 、ElasticSearch 中 的 shard。分区即每条记录(文档)只属于某个特定的分区。每一个分区可以视为一个完整的数据库。

分区的目的主要是将海量数据均匀的分在每个区上。

通过关键字分区

这样会导致数据分布的不均匀,因为数据本身就不是均匀的,例如根据书籍的首字母来分区。

通过哈希值分区

一个好的哈希函数可以让值均匀分布,但是一些编程语言自带的哈希函数不适合用来分区。例如Java的Object.hashCode。

首先会为每个分区确定好哈希范围。这也被称为一致性哈希。但是这样会失去查询的良好特性。

分区为什么不用取模?

哈希值对节点数进行取模,但如果节点数发生变化的话,就需要重新进行迁移,这样每次变更的成本就很大了。

固定数量的分区

假设一开始就固定分区数量,那么也是可行的,例如只需要10个分区,但是分1000个分区,这样再怎么扩,也达不到这个分区数量。

请求路由

一个用户发送请求时,那么应该连接哪个节点呢?一般有以下几种策略:

  1. 允许客户端连接任意节点,如果该节点可以请求的话直接处理,否则转发下一个节点处理,并回复客户端。
  2. 将所有客户端请求都统一发送到一个路由层,再由它进行统一分发,路由节点本身不处理任何节点。
  3. 客户端直接连接到对于分区的节点。