副本模式的 block 放置策略
概览(以三副本为例)
冗余原则
-
机架级别冗余性
以三副本为例,3副本理想情况下需要两个机架,以达到机架冗余,这样的话,任意挂掉一个机架,都不会导致数据丢失。当然,如果机架数不足(例如只有一个机架),那也只好放置在同一个机架下面,此时就失去了机架级别的冗余性。 -
节点级别冗余性
DN 级别的冗余是底线,同样以3副本为例,对3副本,是一定要放置在3个不同 DN 上的,绝对不能将2个或2个以上的副本集中在同一个 DN 上。当然,如果集群中没有三个 DN,那么此时该 block 将不能达到3副本,而是只能以低副本存储,这是一个非常危险的情况。
具体放置策略
- 第一个副本
尽量放置在客户端本机上,如果本机不是 DataNode,则尽量选择本机所在机架上的任意一台 DataNode,如果还是选不到,则随机选择一个 DataNode。 - 第二个副本
尽量在和第一个副本不同的机架上,选择第二个 DataNode。 - 第三个副本
尽量在和第二个副本相同的机架上,选择第三个 DataNode。 - 第四至第 N 个副本
在集群中随机选择即可。 - 要点
可以看到,多副本方式并不追求把所有副本尽量分布在尽可能多的机架上,实际上,只是尽量保证前三个副本分布在两个机架上,后面的副本都是随机分布的。
EC 模式的 block 放置策略
以 6+3 的 EC 为例,如果简单类比的话,可以认为一个 EC block 实际上有9个副本,其中6个数据副本,三个校验副本(当然,此“副本”非彼“副本”,这里每个“副本”的数据是完全不同的)。在实际放置过程中,EC block 的副本实际上更多的是以机架为单位放置的,这是和多副本模式的最大不同。
概览(以 6+3 的 EC 为例)
冗余原则
-
机架级别冗余性
一共9个副本,每个副本数据都不相同,那么理想情况下,自然是放置在9个完全不同的机架上,这样的话,最多容许挂掉3个机架。同样地,如果集群中并没有那么多机架,那么只好尽最大努力,选择尽量多的机架了。特别需要注意的是,如果某个机架上存放了超过3个副本,那么一旦这个机架挂掉的话,整个 block 将无法还原,导致数据丢失。
-
节点级别冗余性
同样,如果说机架冗余性还有商量的余地,允许同一个机架上保存多个副本的话,那么 DN 级别的冗余性就毫无商量余地了,绝对不允许将两个或2个以上的副本集中在同一个 DN 上。换句话说,对于 6+3 的 EC,如果想要达到标准的 3 冗余,那么至少需要9个 DN,其中 6 个 DN 保存基本的用户数据,剩下 3 个保存校验数据。如果集群中没有那么多 DN,那该 block 就处于一个低冗余的状态,也是比较危险的,详见下表:
DN 个数 是否能进行写操作 冗余度 <6 还不够保存基本的用户数据,无法进行写操作 Null 6 可以写入,但只够保存基本的用户数据,没有 DN 用来保存校验数据,冗余度为 0 0 7 可以写入,在基本的用户数据之外,剩余一个 DN 可以用来保存校验数据,冗余度为 1 1 8 可以写入,在基本的用户数据之外,剩余2个 DN 可以用来保存校验数据,冗余度为 2 2 9 可以写入,在基本的用户数据之外,剩余3个 DN 可以用来保存校验数据,达到标准冗余度 3 3
具体放置策略
-
尽可能选择 9 个机架
如上所述,为了达到机架冗余,选择尽可能多的机架(最理想就是选到 9 个)。这就要求理想情况下,集群中最少有 9 个机架。 -
以机架为单位均匀分布副本
不管最终选择了多少机架,都以机架为单位,尽量把所有9个副本均匀分布,防止某个机架挂掉之后,带走过多的副本。特别注意,如果某个机架的 DN 个数明显少于其他机架,那么由于机架的均匀分布策略,会导致这个机架上 DN 的存储空间快速耗尽,和其它机架的 DN 形成显著差距,并且,这个对 balance 均衡过程也是一样的。这个地方是和3副本模式最大的不同,在3副本模式下,并不会对机架如此关注,更不会以机架为单位均匀分布数据,这里一定要特别注意。
DN 使用率严重不均问题与解决方案
如上所述,EC block 的分布指导思想是:尽量将一个 EC block 的所有副本(包括数据副本与校验副本),均匀分布到尽可能多的机架上。举个例子,对于一个 6+3 的 EC block:
- 首先,它希望将该 block 的所有9个副本,尽可能分布到9个机架上(此时每个机架选择一个 DN),这是理想情况。
- 退一步讲,如果机架没有9个,那也尽可能将9个副本均匀分布到每个机架,并保证各个机架上的副本个数,差距不超过1。
在实际使用中,由于 HDFS 集群都比较大(单集群1000台 DN 左右),每个集群都可能会包含许多机架,很难保证这些机架上的 DN 个数都是大致接近的,实际上各个机架的机器个数有可能差距很大。在这种情况下,按照 EC block 的分布策略,它忽略了每个机架的具体大小,只求各个机架均匀分布,那么必然造成小机架使用率过高,大机架使用率过低。
为了解决这个问题, 可以新增一个控制参数,用于控制 NN 是否在各个机架间随机选择 DN,而不是一味地要求各个机架间的均匀(默认应为 false,即依然按照社区的策略来)。需要注意的是,如果开启了这个选项,那么大机架上将会分布更多的 EC 副本(极端情况下,一个 6+3 的 EC block,它的所有9个副本都可能位于同一个机架上,此时如果这个机架整体挂掉,那么相关的 block 会立刻 missing。但实际上,根据 Java 伪随机算法的保证,这种情况并不会出现)。
网友评论