大数据存算系统因其承载海量的存储和大规模的计算,纷繁复杂的业务应用需求,设计一套高性能、高可靠、高扩展的分布式系统难度极大,业界主流的架构有两大模式:统一分布式存储底座+应用层 VS 独立专精系统,现简要分析对比。
统一分布式存储底座+应用层
存储底座可以统一的部分原理基础是Kafka创始人《I Heart Logs 》文中总结的日志(Append only data stream/file,类commit log/journal/WAL)即数据,日志为中心的思想,日志通常是只往后追加数据,暗含数据产生的逻辑先后顺序,并且也是所有分布式系统需要解决的根本问题,如故障恢复、数据同步、数据一致性等等。而所有面向业务的应用层都是基于这个日志数据之上建立的索引,如Key-Value/OLAP Store、搜索引擎等。
日志系统可以作为搭建复杂分布式存算系统的基础,再叠加面向业务场景优化的应用层,通过这样2层的抽象解耦,使设计复杂度大幅降低。统一的日志系统底座可以:
- 序列化并发更新,处理数据一致性问题
- 支持节点间数据复制
- 向外部系统提供事务提交的语义
- 向外部系统提供日志订阅功能
- 向故障节点提供故障恢复能力
- 解决数据负载在节点间的平衡问题
简化的架构为2部分,Log和Serving Nodes:
所有的数据直接写入 Log (或被 Serving Nodes 代理),然后所有的 Serving Nodes 通过订阅 Log 来建立索引,向外提供数据服务。这种设计就是以日志为中心 (log-centric) 的设计:
业界有不少比较成功的开源案例,如HBase(KV on HDFS),Pulsar(Message queue),SQL on Hadoop(Apache Hive/Impala/Drill, Presto/Trino),Ceph/Ozone等等;大型云厂商谷歌GCP,国内友商的Pangu
此架构2层自然是存算分离的,在系统规模和扩展性上有较大优势。
独立专精系统
相比一统底座的架构,面向较单一具体业务场景的独立专精系统在开源界也是大行其道,包括消息队列Kafka,KV系统Cassandra,OLAP系统Doris等,局部也有WAL之类机制,但其数据可靠一致性,更多依赖不同的replica策略实现,也未较严格的分层设计实现,但这类系统可更专更深度的优化,在存储效率、计算性能和时效性等方面有优势。
目前,两类系统也在一些技术实现上较好的融合,希望既有统一架构带来的研发难度和成本的降低,又更好满足专有业务的需求。