无论是实时的数据采集,还是先本地存储隔段时间再发送的数据采集,其最终的数据都要进入到仓库之中。我们通常说的数据存储的仓库称之为数据库,在大数据时代,传统的数据库已经容纳不下这么海量的数据。一方面数据太多,库太小装不下;另一方面,数据在库中堆积起来,要是随时出货找起来太费事,需要一个更加宽松的大仓库能够有序码放,从而更加容易的找到所需要的数据。在现在,数据一般是被存储在了一个叫做hadoop的分布式机器上。
何为分布式?为什么又需要分布式呢?分布二字拆开来看,可以这么理解,“分”就是分散,“布”及时排布,连起来看分布式就是将数据分散的排布在不同的各个仓库中。这里需要补充的一点是,尽管我们之前使用了土方来打比方数据,但是两者还是有本质的区别。土方一块就是一块,它如果放在仓库a中就不会放在仓库b中,但是数据可以被复制,如果它放在了仓库a中,我同时也可以把它复制一份放在仓库b中,这样即便a中的数据找不到了,我也可以在b中找到。这下,你总算看到了数据分布存放的好处了吧,就是方式数据出问题,说的文绉绉的就是数据的灾备。
是否只需要把数据放到相应的仓库中就完事了呢?当然不是,我们还需要能够知道什么数据放在哪里。为了达到这个目的,我们需要建立一个账本,这个账本也是一个字典,通过查询这个账本或者字典,你就知道什么数据存在哪些仓库,某个仓库又有哪些数据,然后按图索骥再去找到数据就可以了。
现在让我们做一个简短的总结,我们这里涉及到了三个对象,我们称他们为存储的三兄弟,因为每次存储的过程都需要他们三个协作完成。首先是数据的递送者,他负责把数据运送来,然后是数据的分配者,他负责记账,来了多少数据,都入了哪些库,再者就是数据的存储者,他们负责实实在在的看好分配给自己的数据。
既然三兄弟各司其职,是否只需要各守一方即可呢?然而并不是这样,在存储的过程中,他们三个需要高度的配合。对于他们来说,典型的配合场景有三种,一曰存储数据,二曰取出数据,三曰数据容错。下面我们就来分别看一看这三种典型的场景中存储三兄弟是如何配合的。
存储数据
一个数据到来之后,它需要经历的典型过程可以概括为“切、备、分、传、关”。切指的是数据到来之后需要进行切分,譬如某一类的数据应该放在一起,而另外一类的数据应该放在一起,除此之外,仓库中摆放数据的货架大小有限,因而数据也需要被切分成可以被放在货架上的大小,这大致是通过限制数据文件占用磁盘的大小来控制的(例如64mb等)。备即备份,为了防止数据丢失,于是要将一份数据同时拷贝成三份,这也是分布式存储的意义所在。分即分配,这些数据已经备份好后就可以在账本上记账了,实际等于给数据在账本上分配了一个位置。分配好数据之后,只需要按照这些分配好的位置,把数据一个一个的按照顺序送到应该去的仓库即可。最后只需要把仓库的门关上,保证这些数据的安全即可啦。
取出数据
数据已经在库中了,如果需要找到某个数据并且取走,那么其典型的过程则可以概括为“请、查、传”。所谓请,就是得去请求账本的保管员,让他帮忙查找你所需要的数据;接下来管理员从账本中查找到了你所需要的数据信息,这个信息中包含了数据所在的位置以及大小等信息;最后你拿着这样的信息,到指定的仓库前取数据,仓库的管理员会将数据传送给你。
数据容错
上面无论是存数据还是取数据,都是在没有错误发生的前提下进行的,那么现在问题来了,什么情况会妨碍你完成上面的两种行为呢?这样的情形我们就称之为数据的错误。而针对这样的错误采取的措施就是容许错误存在的保障措施,简称“容错”。
情况一是当某个存储数据的仓库烧毁了,对应到现实情况下可能是存储数据的服务器物理性的损坏,当一个人拿着查询账本中的信息来到仓库前准备取数据的时候发现仓库压根就不存在了,相比内心是无比的蓝瘦香菇呀。为了解决这种情况,各个仓库的保管员需要隔一段时间(定时地)向保管账本的人汇报一次,以表明其仓库还是完好无损的。只要账本管理员得到他们的汇报就可以不动账本,一旦发现某个仓库管理员在该汇报的时间还没有汇报,就会认为这个仓库已经有问题了,于是乎就要采取一些措施进行补救,例如将本来存在这个仓库里的数据转移到其他仓库中。你可能会问仓库都不存在了,怎么转移这个仓库中的数据呢?别忘了,数据是进行拷贝备份了的,于是只要知道这个仓库中是哪些数据就可以从存有这些数据的仓库中再次拷贝并进行备份了。这种容错的方式学名叫做心跳报送。
情况二中的仓库没有问题,而且取数据的人已经到了相应的仓库门口,这个时候你把需要取的数据告诉仓库保管员,保管员就进去找。可是左等也不来,右等也不来,有可能保管员在查找过程中睡着了也不一定,于是你只能宣布这次取数据的经历失败。为了保证不出现这样的问题,你把需要取数据的信息给保管员还不行,这最多只能算取数据的过程完成了一半,除此之外,还需要等到保管员把数据拿到你面前亲手递送给你,才算是真正确认了这个取数据过程已经完成了。
情况三是保管员取到的数据并不是你要的数据,或者是你要的数据可是已经损坏,这个情况下可以通过检查数据中的防伪码(其实是校验码)来确认保管员取到的内容是否是你要的。