如果数据所在节点发生变化,Gateway 会立即通过协调服务知道应该访问哪个节点得到数据。此外,三副本都进行了持久化存储,保证数据是安全可靠的。
QingStor®️对象存储在单个节点上存储元数据时使用 KV 存储引擎,KV 存储引擎的索引结构是 LSM,LSM 索引结构最大的优势是写入非常快,可以提升系统的整体写入性能。
除此之外,LSM 还有一个特点,它底层的数据在磁盘上存储时是有序的,也就是一个个 sst 文件,可以提供高效的按顺序查询。
QingStor®️对象存储在处理列出存储桶中对象的查询接口时,可以很好的应用这个存储特性,高效地将数据按字母序列出来。因为它本身是有序存储,所以读取速度非常快,接口处理非常高效,这是采用 KV 存储的优势。
总体来看,QingStor®️对象存储的索引子系统通过分片加协调服务的方式使其有很好的扩展性,同时通过副本保障数据的安全。
此外,在单个节点上采用 KV 存储引擎提升写入效率,同时支持 list 接口的高效查询。
存储子系统存的是对象数据本身,对象存储应对的是海量场景,数据量非常大,而且会持续增加,访问量也会非常大,而且有增加的可能性,因此架构的设计要保障系统可以不断提升性能。此外,还需要保证数据的安全性和集群的稳定性。
QingStor®️对象存储在统一命名存储空间下将存储分成一个个存储组,每个存储组由各自的分布式文件系统组成。
采用存储组设计的优势主要包括三方面:
一是区分冷热数据,也就是存储分级,QingStor®️对象存储提供两种存储级别:低频存储和标准存储。
标准存储相对于低频存储来讲,其访问量高一些,数据量可能会少一些。
低频存储的数据量大,但访问量会低一些。
针对两种不同的存储需求可以使用不同的存储组,组和组之间是没有关系的,因此不同的存储组可以采用异构的硬件设备。对于低频存储,可以使用大容量的磁盘和低一点CPU的配置,进一步优化成本。
第二,采用存储组可以使得集群扩展起来更加灵活方便,比如系统要进行扩容,如何做?
加一个存储组即可,可以直接把新数据写到新的存储组中,不需要对历史数据做移动和迁移等复杂操作。
QingStor®️对象存储同时支持另一种扩容方式,将既有数据迁移一部分到新存储组上,使得整个集群比较均衡。
第三,采用存储组具有故障隔离的效果。如果存储组 1 出现节点的故障或者整个存储组坏掉,对其他存储组没有影响,其他存储组可以正常处理数据,具有故障隔离的效果。
在单个存储组内,应用 QingStor®️文件存储的核心技术,采用三副本进行存储,每次写入数据,等到三副本写入全部完成才会返回写入成功,保证数据的强一致性和安全性。
本地文件系统直接和底层的块设备打交道,省去了 Linux 本地文件系统,使得 IO 处理在性能上的得到提升。
QingStor®️对象存储的数据传输采用 RDMA 高效传输协议,RDMA 是一种在不同的节点之间传输数据的机制,它不需要经过 CPU,直接通过硬件控制将数据从一个节点拷贝到另一个节点,和 CPU 的执行是并行的,是一种高效传输数据的方式。
事件子系统在 QingStor®️对象存储的架构中,不处于数据读写的核心流程上,但它提供了很多非常重要的功能,生命周期管理、跨区域复制以及自定义回调都是基于事件子系统来进行设计的。
事件子系统的基本逻辑比较简单,产生事件和处理事件,这里事件可以理解成消息系统。
产生消息有两条链路,一条链路在做数据读写时,当你完成一条数据的读、写入、删除或者更新,索引子系统会产生事件,发送到事件子系统中;还有一条链路是用户直接通过接入子系统提交一个事件,可以进入事件子系统中。
事件子系统有很多预置的消费者进程,消费者会处理事件,这些事件是通过分布式消息队列保存的,消费者按照预设的逻辑读取事件并对其进行处理。比如有一个消费者专门处理生命周期的功能,有一个消费者专门处理自定义回调的功能。
QingStor®️对象存储海量小文件优化实践