如果你对分布式存储这方面感兴趣的话,请放弃对传统RDBMS数据库的幻想,要学着拥抱NoSQL。

分布式存储这块其实说起来,就是这几部分:数据如何写入、数据如何查询、数据分片方法和数据副本方法。

分布式集群系统中大多数的分布式存储系统都拥有着非常优异的写入能力,我就说说分布式文件系统和分布式K/V数据库的写入场景。

分布式文件系统(DFS)

DFS中商业支持比较好的有Hadoop HDFS、GlusterFS、MooseFS等。对HDFS的商业支持最为广泛,例如:cloudera,HDFS之父应该还在那里上班,GlusterFS是Redhat的嫡系,MooseFS主要来自于波兰一家商业公司的支持。

DFS的特征就是以封装成小块的形式顺序的写入较大的文件块,在小块写入的过程一般都会进行多副本节点的复制,复制方式上HDFS和MooseFS都通过管道形式,节点自上而下顺序复制,而GlusterFS是去中心化通过Hash共识,因此GlusterFS的副本卷都是由客户端完成复制。DFS的写入因为是二进制顺序的方式,不构建任何索引,因此写入文件的速度会非常快。

DFS在写入过程中一般默认都是三副本,但是HDFS和GlusterFS都不约而同的支持了EC冗余方案,类似于Raid5、6,可以在满足高可靠的情况下,提升存储利用率,从33.3%提升到66.7%及以上。

写入的文件块都需要元数据来组织成文件树,不同之处在于HDFS、MooseFS这种中心化的DFS,会对写入的元数据描述都交给主节点来管理,因此就有了HDFS的NN,MooseFS的MFS Master,但是GlusterFS是去中心化的方式,它的元数据存在于不同Brick节点文件目录的属性中,因为是去中心和结构,就需要大量依赖客户端通过Hash共识机制,根据不同文件目录的属性创建和组织文件树。

最后有一点就是对Linux内核FUSE机制的结合上(包括:大部分Unix系统),MooseFS、GlusterFS可以无缝对接,这就在客户端形成了普通文件目录访问的便利性,但是HDFS仍需要通过HDFS客户端命令实现模拟的文件目录访问。

分布式K/V数据库

分布式K/V数据库大多数都是基于LSM-Tree的数据模型,我们就简单说一下:HBase、Cassandra和InfluxDB的写入场景。

HBase

HBase完全参考Google BigTable论文实现了分布式CP系统,强调写入的强一致性,Cassandra部分参考了Google BigTable论文中的数据模型,在分布式方面则完全参考了Amazon Dynamo,强调读写的最终一致性;InfluxDB属于专业的时序数据库(TSDB),数据模型参考LSM-Tree,根据时序数据特性,创造了TSM数据模型,在分布式方面的数据读写与复制方面非常类似Cassandra的去中心化方式,但仍是在此基础上针对时序进行了优化,InfluxDB是弱一致性。详细可以参考我写的另外两篇:

HBase 与 Cassandra 架构对比分析的经验分享

深入浅出:了解时序数据库 InfluxDB

HBase的写入首先需要在Meta中寻址定位,客户端通过写入数据的行键找到对应的Region,通过Region找到所在的RegionServer节点,当该Region写得足够多以至于达到设定阀值后,Region就开始拆分(Split),通过Region的拆分实现子Region向多个RegionServer节点的数据分布。因此HBase看起来总是顺序的,并且对于某个列簇,即便拆分成了多个Region,但总是朝唯一的Region写入,并且写入过程保证了行级事务,这是HBase在分布式环境下强调写入的强一致性的根本所在。

Cassandra

Cassandra是去中心化的分布式K/V数据库,侧重分布式AP,强调高可用。大家一定记住,只要是去中心化的集群,基本上都离不开Hash共识算法,需要用此方式来实现数据的分布。Cassandra在写入过程中客户端可以连接任意一个节点,该节点就作为协调节点,每个协调节点都有一份整个集群的令牌环(Token Ring),这个Token就是一致性哈希算法组成的逻辑环,在环上布满了虚拟令牌,通过虚拟令牌与集群节点的交错映射,就优雅的实现了写入数据在不同节点的均匀分布。协调节点通过复制策略,在令牌环上顺时针逐一放置副本数据。

上述HBase和Cassandra都是LSM-Tree机制,先写入内存和WAL,WAL用于内存崩溃恢复,内存定时或者达到阀值在Flush到磁盘到SSTable,SSTable定期进行合并成更大的SSTable,用于去重和删除过期数据,也便于提升查询效率。

InfluxDB

InfluxDB基于TSM结构,这种结构也是LSM-Tree的大体机制,有Cache,WAL和TSM文件。不同之处在于数据结构上按照了时序(TS)的形态,时序的一个数据点的结构是:数据源(标签集合)+指标+时间戳,对应一个点的数据,InfluxDB对这种结构做了优化,实现了数据源(标签集合)+指标(字段)作为主键对应了一组大量连续的TimeStamp:Value,这样TS也好方便压缩(delta-delta算法),Value也方便压缩(基于不同数据类型压缩)。那么Influx可以做成什么效果呢?单机就能轻松应对超大规模的时序吞吐,而存储的TSM文件还非常奇妙的小巧。

另外InfluxDB在分布式方面更侧重AP,保证高可用,和Cassandra如出一辙的使用hint-handoff机制,来暂时屏蔽故障副本节点,由当前协调节点临时代存数据,满足极端情况下,面对客户端的写入仍能正常进行。

InfluxDB的特色在于针对时序的分布式设计:用连续的间隔时长作为一个时间范围,叫做ShardGroup,例如1小时作为一个时间分组,那么这1小时的写入数据,再通过Hash取模的方式分布在不同的节点上。分片数量=集群数量/副本因子,例如4个节点的副本因子是2,那么就有2个分片,当每次写入时,Hash定位到1个分片,就等于需要复制到这个分片所属的2个节点。这样就非常适应时序结构的需要,从而实现了从时间范围分布到Hash分布的层次设计,使数据按照TS为主线均匀的分布在集群的不同节点。


守护石 「技术创作」
关注领域:大数据技术、分布式架构 | 技术管理http://www.readbyte.com/

学习分布式存储应该从哪几方面着手?相关推荐

  1. 让学习linux变成一种习惯

    无论学习什么技术,都是从小白开始,没有大佬是天生会Linux的,你羡慕的那些大佬,都是通过不断的刻苦学习从而蜕变成大佬的.由于需要解决生存问题,加上我也对Linux比较有兴趣,所以就打算从事故事Lin ...

  2. 入坑机器学习?送你一篇麻省博士的学习心得

    [导读] 随着人工智能技术的火热,越来越多的年轻学者正准备投身其中,开启自己的研究之路.和所有其他学科一样,人工智能领域的新人总会遇到各种各样的难题,其中不仅有研究上的,也有生活方面的.MIT EEC ...

  3. 为什么月薪2万的大数据职位都必须学习Python?

    马云说:"未来最大的资源就是数据,不参与大数据十年后一定会后悔."毕竟出自wuli马大大之口,今年二月份我开始了学习大数据的道路,直到现在对大数据的学习脉络和方法也渐渐清晰. 我们 ...

  4. 学习区块链要掌握哪些专项能力?区块链学习培训多长时间?

    2017年在北京举办的"一带一路"国际合作高峰论坛,沿线的20国青年评选出了他们心目中中国的"新四大发明":高铁.支付宝.共享单车和网购.而在这"新四 ...

  5. 区块链是什么?区块链能做什么?区块链学习路线分享

    2017年区块链在某些领域的应用已经相当成熟,比特币(加密数字货币),以太坊(区块链开发平台),超级账本(面向企业的分布式账本平台).也有一些处在起步阶段的应用(智能合约,证券.资产管理,公证防伪,知 ...

  6. 新手如何学习UG,初学UG编程的快速…

    新手如何学习UG,初学UG编程的有什么快速入门方法.也许你学习软件时不知道该从哪里着手学起.这里,小编总结以往学习UG编程时的经验.告诉新手,学习时,一般先学习三维造型,由于UG命令多,因此,需要不断 ...

  7. 杭州java程序员好找工作吗,学习路线+知识点梳理

    前言 我们在执行Sql之前,需要先获取SqlSession对象,但是我们也提到了SqlSession下面还有四大对象,所以SqlSession只是个甩手掌柜,真正干活的却是Executor等四大对象: ...

  8. 分布式存储 HDFS原理

    大数据基础知识 一.什么是大数据 短时间内快速产生的海量的多种多样的有价值的数据. 大数据的技术: 1.分布式存储: 2.分布式计算: 1)分布式批处理: 当数据积累一定的时间后(假设一个月),进行统 ...

  9. java框架学习路线总结

    已经大三的我是一路自学过来的,不能说学校教的没用,但要想真正地提升自己还要额外画出很多的时间去学习别的技术.java基础学习完的我,现在开始着手准备学框架了,下面我总结一下如何学习后端java web ...

  10. 会C语言学go难吗,经验之谈:学习Go语言的利与弊

    在这个竞争越来越烈的社会,掌握一门新语言或新技能,意味着你能比别人多一个机会. 但万事开头难,学习新东西亦如此.如果开发员想学一门新的编程语言,该选择什么呢? Go语言学起来简单得令人惊讶 当我第一次 ...

最新文章

  1. 【实用】面对枯燥的源码,如何才能看得下去?
  2. 网络营销推广软件教你学会单页面SEO优化技巧,轻松赢流量!
  3. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)
  4. python获取绝对路径_python3中获取文件当前绝对路径的两种方法
  5. python学习日记day2
  6. mysql avg 时间_MySQL或Rails在特定日期范围内每天获得AVG的最佳方式
  7. Spring MVC的web.xml配置详解(转)
  8. phpstorm一个窗口打开多个项目
  9. leetcode5. 最长回文子串(动态规划)
  10. 学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...
  11. 可以伪装mysql子节点框架是啥_kingbus 架构设计之如何伪装成 MySQL Master 角色
  12. jquery remove() empty()
  13. 树莓派4支持多大tf卡_陪你一起玩树莓派-系统安装
  14. oracle-手动锁表
  15. EXCEL拆分单元格代码
  16. 基于java的论文查重系统设计
  17. 温州商学院计算机二级office考试时间,全国计算机二级最新报名通知,注意报名时间,千万别错过!...
  18. linux格式化磁盘fdisk,linux下使用fdisk工具为磁盘分区格式化
  19. 进化算法的产生与发展
  20. C语言_malloc动态开辟内存空间

热门文章

  1. 13岁残疾、35岁离异……43岁这年她将和全球最美王妃同台……
  2. php创建数组填充数组的方法
  3. 贝塔自助授权系统php源码,贝塔自助授权系统v1.1
  4. 独立院校转设,高考新生何去何从|转设对新生有哪些影响
  5. you-get遇到的坑
  6. 原创玄幻小说--那时花开--第一章前序
  7. JavaWeb综合案例——商品后台管理系统
  8. kaggle初探--泰坦尼克号生存预测
  9. Protobuf协议格式详解
  10. spring Clound EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEW