前言
笔者在上一篇文章对分布式系统的概念和来由做了通俗简单的阐述,并挑出了分布式系统致力解决的两个主要问题:
- 单台机器运算能力不足
- 单台机器存储能力有限
这是系列文章的第二篇,阐述分布式系统如何将存储分布式化。为什么要先讨论单台机器存储能力有限的问题呢?举个可能不是特别恰当但能说明问题的例子:我们多个人一起吃饭的时候,是每个人都将饭盛到各自的碗里再吃,而不是大家一起直接拿着筷子从锅里夹着吃。机器要运算也一样,数据得先拿到本机上才能进行运算。
为什么会存不下
在讨论怎么将数据分散开存储,达成存储分布式化之前,我们可以先来思考一个问题:为什么单机会存不下数据?
“这是什么问题?那肯定是因为数据量大,一台机器装不下了呀。”
没错,但是即使如此,我们还是可以分情况来讨论数据量大的原因。
- 单个文件过大,比如一个视频文件可以占到几GB的容量。我们现在使用的服务器在容量方面绝不会吝啬,起码都要几十GB打底,所以单个或少数个大文件就把服务器塞满的情况很少。
- 文件数量过多。这个才是导致单机存不下的主要原因,单个文件即使再小,只要数量够多,总会塞满服务器的。
存储分布式化
以文件为单位分散存储法
所以,实现存储分布式化的思路之一就是以文件为单位,将所有待存储文件分布到各个机器上存储。比如规定每一万个文件存到一台机器:
任务完成了吗?看似OK,但还有问题,会不会出现数据倾斜问题呢?数据的分配依赖于分配策略,如果按照以文件为单位(每一万个文件存一份)的分配策略,就有可能出现数据倾斜问题——分配不均匀。
以文件为单位分散存储法优化
那怎么办呢?有办法,如果分配到的机器容量不足以存储,那就换一台机器存吧,或者说,在存储之前,先判断目标机器是否有足够的容量。
这个问题又被我们解决了,这种方法有什么不好的地方吗?有,服务器空间的分配变得不灵活了。
取我们上面的例子来说,有两台机器,容量分别还剩68G
和10G
。接下来第一次需要存储一批8G
的数据,先去找容量还有68G
的机器,可以存储,机器容量从68G
降到60G
,另一台机器不变;第二次需要存储一批61G
的数据,发现已经没有(单台)机器可以存储那么多数据了,但实际上,我们的所有机器剩余容量还有70G
,理应是可以容纳下后来的61G
的。
这时我们会想:要是第一次将8G
的数据存到10G
的机器上,就可以供第二次61G
的数据存到68G
的机器上了。
分治思想
以文件为单位,也就是将每一万个文件看作一份数据来分散存到机器上行不通,是因为即使每一份数据都包含一万个文件,但容量是可大可小不一致的,那么从这个角度来说,就可以有另一个思路:将每个文件拆分为若干个单元分散存储,每个单元都是同样大小(具体要拆分为多大需要看实际场景)的。也就是说,之前的“以文件为单位分散存储”变成了将文件拆分为若干个大小一致的单元的“以单元为单位分散存储”。
如此一来,只要机器总容量充足,文件的存储问题解决起来就容易多了。
存储OK了,那如果将文件拆分开存储,要取出使用时怎么办呢?答案是原路返回:先从各个服务器中取出目标文件拆分后的所有单元,再合并成一个文件。
这就是分治思想了。
当然,这是最简单且正常的情况,我们的实际生产中往往是问题百出,复杂的情况需要结合具体的场景来分析,另外,如何将文件拆分?拆分后如何确定各单元存到哪台机器?如何找到一个文件拆分后的各个单元?如何组装合并?诸如此类问题在本篇不是重点,故不做赘述。
总结
使用分治思想来实现存储分布式化
引出问题
分布式存储基于分治思想解决了单机存储能力有限的问题,那么分布式运算又如何解决单台机器运算能力不足的问题?下一篇文章再来聊一聊。