Java开发大型互联网-深入剖析分布式储存系统应用实践

http://www.broadcast.hc360.com2017年12月18日17:29 来源:Java小雷哥T|T

    【慧聪广电网】分布式系统(distributedsystem)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。 

    分布式文件系统

    GFSGoogle文件系统

    提到分布式文件系统,当然首推GFS了。GFS是Google分布式存储的基石,所有的神器都是建立在分布式存储之上的,如GoogleBigTable,GoogleMegastore,GooglePercolator,MapReduce等。

Java开发大型互联网-深入剖析分布式储存系统应用实践

    GFS系统节点可以分为三种角色:GFSMaster,GFSChunkServer,GFSClient.

    GFS文件被划分固定大小的数据库,称为Chunk,由Master分配一个64位全局唯一ID;ChunkServer(CS)以普通Linux文件形式将chunk存储在磁盘,为了HA,Chunk被replication,默认3份。

    客户端访问GFS时,首先访问Master,获取CS信息,之后再去访问CS,完成数据存取。GFS目前主要用于MapReduce,Bigtable.

    租约机制(Lease)

    GFS追加的记录大小从即是KB到几十MB不等,为了避免Master变成系统瓶颈,GFS引入了租约机制,即将Chunk的写操作授权给ChunkServer。拥有租约授权的CS称为主ChunkServer。在租约有效期内,如60秒,对该chunk的写操作都由主CS负责。主CS也可以在租约到期后,不断向Master提出续约直到Chunk写满。

    一致性模型

    GFS支持一个宽松的一致性模型,GFS从相对需求以及简单化层名考虑,设计成主要是为了追加append而不是为了改写override的架构,如我们了解的

    HBase。

    看一下记录追加的流程:

Java开发大型互联网-深入剖析分布式储存系统应用实践

    1)客户端向Master请求chunk每个副本所在CS

    2)Master返回客户端主副本和备副本所在CS位置

    3)客户端将追加记录发送给每一个副本,CS会内部LRU结构缓存这些数据

    4)当所有副本都确认收到数据,客户端接着发起一个请求控制命令给主副本

    5)主副本把写请求提交给所有副本。

    6)备副本成功完成后应答主副本。

    7)主副本响应客户端。

    其中,分为控制流与数据流。

    容错

    1)Master容错:

    与传统类似,通过操作日志加checkpoint来进行。

    2)CS容错:

    采用复制多个副本方式。

    从GFS的架构可以看出,GFS是一个具有良好可扩展能力并可以自动处理各种异常的系统。Google的系统已开始就考虑了如河水平扩展,所以后续的系统能够站在巨人的肩膀上,如Bigtable建构在GFS之上,Megastore,Spanner又在

    Biigtable之上融合了关系型数据库的功能,整个方案华丽,完美。

    另外,Google的成功经验反过来证明了单Master是可行的,简化了系统同时实现了一致性。

    分布式键值系统

    分布式键值类似于分布式表格模型Bigtable的一种特例。比较著名的有AmazonDynamo,Memcache以及国内阿里的Tair系统。

    前两天有伙伴提到Tair,那我们就以Tail来聊聊吧。

    Tair分布式系统

    Tair是阿里/淘宝开发的一个分布式键/值存储系统,tair分为持久化和非持久化两种方式。非持久化的tair可以看作一个分布式缓存,持久化的tair将数据存放置磁盘,当然tair可以自动备份以避免磁盘损坏等问题。

    系统架构:

Java开发大型互联网-深入剖析分布式储存系统应用实践

    同样,Tair由一个Master和一系列Slave节点组成,称之为ConfigServer作为整体的控制中心,而服务节点为可伸缩的DataServer。ConfigServer负责管理所有的dataserver,维护其状态信息。DataServer则对外提供各种数据服务,并以心跳来将自身信息反馈给configserver。可以看到,ConfigServer是核心控制点,而且是单点,只有主-备形式保证其可靠性。

    ConfigServer的功能

    1)通过维护和dataserver心跳获知集群中存活节点信息

    2)根据存活节点的信息来构建数据在集群中的分布表。

    3)提供数据分布表的查询服务。

    4)调度dataserver之间的数据迁移、复制。

    另外ConfigServer实现了从配置文件load进节点信息,然后根据配置的数据分布的桶和需要建立的数据备份数,建立数据分布表,长度为桶数乘以备份数。如目前有1023个桶,备份3,所以长度为1023*3的数组。数组元素就是数据要存储的主节点信息,下标即桶号码。其中后面的1023*2为备份节点信息。为了负载均衡,主桶会尽量均匀分布到所有节点,备桶则根据策略,如不同数据中心来分布。

    DataServer的功能

    1)提供存储引擎

    2)接受client的put/get/remove等操作

    3)执行数据迁移,复制等

    4)插件:在接受请求的时候处理一些自定义功能

    5)访问统计

    操作层面:

    客户端首先请求ConfigServer获取数据所在DataServer,之后向DataServer发送读写请求。

    负载均衡:

    Tair采用分布式一致性哈希算法,可参考我们上一篇介绍,正所谓理论之基石。tair对于所有的key,分配到Q个桶,桶是负载均衡和数据迁移的基本单位。configserver根据已定策略把每个桶指派到不同的dataserver,因为数据按照key做hash算法,所以每个桶中的数据基本平衡。

    如下图:

Java开发大型互联网-深入剖析分布式储存系统应用实践

    一致性和可靠性:

    分布式系统中的可靠性和一致性是无法同时保证的,因为有网络错误.tair采用复制技术来提高可靠性,并做了一些优化,当无网络错误的时候,tair提供的是一种强一致性.但是在有dataserver发生故障的时候,客户有可能在一定时间窗口内读不到最新的数据.甚至发生最新数据丢失的情况.

    以上就是我对Java开发大型互联网-深入剖析分布式储存系统应用实践问题及其优化总结,分享给大家,希望大家知道什么是Java开发大型互联网-深入剖析分布式储存系统应用实践问题及其优化。觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

责任编辑:宋冰洁

免责声明:凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。