1.3 数据分片

在大数据环境下,数据量已经由GB级别跨越到PB级别,依靠单台计算机已经无法存储与处理如此规模的数据,唯一的出路,是采用大规模集群来对这些数据进行存储和处理,所以,系统的可扩展性成为衡量系统优劣的关键因素。

传统关系数据库系统为了支持更多的数据,采用纵向扩展(Scale Up)的方式,即不增加机器数量,而是通过改善单机硬件资源配置,来解决问题。如今这种方式已经行不通了。

目前主流的大数据存储与计算系统通常采用横向扩展(Scale Out)的方式支持系统可扩展性,即通过增加机器数目来获得水平扩展能力。与此对应,对于待存储处理的海量数据,需要通过数据分片(Shard/Partition)来对数据进行切分并分配到各个机器中去,通过数据分片实现系统的水平扩展。

目前,大规模存储与计算系统都是采用普通商用服务器来作为硬件资源池的,系统故障被认为是常态。因此,与数据分片密切相关的是数据复制,通过数据复制来保证数据的高可用性。数据复制是将同一份数据复制存储在多台计算机中,以保证数据在故障常发环境下仍然可用。从数据复制还可以获得另一个好处,即可以增加读操作的效率,客户端可以从多个备份数据中选择物理距离较近的进行读取,既增加了读操作的并发性,又可以提高单次的读取效率。

数据复制带来的难题是如何保证数据的一致性。由于每份数据存在多个副本,在并发地对数据进行更新时,如何保证数据的一致性就成为关键问题。

可以将数据分片的通用模型看作是一个二级映射关系。第一级映射是key-partition映射,即把数据记录映射到数据分片空间,通常,一个数据分片包含多条记录数据;第二级映射是partition-machine映射,把数据分片映射到物理机器中,即一台物理机器通常可以容纳多个数据分片。

在做数据分片时,根据key-partition关系,将数据水平切割成众多数据分片,然后再按照partition-machine映射关系,将数据分片存储到对应的物理机器上。而在做数据访问时,比如要查找某条记录的值Get(key),首先根据key-partition映射找到对应的数据分片,然后再查找partition-machine关系表,就可以找到哪台物理机器存储该条数据,之后,即可从相应的物理机器读取key对应的value内容了。

数据分片有两种常用策略:哈希分片与范围分片。对于哈希分片来说,因为其主要通过哈希函数来建立key-partition映射关系,因此,哈希分片只支持“单点查询”(Point Query),即根据某个记录的主键(key)获得记录内容,而无法支持“范围查询”(Range Query),即指定记录的主键范围,一次读取多条满足条件的记录。采取哈希分片的实际系统众多,大多数KV(key-value,键值)存储系统都支持这种方式。

与此相对应地,范围分片的系统则既可以支持单点查询,也可以支持范围查询。范围分片首先对所有记录的主键进行排序,然后在排好序的主键空间里将记录划分成数据分片,每个数据分片存储有序的主键空间片段内的所有记录。