此外,QingStor®️对象存储是一个分布式系统,由多个节点共同协调提供服务,这种情况下,单个节点的故障是常有的,我们需要做到单个节点故障的情况下,保证服务的可用性以及数据的可靠存储,这些都是在设计架构时需要重点考虑的问题。
接下来,依次来解读这几个子系统是如何实现的。
QingStor®️对象存储子系统实现在接入子系统中最重要是 Gateway 服务,Gateway 服务本质上是在后台运行的 Server,它运行在网关节点上。
Gateway 服务的主要功能是接收上游发下来的请求,做协议解析以及数据处理与数据读写,对象存储中最重要的数据读写功能基本在这里完成。
Gateway 服务本身是无状态的,也就是请求被哪一个 Gateway 是服务处理都是一样的,因此 Gateway 可以非常轻松进行扩展,也就是服务实例的增加与减少。
从整体的链路上看一下接入层是如何保证高可用的。
用户开始访问对象存储之前,会先访问 DNS 服务器,通过对象存储服务的域名拿到一个虚拟 IP 地址,这个虚拟 IP 会指向某一台网关节点,如果这个节点故障了,虚拟 IP 会自动迁移到另外存活的节点上。
也就是 QingStor®️对象存储可以保证用获取到的 IP 永远指向一个存活的节点,业务永远是可用的。
在请求到达节点后,对象存储会进一步做负载均衡,把请求分到多个节点的 Gateway 服务上。
当请求转到一个 Gateway 上,发现这个 Gateway 出了问题,系统自动会将这个请求重新转发,这是请求级别的Failover。
通过这两个机制,QingStor®️对象存储可以保证访问请求都可以得到响应。
此外,将 Gateway 实现为无状态服务,可以非常方便地进行水平扩展,通过增加 Gateway 服务实例个数来顶住高并发的访问量,保证服务可用。
接下来谈谈索引子系统的架构,索引子系统的主要功能是存储和管理对象数据的元数据,元数据包括对象的类型、大小、写入时间与存储位置等信息。
这些信息是非常重要的,如果元数据丢失,数据本身就无法读取,因此要保证元数据绝对安全可靠的存储。
另一方面,海量数据的场景需要支撑海量数据的索引,索引子系统必须要能够处理数据量不断增大的情况。在此基础之上还要尽可能提升系统的处理性能。
QingStor®️对象存储是如何做到的?首先通过数据分片的方式来应对海量数据。把数据按切片存储,切片的意思是按照对象名称字母序进行切片。比如第一个节点存 A-F 对象,第二个节点存 U-Z 对象,每一个节点会负责一个区间的数据,然后使用一个协调服务记录节点及其所负责的区域对应关系。
通过这种方式,可以很方便地横向扩展,如果 A-F 的对象数据太多,系统会把它拆成两个,增加一个节点进来,将 A-F 拆分为 A-D,A-D 保留在原有的节点,D-F 放在新的节点,通过这种方式可以处理更多的数据,也提升了处理读写的能力。
添加新的节点通过协调服务进行,数据的拆分和再平衡过程是完全自动进行的。
QingStor®️对象存储的 Gateway 服务实时跟协调服务保持连接,可以获取最新的数据分布情况。通过这种分片存储机制,保证了海量数据情况下可以通过增加节点的方式来提升存储能力。
在数据安全可靠方面,QingStor®️对象存储采用副本机制,每一份元数据都采用三副本方式进行存储,如果有一个副本所在的机器发生故障,可以从其他的副本上读取数据,在访问的时候保证永远可用。