简介
在面对海量数据存储 (需要大的存储空间) 和海量查询 (需要高并发的查询) 时, 单服务器的数据存储模型无法提供高可用性.
分区所做的事情就是将大的数据集拆分成多个子数据集, 然后放在多个数据服务器上. 这样一来, 数据存储被分散在多台服务器上, 数据计算服务同样也被分散在多台服务器上.
分区方法
分区策略是指, 如何拆分数据集.
在选择分区策略时, 首先要考虑的就是分区粒度. 例如在 KV 数据库中, 便会将 key 作为原子进行分区, 拆分结果便是一组 key => 一个数据实例. 但是以 key 作为原子时, 有可能会出现单个 key 中存储了一个 big value, 这时分区无法对这个 big value 进行进一步的分割.
然后便要考虑哪些 key => 一个数据实例. 这相当于定义一个映射函数, 你可以手动地指定如 hash(key) ∈ (s0,s1] => Node_0, 然后函数形式就是一张表. 也可以用数学公式 key => Node_{hash(key) % n}, 这样便省去记录映射表. 在定义映射函数的时候还要考虑, 对于一些相关 key 是否需要映射到同一节点, 以方便涉及多个 key 的事务或者查询操作.
最后便是分区的实现.
客户端分区
客户端对于给定 key 选择正确的节点进行读取或者写入.
代理辅助分区
客户端将请求发给分区代理服务程序, 由代理程序转发请求到正确的节点, 并将结果返回客户端.
查询路由
客户端将请求发给任意节点, 由数据节点转发请求到正确的节点.
来源: http://www.jianshu.com/p/4fd00defa10e