整体来看,从上到下,一个对象存储系统应该包括产品层的高级功能(包括鉴权、读写接口)、元数据管理模块(MySQL、NewSQL数据库)、数据管理模块(对象数据的管理)。可以参考S3、Ceph等系统。
元数据管理模块
NewSQL
NewSQL 的出现就是为了解决扩展性和一致性之间的矛盾,主要面向 OLTP 业务和轻量级的OLAP业务。几点特性:
- 支持常见SQL语句查询,需要实现一个分布式SQL engine,利用多个节点的计算能力,生成更好的执行计划,将计算逻辑尽可能的均摊到多个存储节点上,与单机引擎不同的是考虑网络的开销和延迟。
- 支持 ACID 的跨行事务,两阶段提交实现分布式事务,也就是保证多个节点操作的原子性,要么全部节点成功要么全部失败
- 自动可扩展性。目前关系型数据库的扩展方案上,基本只有分库分表和 PROXY 中间件两种方案。
- 自动FailOver。常规主从复制方式无法脱离人工运维,因此选用 Multi-Paxos 或者 Raft 这样基于分布式选举的复制协议,在某节点故障的时候,支持完全自动和强一致的故障转移和自我恢复,还能实现跨数据中心多活
数据管理模块
几个思考
为什么要用EC编码和三副本kv存储相结合的方式?
从3副本到1.5副本,主要是为了节省成本。3副本其实数据可靠性(也就是数据持久性)其实很低。对大对象直接进行EC编码,但是小对象不能直接EC,因为小对象太多,如果EC会带来IOPS放大;可以考虑对小对象打包之后做EC,避免增大IOPS。