IBM用4V(Volume大容量、Velocity高速率、Variety多形式、Value高价值)来描述大数据。
IBM用4V(Volume大容量、Velocity高速率、Variety多形式、Value高价值)来描述大数据。
在大数据背景下,数据规模已经由GB级别跨越到PB级别,单机已无法存储与处理如此规模的数据量,只能依靠大规模集群来对这些数据进行存储和处理,所以系统可扩展性成为衡量系统优劣的重要指标。
数据量衡量单位:
1024KB=1MB;
1024MB=1GB;
1024GB=1TB;
1024TB=1PB;
1024PB=1EB;
1024EB=1ZB
(传统并行数据库系统)Scale Up 纵向扩展:不增加机器数量,而是通过改善单机硬件资源配置来解决问题。
(目前主流的大数据存储与计算系统)Scale Out横向扩展:通过增加机器数目来获得水平扩展能力。
Shard/Partition数据分片:将数据进行切分并分配到各个机器中。
Routing数据路由:数据分片后,如何能找到某条记录的存储位置。
对于海量数据,通过数据分片实现系统的水平扩展,而通过数据复制来保证数据的高可用性。
为了保证数据在故障常发的环境下仍然可用,需要将同一份数据复制存储在多处来获得保证。数据复制同时还能增加读操作的 效率,客户端可以从多个备份 数据中选择物理距离较近的进行读取,既增加了读操作的并发性又提高了单次读的读取效率。
1.1数据分片与路由的抽象模型
上图可看作是一个二级映射关系。
第一级映射是key-partition映射,将其数据记录映射到数据分片空间,这往往是多对一的映射关系,即一个数据分片包含多条记录数据。
第二级映射是paritionn-machine映射,其将数据分片映射到物理机器中,这一般也是多对一映射关系,即一台物理机容纳多个数据分片。
在做数据分片时,根据key-partition映射关系将大数据水平切割成众多数据分片,然后再按照partition-machine映射关系将数据分片放置到对应的物理机器上。而在做数据路由时,如要查找某条记录的值Get(key),首先根据key-partition映射找到对应的数据分片,然后再查找partition-machine关系表,就可以知道具体哪台物理机器存储哪条数据,之后即可从相应物理机读取key的对应value内容。
哈希分片和范围分片策略都可以映射到这个抽象模型上。对应哈希分片来说,因为其主要通过哈希函数建立key-partition映射关系,所以只支持“点查询”(Point Query):根据某个记录的主键(key)获得记录内容。而无法支持“范围查询”(Range Query):指定记录的主键范围一次读取多条满足条件的记录。
- 采用哈希分片的系统:Dynamo、Cassandra、Riak、Voldmort、Membase等
- 采用范围分片的系统:Google的BigTable、微软的Azure等
- 同时提供两种方式:Yahoo的PNUTS系统
哈希分片(Hash Partition)
1.Round Robin
就是俗称的哈希取模法,是实际中非常常用的数据分片的方法。设有台物理机,通过下面哈希函数实现数据分片:
对物理机进行从0到K-1的编号,对于以key为主键的某个记录,H(key)的数值即是存储该数据的物理机编号。
优点:实现简单
缺点:缺乏灵活性,若新增一台物理机到分布式存储系统,那么哈希函数就变成:
这样之前已分配的所有数据与存储该数据的物理机之间的映射关系就会被打乱。
2.虚拟桶(Virtual Buckets)
Membase(现更名为Conchbase)是一个内存分布式NoSQL数据库,对于数据分片管理,其提出了虚拟桶的实现方式:
Membase在待存储记录和物理机之间引入了虚拟桶层,所有记录首先通过哈希函数映射到对应的虚拟桶。记录和虚拟桶是多对一的映射关系,即一个虚拟桶包含多条记录信息;第二层映射是虚拟桶和物理机之间的映射关系,同样多对一映射,一个物理机可以容纳多个虚拟桶,其具体实现方式是通过查表来实现的,即Membase通过内存表来管理这层映射关系。
Membase的虚拟桶层其实就是“数据分片”层,一个虚拟桶即一个数据分片。key-partition映射采用哈希函数,partition-machine映射则采用表格管理。
优点:当加入新机器时,将某些虚拟桶从原先分配的机器重新分配给新机器,只需要修改partition-machine映射表中受影响的个别条目就能实现扩展,具有较强的灵活性。
3.一致性哈希(Consistent Hashing)
分布式哈希表(DHT)是P2P(Peer-to-Peer)网络(对等联网)和分布式存储中常见的一项技术,是哈希表的分布式扩展,即考虑在多机分布环境,每台机器负责承载部分数据的情形下,如何通过哈希方式来对数据进行增/删/改/查等数据操作的方法。DHT只是一种技术概念,具体的实现方式有很多种,一致性哈希是其中的一种实现方式。
上图是将哈希空间表示为长度为5的二进制数值(m=5)的“一致性哈希算法示意图。因为m=5,所以其哈希空间可以表达的数值范围为0~31,”一致性哈希“算法将哈希数值空间按照大小组成一个首尾相接的环状序列。对于每台机器,可以根据其IP和端口号经过哈希函数映射到哈希数值空间,这样不同的机器就成了环状序列中的不同节点,而这台机器则负责存储落在一段有序哈希空间内的数据,如N14节点就存储主键经过哈希后落在6~14范围内的键值数据,而N5节点就存储30~31以及0~5范围内的键值数据。同时,每个机器节点记录环中的前趋节点和后继节点地址位置,使之成为一个真正的有向环。
- 路由问题
通过以上方式,可以将海量数据分布到集群中的不同机器节点中,实现数据分片功能。在P2P环境下意味着没有中心管理节点,那么如何根据数据记录的主键以及哈希函数H来定位到记录内容呢?
一种高效率的查找方式,可以在每个机器节点配置路由表(Finger Table),路由表存储m条路由信息(m为哈希空间的二进制数值比特位长度,上面例子m=5),其中第i项()路由信息代表距离当前节点为的哈希空间数值所在的机器节点编号。比如对于图1-4例子中的N14节点,其对应路由表信息如下:
距离 | |||||
---|---|---|---|---|---|
机器节点 | N20 | N20 | N20 | N25 | N5 |
表中第3项代表与N14节点距离为4的哈希值(即14+4=18)落在N20节点上。同理第5项代表与N14节点距离为16的哈希值落在N5节点上。
有了路由表,假设机器节点接收到了主键为key的查询请求,如果不在的管理范围,则下面算法描述了其路由过程;
算法1 一致性哈希路由算法
输入:机器节点发起初始查询请求,查询主键key对应的键值,其中
输出:给出key对应的键值value,或者返回键值不存在的信息
算法:该算法通过不同节点之间发送消息来协作完成。假设当前执行操作的节点为,其初始值是,的后继节点为,重复执行下列步骤。
步骤1,判断是否,如果为真,则结束查找,说明key如果存在,则在上,所有发送消息给查找key的值value,将查询结果返回给(注:每个消息都包含消息源的相关消息)。
步骤2,否则,查找其对应的路由表,找到小于j的最大编号节点(如果所有路由表都大于j,则选择第m-1项路由信息内的数据作为),向发送消息,请求它代表查找key的值value,此时成为当前节点,继续按照步骤1和步骤2递归进行查找操作。
- 加入新节点时的情形
如果P2P网络中新加入一个机器节点,首先必须能够和目前P2P网络中任意一个节点建立联系,通过按照”路由问题”所述算法查询对应哈希值,可以找到的后继节点,假设的前趋节点为,那么为了能够将加入P2P网络,需要做下面两件事:
(1) 改变、和对应已经发生变化的前趋节点和后继节点记录,以体现新的网络架构。
(2) 数据的重新分片与分布,具体就是将节点中存储的应该由承载的数据(即节点上哈希值小于等于new的记录)迁移到节点上。
在非并发环境下以上事务较易完成,但是在并发环境下,可能在和之间同时有多个新节点要加入,此时为了保证不出问题,完成上述两个任务可以按照下两步操作:
步骤1:将的后继节点指向,前继节点置为空值NULL
步骤2:这一步并非专门为新加入节点设立的,而是所有节点周期性自动完成。这一步骤被称为稳定性检测(Stabilization),P2P网络中每个节点会定期执行,通过这个步骤可以完成前趋和后继节点的更新和数据迁移。对于节点来说,稳定性检测算法流程:
算法2 稳定性检测
- 步骤1,假设为的后继节点,向询问其前趋节点,向答复,一般情况下,如果这样则转步骤4
- 步骤2,如果介于和之间,记录下为其后继节点。
- 步骤3,令是的当前后继节点,其可能是也可能是,这取决于步骤2的判断结果。如果的前趋节点为空或者位于和它的前趋节点之间,那么给发消息告诉说就是的前趋节点,将其前趋节点设置为。
- 步骤4,把其部分数据迁移到,即将上哈希值小于等于c的记录迁移到上。
- 当节点离开P2P网络
正常离开的节点在离开前可以做些准备工作,例如通知相应节点更新其前趋和后继节点以及将本身持有数据迁移到后继节点上。
异常离开往往是机器故障导致,此时故障机器保持的数据可能丢失,为了避免这个额额问题,可以采用将同一份数据在多个机器上保留副本的方式。
- 虚拟节点
上述一致性哈希算法有两个潜在问题:机器节点映射到环状结构的位置是随机的,所以可能会导致机器负载不均衡;另外,在大规模数据中心中,机器异质性很常见,既有高性能、高配置机器,也有老型号的低配置机器,一致性哈希并未考虑这个问题,将所有机器平等看待,所以可能存在低配置机器高负载的情况。Dynamo对一致性哈希进行改造,引入”虚拟节点“概念,将一个物理节点虚拟成若干虚拟节点,分别映射到一致性哈希的环状结构不同位置。
范围分片(Range Partition)
范围分片首先将所有记录的主键进行排序,然后在排好序的主键空间里面将记录划分成数据分片,每个数据分片存储有序的主键空间片段内的所有记录。在实现具体存储系统时,往往保持一个数据分片的映射表,记录表每一项记载数据分片的最小主键及其对应的物理机地址(如上图)。在对记录增/删/改时,查找映射表中就可以找到对应存储这个记录所在的数据分片的物理机,至于数据分片在物理机的管理方式往往采用LSM树。