分布式存储调研存档

不知不觉,一年没整理过博客内容了。。。从去年6月开始在滴滴实习,到10月份找工作,然后过年–毕业论文–答辩,算起来也确实没有很系统的学习过什么东西。工作实习第一件事,是调研分布式存储相关的内容。原以为分布式存储就是 HDFS 那一套东西,查了之后才发现那只是其中的分布式文件系统的一种实现方式而已。

相比分布式存储,对应的就是非分布式的,比如普通 PC 和服务器直接挂载硬盘作为直接存储。其他还包括 NAS 和 SAN,关于这两者的区别可以查阅这篇文章,简单来说就是SAN 是通过 Fibre Channel 访问,提供 block 级别的存储;NAS 是通过 Ethernet 和服务器连接,提供文件系统级别的存储。

对于分布式存储,目前了解到的主要有三种分类:

  • 块存储:这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,如Sheepdog,AWS的EBS,Ceph的RBD(RBD是Ceph面向块存储的接口)
  • 对象存储:也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展,如Swift、S3
  • 文件系统存储:通常意义是支持POSIX接口,它跟传统的文件系统如Ext4是一个类型的,但区别在于分布式存储提供了并行化的能力,如Ceph的CephFS(CephFS是Ceph面向文件存储的接口),但是有时候又会把GFS,HDFS这种非POSIX接口的类文件存储接口归入此类。

其中,我认为对象存储和文件系统存储的差别似乎只在于对应的接口方法。

在使用和设计分布式存储系统时,非常重要的一个环节是数据寻址,即定位一个key的数据副本存放在哪个机器(甚至哪块磁盘);目前有几种常用的解决方案:中心节点管理元数据,分布式管理元数据,无元数据设计;

  1. 中心节点管理元数据:在设计分布式(存储)系统时,使用中心节点是非常简洁、清晰地一种方案,中心节点通常兼具元数据存储与查询、集群节点状态管理、决策制定与任务下发等功能。其优势在于集中方便管理和分析,同时在扩容时不需要进行 rebalance 操作;同时缺点也非常明显,元数据的单点故障会影响系统的总体可用性,同时中心节点的性能和扩展性会影响系统的整体能力。
  2. 分布式管理元数据:和中心节点的方案相似,只是将元数据分片并使用分布式节点管理存储,在保有中心节点方案优点的同时,解决了性能和容量扩展上限的问题,同时,多个节点同时提供元数据查询服务,系统性能得到提升。分布式必然造成的缺点就是一致性问题:分布式的元数据节点和数据节点均为带状态节点,其分布式 CAP 原则的取舍,对系统的设计和实现造成很大的困难。
  3. 无元数据设计(主要以ceph为例):有别于上述二者的思想,此类系统的主要思想:使用算法计算寻址,寻址算法的输入参数之一为集群状态(如数据节点分布拓扑,权重,进程状态等)的某种形式描述,此类常见算法有consistent hashing,Ceph RADOS系统的CRUSH算法,这类算法通常不直接管理用户数据,而是引入中间一层逻辑分片结构(如consistent hashing的环片段,ceph的placement group),其粒度更大,其数量有限且相对固定,用户存取的数据隶属于其中唯一一个分片中,系统通过管理维护这些分片进而管理维护用户数据;此类系统有的也有中心配置管理节点(如ceph rados的monitor),只提供集群和分片等重要状态的管理维护,不提供元数据的存储查询。

无元数据方案的优点在于:系统只需管理维护逻辑分片与集群状态等信息,不存储管理用户数据的元数据,系统的可扩展性大大增强,这在大量元数据场景时尤为明显;寻址算法所需的参数数据量小且相对固定,client可以通过缓存的方式,达到若干client并行寻址的目的,避免了寻址性能瓶颈;

其缺点在于:扩容时带来的 rebalance 开销,当数据规模很大时会使系统长期处于高负载状态,因此在集群设计时需要对做好容量评估。

 

参考链接:

发表评论

电子邮件地址不会被公开。 必填项已用*标注