MSST2015paper(paperhere)介绍了百度云使用的key-value存储系统atlas的设计,思路挺不错的。简单总结一下,建议想深入研究的同学直接看论文。存储场景94%的百度云文件都在[128KB-256KB]之间,所以atlas主要针对小文件存储。百度云前面有CDN,请求图集基本都是随机访问。Atlas是随机存取的存储引擎,不支持范围操作atlas的整体架构主要由两部分组成:PIS和RBS。PIS存储接口图集的PIS模块(patch和indexslice)直接面向用户。它类似于其他KV存储引擎,并公开了put/get/delete接口,不同的是atlas的key是一个GUID,指定长度为128字节。PIS以槽(片)为单位管理数据。用户的键值将存储在多个槽中。put时,atlas客户端会根据key计算hash,并对slot数取模,将key路由到某个slot,每个slot独立进行数据管理。PIS的主副本收到用户的put请求,将请求转发给多个副副本。每个copy将value追加到本地patch(类似log文件),并记录key的value在patch中的位置信息(offset,length),当patch达到64MB时,patch将不再写入数据,PIS会生成一个新的补丁文件进行写入,并将完整的补丁以块的形式存储在RBS中,补丁存储在RBS中,RBS会分配一个唯一的blockid。此时PIS会将key==>(blockid,length,offset)的映射关系写入index模块(类似googleleveldb的系统)。当PIS收到一个get请求时,它首先检查密钥是否存储在补丁中。如果存在,则直接从补丁中读取值返回给用户;如果补丁中不存在键,则在索引中搜索。如果在索引中没有找到,说明这个key没有存储在atlas中;如果在索引中找到,则根据(blockid,length,offset)从RBS中读取该值返回给用户。PIS处理删除请求的方式与leveldb类似,会写入该键的一条新记录,标记为该键已被删除。#p#RBSInterfaceRBS(raid-likeblockstorage)为块提供读写和删除接口。块长度固定为64MB。在RBS中,块只能完全写入和删除,但支持部分读取。RBS包括一个中央管理节点(主从结构)和一组存储节点(part-server)。RBS在写块时不再使用传统的多副本来保证数据的可靠性,而是使用纠删码来保证,极大的节省了存储成本。64MB的块会被RBS客户端分成8个8MB的部分,通过8+4纠删码计算出4个4MB的部分,共12个部分;写的时候,先向中心节点申请一个唯一的分配blockid,分配12个part-server同时写12个part(其实15个part-server给信息,3个备用,如果有些part存储失败时)存储12个part,直接使用Standbypart-server,无需重新向中心节点发送新的请求,减少与中心节点的交互次数);当12个part存储成功后,将part与part-server的对应关系更新到中心节点。当需要访问一个区块时,RBS客户端向中心管理节点查询该区块所在的part-server,然后从part-server读取数据;如果此时读取的part-server处于故障状态,它会读取至少8个其他part来恢复part-server中的数据。删除空间回收PIS中索引中的key==>(block,length,offset)信息,RBS中的block==>create-time信息会推送到离线的Hadoop集群中,哪些block比较老每天计算(比如2周前创建),空间有效使用低于一定阈值(比如80%),则认为这批block需要回收,atlas会重写valid块中的数据(未删除或覆盖)输入副本以删除块。博文来源:http://blog.yunnotes.net/index.php/baidu-atlas-key-value-store/
