https://zhuanlan.zhihu.com/p/382477856

论文: https://dl.acm.org/doi/pdf/10.1145/3448016.3457565

问题

  • 写吞吐 (千万级 QPS)
  • 租户1000+业务上
  • 读写PB+
  • 低延迟写入+实时的数据可见性

在这个基础上尽可能的降低成本

对比开源方案

HBaseMongoDB可以大量级的事务写但是牺牲查询 ElasticSearch: 由于需要实时索引写入性能达不到要求只适合单租户

另外上面的结构都是Shared Nothingfailover什么的维护起来不方便

  • Druid: 支持查询丰富但是只能异步读写
  • Amazon S3(这个不是对象存储么按照租户分割不够经济

结构体系

云分布式数据库

  • Shared Nothing利用本地存储写扩展性好但是存储和计算资源耦合不经济例如ES
  • Shared Storage解耦计算和存储资源由下层存储来做数据复制物化但是写吞吐有限例如PolarDB
  • Shared Data同样解耦计算和存储资源但是使用对象存储优点是存储便宜缺点是对象存储Append性能差写延迟高例如SnowFlake

问题 shared datashared storage有哪些区别shared data好像是snowflake提出来的名词但是像Druid这样用HDFSDeepStorage的算不算Shared data还是说只有用对象存储的才算好像纠结这个名词也不重要

LogStoreShared nothingShared data结合保证写吞吐和存储便宜读写能力都可以扩展设计LogBlock的结构优化读包括全文索引能力设计调度算法解决倾斜问题

具体结构

./2021-10-09-15-41-38.jpg

Controller

Zookeeper保证高可用元信息管理管理Shard路由database schema检查其他组件是否存活

Query

SLB 负载均衡到 Brokerbroker解析SQL转换成DAG分发到ShardWorker收集数据后合并

Execution

Worker负责管理一批Shard读写请求都会落在Worker写请求有两个阶段

  1. 本地写WAL复制到其他ReplicaLogStore生产环境有三个Replica
  2. 远程归档异步转换成LogBlocks写入到OSS

云存储层

问题: OSS的读写性能到底如何按照对外售卖的性能保证读性能不一定够用

OSS 优势便宜

问题读延迟高Append文件效率差对比HDFS专门支持了Append所以是FileSystem 解决两阶段写第二阶段生成的LogBlock不会再发生修改了

问题遍历小文件的效率很低 解决LogBlock所需要的信息都打包在了一起存一个tar

多租户

策略1: 为每一个租户分配单独的物理资源缺点大量小租户浪费资源 策略2: 全放一起缺点load会互相影响会有不必要的读取

LogBlock

压缩+列存索引+自恰

特点是全文索引+可Skip维护(min, max)信息 如果查询不在范围内Skip

LoadBalance

自动化的减少热点数据如果一个租户的load太高就把load平均分配在各个节点上没仔细看

想法

论文着墨比较多的是Traffic Control的算法解决热点然而俺没怎么仔细看暂时还用不上

  1. 读写分别设计数据结构优化但是没想清楚异步写怎么保证实时可见性有点矛盾
  2. OSS存储Immutable数据避免了Shard Nothing架构FailOver数据会来回倒腾OSS的读性能感觉会是个瓶颈论文里也写了好几个解决放方法比如元数据和日志数据打包在一起避免遍历大量小文件并发读取解决读延迟
  3. 多租户的TradeOff写数据结构放在一起减少空间浪费读数据结构隔离起来避免浪费读吞吐