写点什么

优化使用 BigTable 的原则与方针

2008 年 6 月 29 日

从围绕着 Google App Engine 的大量讨论中,Todd Hoff 总结出了一组优化使用分布式及高可伸缩性存储系统——如 BigTable——的指导原则

Todd 从定义 BigTable 的适用范围开始论述。由于 BigTable 引入的各种代价,只有在以下情况下使用 BigTable 才能带来益处:a) 需要伸缩到巨量的用户数,b) 更新与读取操作相比比例很小。Todd 还着重强调为了“优化读取速度和可伸缩性”,所采取的理论路线与关系数据库中的做法存在根本的分歧,很可能初看起来是违背直觉甚至相当冒险的。

关系数据库的世界是以防止错误为根基的;以正规化(normalization)为工具消除重复和防止更新异常。为了提高可伸缩性,数据应该重复而非正规化。Flickr 久悬着了这种路线,决定让“评论重复出现于评论者和被评论者两个用户数据分片中,而非单独建立一个评论关系”,因为“如果把用户数据分片作为可伸缩性的单元,就没有地方放置这种关系”。因此,虽然去正规化(denormalization)违背了“关系数据的伦理”,但它是 BigTable 数据范式不可缺少的组成部分。

在以上论述的基础上,Todd 针对优化使用 BigTable 存储系统总结了若干必须牢记的原则:

  • 假定数据访问是较慢的随机访问而非较快的连续访问。

因为“在 BigTable 里数据可能放在任何地方 [……],平均读取时间可能相对较高”。

  • 为并发读取对数据进行分组

为了最大程度提高并发读取,应该去正规化。也就是说,“应该改变实体的存储方式,使得一次读取操作即可读出整个实体,避免执行会导致多次读取的 join 操作”,并且“将属性复制到需要使用它们的地方。”

  • 磁盘和 CPU 都很便宜,不要再为它们操心,尽力提高可伸缩性吧

“[……] 你的应用可以任意地扩大规模,只要简单地增加新机器就可以了。所有可伸缩性瓶颈都已消除。”

  • 围绕数据的用途来决定数据的结构

要提高查询速度,数据的格式应该尽可能与数据被使用时的格式接近。因此 Hoff 主张用“以应用为出发点的实体取代 SQL 集合”。必须强调“这种方式不同于面向对象的数据库”。行为不是绑定到实体上的,而是由应用提供的,“多个应用可以读取相同的实体,却实现截然不同的行为”。

  • Compute attributes at write time.

这样可以“最小化读取时的工作量”,并能防止“应用程序遍历大量的数据”,因为这种操作是低效的。

  • 创建大型的实体,允许可选的字段

放弃正规化和建立大量小实体的旧做法,应该“创建大型的实体,允许可选的字段,以便一次操作即可读取出全部需要的数据,运行时再确定存在那些字段”。

  • 在模型中定义 Schema

为了在去正规化的条件下,保证数据跨多个实体的一致性,schema 必须“在代码中定义,因为那是唯一能跟踪所有关系和保证数据正确性的地方。”

  • 用 Ajax 隐藏更新操作。

以小的增量更新数据库是有利的。

  • Put 是昂贵的

由于“在一次查询中能执行的根新数量十分有限”,Todd 建议“执行小批量的更新,并且由外部 CPU 来驱动。”

  • 按显式费用模型设计

“点击查询表单的 OK 按钮,表示你确定准备为 GAE 的数据库操作而付费。”

  • 将 many-to-many 关系包含到实体中,但减少关联元素的数量

由于“维护一个较大的列表相对低效”,所以应该“尽量将列表中元素的数量减到最小。”

  • 避免无限制条件的查询

Todd 建议只显示某字段最新的少量记录,因为“大的查询伸缩性不佳”。

  • 避免出现对数据存储实体的争用

应该“避免全局计数器,即跟踪记录数量,且每次请求都要更新或读取的实体。”

  • 避免庞大的实体组

“对实体组的写入是顺序执行的”,因此最好“使用小的、局部的组”。

Todd Hoff对上面的每一条原则都给出了深入的解释,对其中一些原则还引用了来自 GQL 讨论组的例子进行详细解说。

查看英文原文: Principles and Guidelines for an Optimized Use of BigTable

2008 年 6 月 29 日 21:283222
用户头像

发布了 225 篇内容, 共 46.6 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

央行数字货币离我们还有多远?

CECBC区块链专委会

数字货币

游戏数值策划之常用excel函数

吴优秀同学

Excel 游戏

一个草根的日常杂碎(10月20日)

刘新吾

随笔杂谈 生活记录 社会百态

解锁华为云AI如何助力无人车飞驰“新姿势”,大赛冠军有话说

华为云开发者社区

AI 无人驾驶

云原生在京东丨云原生时代下的监控:如何基于云原生进行指标采集?

京东智联云开发者

云原生

1分钟带你入门 React 公共逻辑抽离HOC...

Leo

React Hooks 前端进阶训练营 HOC Render Props

算法分析关键

Geek_0b8195

算法和数据结构

第四周作业

dll

聊聊技术人员如何学习成长

flyer0126

职业成长

架构师必备的那些分布式事务解决方案!!

架构师修行之路

分布式 微服务 架构设计

Flink窗口算子-6-8

小知识点

scala 大数据 flink

深入java week1-01 字节码、内存、GC、调试工具

闷骚程序员

Java程序员还在为没有项目经验感到苦恼?快来看看GitHub上最火的SpringCloud微服务商城系统开源项目,附全套教程!

Java架构之路

Java 程序员 架构 面试 编程语言

透视HTTPS建造固若金汤的堡垒

码哥字节

https 加密解密 HTTP

一个草根的日常杂碎(10月19日)

刘新吾

随笔杂谈 生活记录 社会百态

分布式下,我想要一致性

架构师修行之路

分布式 微服务

架构训练营学习笔记之五技术选型(一)

于成龙

架构训练营

万物互联的IoT时代,柔性电子会大行其道吗?

脑极体

【线上排查实战】AOP切面执行顺序你真的了解吗

Zhendong

spring aop

年纪轻轻怎么就卵巢早衰了?试管可帮忙!

Geek_65d32f

试管 三代试管

java week1练习

闷骚程序员

mongodb 源码实现、调优、最佳实践系列-百万级代码量mongodb内核源码阅读经验分享

杨亚洲(专注mongodb及高性能中间件)

MySQL mongodb 源码 中间件 分布式数据库mongodb

独角兽高级技术总监手写588页性能调优笔记,十年经验发人深省

周老师

Java 编程 程序员 架构 面试

一个草根的日常杂碎(10月18日)

刘新吾

随笔杂谈 生活记录 社会百态

利用区块链等技术,加强对交通运输信用信息的归集共享和分析应用

CECBC区块链专委会

区块链 交通运输

膜拜!阿里技术总监纯手打的《MySQL笔记》内部资料限时分享

Java架构师迁哥

华为云瑶光:打通云边端界限,为企业云上业务带来最优解

华为云开发者社区

华为 云服务

Nginx 在运维领域中的应用,看这一篇就够了

华章IT

nginx Linux 运维工程师

甲方日常 35

句子

工作 随笔杂谈 日常

Linux的上手命令

林昱榕

Linux 常用命令

二十、深入Python迭代器和生成器

刘润森

Python

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

优化使用BigTable的原则与方针-InfoQ