【计算】漫谈Google三驾马车之 Bigtable
我们将从背景动机、系统架构、核心设计思想、使用方式四个维度全面深入地解析 Google 的Bigtable—— 这一支撑了 Google 多数核心服务如 Search、Gmail、Google Maps的分布式结构化存储系统。一、为什么要做 Bigtable—— 背景与痛点1. Google 面临的数据挑战2005 年前后到 2005 年Google 已有 GFS存储原始数据和 MapReduce批处理计算但在在线服务场景中仍面临巨大挑战需要低延迟随机读写搜索索引需毫秒级响应Gmail 需快速存取邮件。数据规模巨大单个表可达PB 级包含万亿行如网页索引表。访问模式多样按主键查询如用户 ID 查邮箱范围扫描如按时间范围查日志高吞吐写入如爬虫持续插入新网页强一致性需求某些场景如计费不能容忍最终一致性。GFS MapReduce无法满足这些需求GFS 只适合大文件顺序读写不支持高效随机访问。MapReduce 是批处理模型延迟高。2. 现有方案的不足关系型数据库如 MySQL难以水平扩展到数千节点固定 schema 不适合半结构化数据如网页元数据分库分表复杂运维成本高自研 KV 存储各团队重复造轮子如广告、搜索、地图各自开发存储系统缺乏统一的容错、监控、管理能力 Google 需要一个可扩展、高性能、支持结构化/半结构化数据、自动容错、统一平台的存储系统。二、Bigtable 是什么—— 核心模型Bigtable 不是关系型数据库也不是简单的 Key-Value 存储而是一个稀疏、分布式的、持久化的多维排序映射表Sorted Map。其数据模型定义为(table, row key, column key, timestamp) → value关键概念解析概念说明示例Table逻辑表如webtable存储网页快照Row Key行主键字节数组按字典序排序com.google.wwwColumn Key列 column_family:qualifiercontents:html,anchor:cnnsi.comTimestamp版本号64位整数默认为写入时间纳秒1680000000000Value任意字节数组无类型HTML 内容、链接文本一张表可看作按 row key 排序的、带时间版本的、列族组织的稀疏矩阵。示例Webtable网页存储表Row Key (URL)anchor:cnnsi.comanchor:my.look.cacontents:html t1contents:html t2com.cnn.wwwCNN...old...new同一行可有多个列族anchor,contents同一列可有多个时间版本自动保留最近 N 个表极度稀疏大多数单元格为空三、Bigtable 是怎么设计的—— 架构与核心机制1. 整体架构三大组件组件职责Client Library应用通过它访问 Bigtable缓存元数据直接与 Tablet Server 通信Master Server管理元数据• Tablet 分配• Tablet Server 负载均衡• 垃圾回收• Schema 变更Tablet Server存储实际数据• 管理一组 Tablet数据分片• 处理读写请求• 执行 Compaction、Split关键设计Client不经过 Master 读写数据Master 仅用于元数据协调。2. 数据分片Tablet 机制每张表被水平切分为Tablet类似数据库的分区。每个 Tablet 默认包含连续的 row key 范围如[a–d),[d–g)。初始一张表只有一个 Tablet当 Tablet 阈值如 200MB自动分裂。每个 Tablet 由一个 Tablet Server 负责。类比Tablet ≈ HBase 的 RegionCassandra 的 Partition。3. 存储引擎LSM-Tree SSTable每个 Tablet Server 使用日志结构合并树LSM-Tree实现高效写入写入流程写 WALWrite-Ahead Log到 GFS保证故障恢复写 MemTable内存跳表当 MemTable 满如 128MB冻结为Immutable MemTable后台线程将其刷写为SSTableSorted String Table文件到 GFS新写入进入新的 MemTable读取流程合并查询MemTable Immutable MemTable 多个 SSTable使用Bloom Filter快速判断某 key 是否存在于 SSTable避免无效 IO优势写入吞吐极高顺序写 GFS适合日志、时序等场景。4. 元数据管理三层查找结构为避免 Client 频繁访问 MasterBigtable 设计了两级元数据表METADATA 表存储所有用户表的 Tablet 位置结构(table, end_row_key) → location_of_tabletROOT 表存储 METADATA 表的 Tablet 位置只有一个 Tablet永不分裂Master 地址存储在 Chubby分布式锁服务Client 查找流程从 Chubby 获取 ROOT 表位置读 ROOT 表 → 找到 METADATA Tablet 位置读 METADATA 表 → 找到目标 Tablet 位置缓存结果后续直接访问 Tablet Server通常只需 1 次网络请求因缓存极少访问 Master。5. 容错与高可用数据持久化到 GFSSSTable 和 WAL 都存于 GFS三副本Tablet 自动迁移Tablet Server 宕机 → Master 将其 Tablet 重新分配给其他节点Master HA通过 Chubby 锁实现主备切换只有一个活跃 Master压缩与垃圾回收自动删除过期版本、合并小 SSTable四、为什么要这么设计—— 设计哲学与权衡设计选择原因基于 GFS 构建复用已有可靠存储专注逻辑层LSM-Tree 引擎优化写吞吐适合追加/更新密集型 workloadRow Key 字典序排序支持高效范围扫描如时间序列列族Column Family物理隔离不同访问模式的数据如metavscontent多版本Timestamp天然支持历史回溯、增量处理放弃跨行事务仅支持单行 ACID换取高扩展性无 SQL 接口提供简单 API由上层构建复杂查询核心思想“为 Google 的典型 workload 量身定制不做通用数据库。”五、如何使用 Bigtable—— 实际应用与 API1. 典型应用场景全屏复制产品用途Google Search存储网页索引row key URL, column inverted indexGmail邮件存储row key user_id timestamp, column subject/bodyGoogle Earth存储卫星图像瓦片Google Analytics用户行为日志聚合2. 编程接口简化版// 创建客户端 TabletClient client(webtable); // 写入数据 client.Write(com.google.www, anchor:mit.edu, Google, timestamp); client.Write(com.google.www, contents:html, html.../html, timestamp); // 读取单行 Row row client.ReadRow(com.google.www); // 范围扫描 Scanner scanner client.Scan(com.google.www, com.youtube.www); for (Row r : scanner) { // process row }3. Schema 设计技巧Row Key 设计至关重要避免热点不要用单调递增 ID如 timestamp可加 hash 前缀支持查询模式如user_id#event_time支持按用户查时间范围列族数量少通常 5每个列族对应独立 SSTable太多影响性能利用时间版本自动保留最近 7 天数据旧版本自动清理六、Bigtable 的影响与局限影响技术遗产Apache HBase几乎完全复刻 Bigtable 架构HDFS ZooKeeper LSM-TreeCassandra借鉴列族模型和去中心化设计Google Cloud Bigtable公有云服务兼容 HBase API现代 NoSQL 范式宽表模型Wide-Column Store成为主流之一局限性不支持跨行事务Spanner 后来解决此问题无二级索引需应用层维护或用外部系统复杂查询需 MapReduce 辅助运维复杂依赖 GFS/Chubby结语Bigtable 的伟大在于它精准定义了“大规模结构化数据在线服务”的需求边界并通过简洁而强大的抽象排序 map 列族 多版本在 GFS 之上构建了一个高性能、可扩展、自动容错的存储平台。它不是万能数据库但对 Google 的核心业务而言它是刚刚好够用、且极其可靠的基础设施。正如论文结尾所说“Bigtable has been used successfully in many Google products... providing a flexible, high-performance solution for storing structured data.”而它的思想早已融入今天每一个大数据工程师的日常工具链中。延伸学习建议原始论文Bigtable: A Distributed Storage System for Structured Data (OSDI 2006)动手实践使用Google Cloud Bigtable或Apache HBase对比阅读Bigtable vs Cassandra vs DynamoDB
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2485727.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!