数据密集型应用系统设计--数据分区

数据分区与数据复制

分区的目的一般是提高可扩展性、容错性和集群吞吐,同一个分区会在多个节点中都有副本。

  • 容错性:一个节点挂掉,则这个节点上的分区,在其他节点上都有副本,可以查询其他的节点
  • 可扩展性:新增节点时,会有多个节点把自己的部分数据给新的节点,这些节点传输的数据比较少
  • 提高集群吞吐:数据和查询复杂会均匀的分配在所有的节点上

键-值数据的分区

一般来说,数据分区都是通过特定的key来检索对应的value,因此k-v分区是最主流的方式。

关键字区间分区
每个分区负责一个或者多个关键字区间,一般根据关键字区间值的数量和分区的个数决定。分区内部的关键字可以按照字典序等排列。这种方式的索引效率很高;缺点在于,某些访问模式下,一些key会成为热点,导致负载不均衡。

关键字哈希值分区
每个key对应一个唯一的hash值,然后通过对hash值取余等,映射到对应的分区上。优点在于可以均匀的分配key到对应的区间上,但是丧失了区间查询的特性。mint存储就是这种模式,不过每个分区都有多个对等的副本。

注意一致性Hash技术

组合索引分区
综合关键字&Hash分区的特性

负载倾斜和热点问题
某些情况下,会存在部分key的热点问题,这种一般在应用层解决。比如微博的大v有很多粉丝等。这种情况下,简单的技术是,对关键字的开头或者结尾添加一个随机数,这样写的时候,就可以把key均匀的分布到不同的节点中;但是缺陷是,查询的时候需要查询 1 0 N 10^N 10N个关键字, N N N是关键字的位数。

分区与二级索引

二级索引:对于非主键的内容建立的索引。二级索引带来的挑战主要是它们不能规整的映射到分区中。

基于文档的二级索引技术,mongodb等在使用,暂时不做深入研究,基本理念是

基于词条的二级索引分区
对于每个分区,建立对应的词条索引,然后异步更新对应的索引。

kv模型很少涉及到二级索引。

分区再平衡

背景:

  1. 查询压力增大,需要更多的机器分担负载
  2. 存储空间需求增加,需要更多的存储介质
  3. 节点可能出现故障,需要其他节点来接管当前的节点

分区再平衡的要求:

  1. 负载、存储&读写请求等,需要更加均匀地分布在集群地节点中
  2. 再平衡地过程中,集群应该正常提供服务
  3. 避免不必要的迁移,加快速度,减少对网络和磁盘IO的影响

之前介绍的取模策略,虽然简单,但是对动态分区再平衡不友好。因为一旦机器的总数发生变化,会导致Hash发生偏移,涉及到大量的数据迁移。

给出几个减少数据迁移的方法,分别介绍。

固定数量的分区
在创建集群的时候,确定总的分区个数,比如说是1000。假设集群有10节点,那么每个节点会分担100个分区的存储。如果新增加一个1节点,那么每个节点会分给新的节点部分分区,直到全局再平衡。

该策略的局限性:

  1. 在开始的时候,就需要固定好分区的总数。如果业务要求的分区是高度不确定的,那么该方式不容易确认分区数量
  2. 每个分区的size需要均匀,如果有分区过大或者过小,则加重再平衡的负担

动态分区
HBase的方式,分区先分配给一个节点,当分区的数据超过一个可配置的参数值时,其拆分成两个分区,每个分区承担一半的数据量。如果涉及到大量的分区删除,则会合并有关的分区。具体参考HBase的方式。

请求路由

一般这属于服务发现的问题,借助zk&etcd等都可以实现。具体技术参考zookeeper等的技术手册即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值