e-works数字化企业网  »  文章频道  »  基础信息化  »  大数据

分布式数据库的存储设计改进

2017/10/10    来源:网络大数据    作者:佚名      
关键字:分布式数据库  存储  
对比下分布式数据库,如果把记录对应的节点信息发送给 Master,那就不可想象了。所以在分布式数据库中 hdfs 的存储策略不可取。
    背景
 
    在一次游泳的时候,想起一个问题,为什么 hdfs 的 namenode 没有存储块的对应节点信息,导致启动 hdfs 的时候,datanode 需要扫描所有的数据块,再将该 datanode 上的块信息发送给 namenode,namenode 才能构建完整的元数据信息。根据文件和数据块的多少,启动 hdfs 的时候需要几分钟到几个小时。
 
    对比下分布式数据库,如果把记录对应的节点信息发送给 Master,那就不可想象了。所以在分布式数据库中 hdfs 的存储策略不可取。同时最近一直被目前的分布式数据库的存储上有几个问题困扰着:
 
    在节点数固定的时候,Hdfs 的数据是根据机器负载来决定存储在哪个节点上的,这样做的好处是数据平均分布,可以根据机器的存储大小加权平均,并且依据机器的负载情况动态调整;目前分布式分布式数据库中做的很有限,该如何改进呢?
 
    添加新节点的时候, Hdfs 配置好新节点指向的 namenode,然后启动新节点即可,存储过一段时间会收敛到平均,如果想加入后马上使得数据平均分布,可以执行 rebalance 操作;而分布式数据库添加节点的时候,配置好新节点指向的 Master,然后启动新节点之后,通常还需要根据分布的规则进行数据重新分布,甚至规则也可能需要进行拆分合并扩展等修改,分布式数据库能做到什么程度,如何做? 当然如果能做到数据重新分布,rebalance 的操作也就可以加入到分布式数据库中,两者是共通的,都是做数据的移动,数据重新分布关注过程,rebalance 关注结果。
 
    Hadoop 中的 hdfs 和分布式数据库的对比
 
    在进一步的讨论如何改进分布式数据库的存储之前,先看看分布式数据库和 hadoop 中 hdfs 的对比。
 
  Hadoop 中的 hdfs 和分布式数据库的对比
Figure 1:分布式数据库的架构
 
  Hadoop 中的 hdfs 和分布式数据库的对比
Figure 2:hadoop 中 hdfs 的架构
 
    前面提到分布式数据库中把记录对应的节点信息上报给 master 是不可行的方案,这里其实是一种夸大的对比,两者中的概念按照如下的类比更加合适:
 
  Hadoop 中的 hdfs 和分布式数据库的对比
 
    从以上的对比可以看出,如果分布式数据库的节点如果和 datanode 一样,能够在启动的时候扫描该实例上的表信息,上报给 master,那么分布式数据库的做法就可以和 hadoop 中的 hdfs 方式一样,即表的分区随机分散在 dbnode 上,这样元数据的大小也不会特别大。但我们需要注意到这种随机的方式,使得读写数据的时候,客户端需要知道数据位于哪个或者哪些节点,这样对已有数据的读写需要经过两步,首先请求 master 数据位于哪个节点,如 hadoop 中 hdfs 需要向 namenode 请求读写数据所在的 datanode 信息,然后在向 datanode 发送读写命令;如果数据是有规则的分布在节点中,那么可以将这些规则信息存储在客户端中,避免读写操作频繁请求 master,这对高并发的场合非常有效。所以这篇文章我们还是抛弃随机的分布,采用有规则的方式来讨论分布式数据库的存储。
 
    核心思想
 
    从存储架构和概念上看这两者非常的相似,甚至都可以归一化了,所以分布式数据库的 sql 计算也可以借鉴 hadoop 中的 mapreduce 计算模型,这篇文章主要讨论存储的改进,为计算打好基础;从上面的背景和问题可以看出,hdfs 有缺点,也有优点;目前的分布式数据库有不足,也有比 hdfs 做的好地方;这篇文章基于这些优缺点,带着这些问题,采众家之长,对目前的分布式数据库的存储进行了分析和改进,为基于分布式数据库的分布式 sql 计算能够更好的利用 hadoop 生态圈中的 mapreduce,spark 等分布式计算模型打下良好的基础。
 
    从上面的问题中,经过思考可以发现,分布式数据库的数据是不能随机分布的,是必须有规则的,但是规则需要能够动态调整,才能解决以上问题,同时没有 hdfs 启动扫描数据块导致启动时间过长的问题。正因为规则是需要能够动态调整的,所以需要采集数据库节点的负载情况,因为这是规则动态调整的依据。下面就具体分析如何做,有哪些方式可以做。
 
    负载情况
 
    需要采集的负载数据,大概包括如下方面:
 
    机器的 cpu,内存使用,io 情况,网络流量,磁盘存储大小等
 
    数据库的存储大小,qps,tps,慢查询,锁,临时表,连接数等
 
    这些指标中比较关键的指标任何一个超过了它的阈值,这节点就不可以再插入数据,每个指标的阈值根据机器的配置决定;
 
    下面给出一个指标的阈值例子,如下表所示:
 
  Hadoop 中的 hdfs 和分布式数据库的对比
 
    通过这只指标可以计算一个值 db_node_load(0<=db_node_load<=1,0 表示没有负载,1 表示负载已满),并且设置一个阈值 insert_load_threshold,db_node_load 小于 insert_load_threshold 的时候,这个节点是可以插入数据的; db_node_load 大于等于 insert_load_threshold 的时候,这个节点是不可以插入数据的;这里只考虑了插入;对于删除,都必须在这个节点执行;对于更新,如果更新前和更新后的数据都在该节点上,也必须在这个节点执行;如果不在同一个节点,那么在当前节点删除,重新按照规则加负载情况选择一个新的节点进行插入。计算 db_node_load 的公式是每个因素的当前值除以该因素的最大值的加权平均,指标的最大值根据机器的配置决定,各个指标的所占比例的例子如下:
 
  Hadoop 中的 hdfs 和分布式数据库的对比
 
    那么 db_node_load = 20%*300/600+8%*5/100+20%*10/100+2%*80/100+20%*200/500+10%*1000/10000+10%*50/1000+10%*2/50=0.239
 
    数据分布规则
 
    所谓的分布规则,包含两个要素
 
    分割字段,也叫均衡字段, 存储数据的时候决定将数据插入分布式表的某个节点的依据字段,可以是一个或者多个有顺序关系的字段,字段可以是数字,也可以是字符串,字符串通常转换为数字;如常用的用户 id
 
    分割方法,也叫均衡策略, 存储的时候决定如何根据分割字段将数据插入分布式表的某个节点的方法,如列表,范围,取余
 

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐