其他
数据湖系列之二 | 打造无限扩展的云存储系统,元数据存储底座的设计和实践
1. 元数据面的技术演进
2. 层级 Namespace 技术演进
单机架构:该架构方案把所有目录树单机全内存,可做到低延迟,但是无法横向扩展,最大规模仅支持 10 亿文件数,代表产品为 HDFS。
基于子树划分: 该架构方案通过将层级目录树拆分成多个子树,并将每颗子树按照相应的负载策略部署到不同的 Meta 节点中,但缺点是容易产生热点,负载均衡难以实现,扩展性不够好,同时难以做到跨子树的 Rename,典型的实现如 HDFS Federation、CephFS、IndexFS。
基于分布式事务数据库:上层维护了一层元数据语义层,该层将目录树操作转化为数据库事务请求。下层是分布式数据库,负责元数据的存储管理,目录树中的每个 inode 节点对应数据库中的一行记录。此方案可以做到单集群文件数规模无上限,这也是目前的技术趋势,典型的实现如 Facebook Tectonic。
4. 元数据底座的技术选型
完备的数据库功能:高性能点操作、范围操作、事务操作;分布式备份恢复、CDC(Change Data Capture) 极致的性能与扩展性:万亿级别元数据规模、千万级别 QPS
Spanner:全球部署、配备原子钟,并基于 2PC(两阶段提交)实现分布式强一致事务,具备极高的可用性和自动增容的扩展性。这种架构由 Google 设计研发,适合元数据存储这种对扩展性、可用性、性能有极高要求的场景。 Calvin:没有采用 2PC 实现,其目标是尽量减少分布式事务的开销。具体来说就是在事务执行以前就确定了所有操作的执行顺序。但 Calvin 不支持交互式事务,而在我们的场景中交互式事务的需求是存在的,比如说层级目录树的 Rename 操作,因此它不满足我们的需求。 FoundationDB:苹果在2018年开源的分布式事务K-V,它也是世界上第一个给NoSQL 增加 ACID 能力的系统,FDB采用微服务的理念把系统进行解耦,将事务管理系统与分布式存储分离,并独立地扩展它们。这种架构从软件工程角度确实做到了彻底解耦,但会导致写入路径增加多次 RPC 开销。同时由于系统内部存在广播,出现慢节点的概率变大,系统容易出现长尾,因此我们觉得不适合层级 Namespace 这种极低延迟场景。
5. 百度智能云的云存储元数据底座 TafDB
5.1 系统架构
TafDB 基于 RocksDB 实现单机存储,基于 Multi Raft 协议保障副本数据一致性,其中:
BE:负责数据存储,用 Tablet 组织,不同 BE 的多个 Tablet 形成一个 Raft group 实现副本的高可用。BE 实例宕机可以自动补齐副本数据。
Master:负责元信息管理,包含分区、容量、均衡等,基于 Raft 实现高可用。
Proxy:负责前端 SQL 解析、事务协调、查询计划生成执行 ,无状态多实例部署。
TimeService:全局时钟服务,负责提供给单调递增的时钟服务,正在逐渐被新的分布式 TS 方案所替代。
5.2 系统特性
功能完备:支持全局有序、分布式事务、二级索引、分布式查询、分布式备份、CDC(Change Data Capture)等。
高性能:面向元数据场景设计,元数据读写场景性能领先开源方案2倍+。
强扩展性:具备支撑万亿级元数据存储的能力。支持单集群EB级数据存储。
6. TafDB 的工程挑战
在保证元数据操作 ACID 的同时,降低分布式事务的高额开销 —— 解决事务功能和系统性能的矛盾 在提供高性能写操作的同时,保证范围查询的性能 —— 解决连续删除 + 范围查询和性能的矛盾 消除数据流程的单点,提供极致的扩展性和可用性 —— 解决多版本(事务)功能和高扩展性的矛盾
6.1 挑战一:在保证元数据操作 ACID 的同时,降低分布式事务的高额开销
6.1.1 痛点
文件系统层级 Namespace 存在大量事务语义,目录树操作中修改的节点通常在不同分片上。 对象存储平坦 Namespace 本身事务语义很少,但是业务需使用全局二级索引,主键数据和索引数据在不同的分片上。
针对层级 Namespace:TafDB 提供了一种自定义分裂策略的功能,来保证同层目录元数据分片不分裂。同时业务调整表结构,控制一次目录树要操作的节点都在同层目录。这样就可以把绝大部分目录树操作都控制在单个分片上。如图所示,对文件 b1 操作涉及文件 b1 和其父目录 B 的元数据修改,原本需要通过分布式事务同时完成分片 X 和 Y 的数据写入。而优化后,我们将目录 B 需要修改的部分属性也放在分片 Y 中,这样只需写分片 Y 即可。
针对平坦 Namespace:我们分析发现大部分业务场景需要的二级索引不要求极致的时效性。基于这个特点我们实现了一种机制来异步写入索引数据,以略微降低索引时效性为代价,将绝大部分写入都控制在单个分片上。如图所示,原本一个写入需要同时完成主数据和索引数据的写入,需要通过分布式事务同时完成两分片操作。而优化后,由于无需同时写入索引数据,系统只需完成主数据分片的数据写入后就可返回。
通过上述优化,我们几乎将目前业务场景中所有的两阶段提交都优化为了一阶段提交,消除了系统中绝大部分的跨分片事务,避免了大量分布式事务产生的性能开销。
6.2 挑战二:在提供高性能写操作的同时,保证范围查询的性能
6.2.1 痛点
6.2.2 解决方案
Scale up:
Scale out:
流控与反馈:
6.3 挑战三:消除数据流程的单点,提供极致的扩展性和可用性
6.3.1 痛点
6.3.2 解决方案
7.2 TafDB 在对象存储 Namespace 存储的应用
数据湖系列之一 | 你一定爱读的极简数据平台史,从数据仓库、数据湖到湖仓一体 面向大数据存算分离场景的数据湖加速方案 面向高性能计算场景的存储系统解决方案 面向大规模数据的云端管理,百度沧海存储产品解析 超大规模AI异构计算集群的设计和优化 双引擎 GPU 容器虚拟化,用户态和内核态的技术解析和实践分享