数据损毁!250 亿美金的 Pinterest,在数据库选型上的翻车经历

原文链接

Pinterest 是一个以图片为主的社交网络,用户可以将图片保存或 "钉 / pin" 在自己的图板上。Pinterest 在 2019 年上市,目前市值 250 亿美金。本文内容主要根据 2012 年 Scaling Pinterest 的分享。

file

2012 年 1 月,Pinterest 的月独立用户数量达到 1170 万,而当时只有 6 名工程师。 Pinterest 于 2010 年 3 月推出,是当时月活用户突破 1000 万最快的公司

扩展 Pinterest 的经验教训

  • 使用已知的成熟技术。Pinterest 当时涉足较新的技术,导致了数据损坏等问题。
  • 保持简单。(反复出现的主题!)
  • 不要太有创意。团队采用的架构可以增加更多相同的节点来扩大规模。
  • 限制选项。
  • 数据库分片 > 集群。这减少了跨节点的数据传输,是件好事。
  • 享受乐趣!新工程师能够在第一周内贡献代码。

2010 年 3 月:Closed beta 发布,1 名工程师

Pinterest 于 2010 年 3 月推出,当时只有一个小型 MySQL 数据库、一个小型 web server 和一名工程师(还有两位联合创始人)。

file

2011 年 1 月:10,000 名用户,2 名工程师

九个月后的 2011 年 1 月,Pinterest 的架构已经发展到可以处理更多用户。当时他们仍然只接受邀请,只有两名工程师。

他们拥有:

  • 基本的 web server 技术栈(亚马逊 EC2、S3 和 CloudFront)
  • 用于后端的 Django(Python)
  • 4 台 web server 作为冗余
  • NGINX 作为反向代理和负载均衡。
  • 1 个 MySQL 主数据库 + 1 个只读数据库
  • 用于计数的 MongoDB
  • 1 个任务队列和 2 个任务处理器,用于异步任务

file

2011 年 10 月:320 万用户,3 名工程师

从 2011 年 1 月到 2011 年 10 月,Pinterest 的增长速度极快,用户数量每隔一个半月就翻一番。

他们在 2011 年 3 月推出的 iPhone 应用程序是推动这一增长的因素之一。

当事物快速发展时,技术出现问题的频率会超出你的预期。

这时Pinterest 犯了一个错误:他们把架构弄得过于复杂了

他们只有 3 名工程师,但却采用了 5 种不同的数据库技术来存放数据。

他们既要手动对 MySQL 数据库进行分片,又要使用 Cassandra 和 Membase(现在的 Couchbase)对数据进行集群。

他们「过于复杂的技术栈」:

  • Web server 栈(EC2 + S3 + CloudFront)
  • Pinterest 开始使用 Flask(Python)作为后端服务器
  • 16 台 web server
  • 2 个 API 引擎
  • 2 个 NGINX 代理服务器
  • 5 个手动分片的 MySQL DB + 9 个只读
  • 4 个 Cassandra 节点
  • 15 个 Membase 节点(3 个独立集群)
  • 8 个 Memcache 节点
  • 10 个 Redis 节点
  • 3 个任务路由器 + 4 个任务处理器
  • 4 个 Elastic Search 节点
  • 3 个 Mongo 集群

file

⚠️ 集群崩了

数据库集群 (Database Clustering) 是将多个数据库服务器连接起来作为一个系统共同工作的过程。

从理论上讲,集群可以自动扩展数据存储、提供高可用性、自由负载平衡,并且不会出现单点故障。

遗憾的是,在实践中,集群过于复杂,升级机制困难,而且存在一个大的单点故障 (SPOF)。

file

每个 DB 都有一个集群管理算法,在 DB 之间进行路由。

当一个数据库出现问题时,就会添加一个新的数据库来替代它。

理论上,集群管理算法应该可以很好地处理这个问题。

但实际上,Pinterest 的集群管理算法中存在一个 bug,破坏了所有节点上的数据,破坏了数据该如何重新平衡,并产生了一些无法修复的问题

file

Pinterest 的解决方案是什么?

从系统中移除所有集群技术(Cassandra、Membase)。全面采用 MySQL + Memcached(更成熟)。

MySQL 和 Memcached 都是久经考验的技术。Facebook 利用这两种技术创建了世界上最大的 Memcached 系统,每秒轻松处理数十亿次请求。

2012 年 1 月:1100 万用户,6 名工程师

2012 年 1 月,Pinterest 的月活跃用户约为 1100 万,日活跃用户在 1200 万到 2100 万之间。

此时,Pinterest 已经花时间简化了他们的架构。

他们删除了当时不太成熟的方案,如集群和 Cassandra,取而代之的是成熟的方案,如 MySQL、Memcache 和分片。

他们简化后的技术栈:

  • 亚马逊 EC2 + S3 + Akamai(取代 CloudFront)
  • AWS ELB(弹性负载平衡)
  • 90 个 web servers + 50 个 API 引擎(使用 Flask)
  • 66 个 MySQL DB + 66 个只读
  • 59 个 Redis 实例
  • 51 个 Memcache 实例
  • 1 个 Redis 任务管理器 + 25 个任务处理器
  • 分片式 Apache Solr(取代 Elasticsearch)
  • 移除 Cassanda、Membase、Elasticsearch、MongoDB、NGINX

file

Pinterest 如何手动分片数据库

数据库分片 (Database Sharding) 是一种将单个数据集分割成多个数据库的方法。 优点:高可用性、负载平衡、数据放置算法简单、易于拆分数据库以增加容量、易于定位数据

Pinterest 首次对数据库进行分片时,需要冻结新功能发布。在几个月的时间里,他们以渐进和手动的方式对数据库进行了分片:

file

团队删除了数据库层中的表 Join 和复杂查询。他们添加了大量缓存。

由于跨数据库维护唯一约束需要额外的工作,他们将用户名和电子邮件等数据保存在一个巨大的、未分片的数据库中。

这个数据库下的所有表都存在于所有分片中。

手动分片的一个小例子

由于他们有数十亿个 "pin",他们的数据库索引会耗尽内存。

他们会将数据库中最大的表转移到自己的数据库中。

然后,当数据库空间耗尽时,他们就会将其分片。

2012 年 10 月:2200 万用户,40 名工程师

2012 年 10 月,Pinterest 的月度用户约为 2200 万,但他们的工程团队却翻了两番,达到了 40 名工程师。

架构是一样的。他们只是增加了更多相同的系统。

  • 亚马逊 EC2 + S3 + CDN(EdgeCast、Akamai、Level 3)
  • 180 台 web servers + 240 个 API 引擎(使用 Flask)
  • 88 个 MySQL DB + 88 个只读
  • 110 个 Redis 实例
  • 200 个 Memcache 实例
  • 4 个 Redis 任务管理器 + 80 个任务处理器
  • 分片式 Apache Solr

file

他们开始从 HDD 转向固态硬盘 SSD。

一个重要的教训是:有限的、经过验证的选择是件好事

坚持使用 EC2 和 S3 意味着他们只有有限的配置可供选择,从而减少了麻烦,提高了简便性。

与此同时,新实例可以在几秒钟内准备就绪。这意味着他们可以在几分钟内添加 10 个 Memcache 实例。

Pinterest 的数据库结构 ID

和 Instagram 一样,Pinterest 也有一个独特的 ID 结构,因为他们有分片数据库。

他们的 64 位 ID 看起来像

file

分区 ID:哪个分区(16 位) 类型:对象类型,如针(10 位) 本地 ID:在表中的位置(38 位)

这些 ID 的查找结构是一个简单的 Python 字典。

数据库表

它们有对象表和映射表。

对象表适用于 pin、板块、评论、用户等。它们有一个映射到 MySQL blob(如 JSON)的本地 ID。

映射表用于对象之间的关系数据,如将板块映射到用户或将赞映射到 pin。它们有一个映射到完整 ID 和一个时间戳的完整 ID。

为了提高效率,所有查询都使用 PK(主键)或索引查找。他们删除了所有 JOIN。

译者语,Pinterest 高速发展的时期正好也出现了各种新数据库系统。尤其是 NoSQL 这块,除了 Pinterest 提到过的这些,还有 Riak, Tokyo Cabinet, Voldemort 等。 还是那句话,我们应该采用无聊的技术去构建创新的产品,而不是倒过来。


💡 更多资讯,请关注 Bytebase 公号:Bytebase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/592844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML----JavaScript操作对象BOM对象

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型概述 BOM(浏览器对象模型)是JavaScript中的一个重要概念,它提供了一组用于控制浏览器窗口和页面内容的…

力扣热题100道-矩阵篇

矩阵 73.矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法**。** 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例…

胡润研究院发布《2023胡润中国最具历史文化底蕴品牌榜》

胡润研究院发布《2023胡润中国最具历史文化底蕴品牌榜》,前十名分别是片仔癀、同仁堂、贵州茅台、五粮液、中国银行、中华、黄山、农业银行、建设银行、汾酒。 榜单调研范围涵盖中国内地具有60年以上历史的为消费者提供产品或服务的品牌,综合考察品牌历史…

C# 语法进阶 委托

1.委托 委托是一个引用类型,其实他是一个类,保存方法的指针 (指针:保存一个变量的地址)他指向一个方法,当我们调用委托的时候这个方法就立即被执行 关键字:delegate 运行结果: 思…

TikTok舞台背后:短视频如何打破艺术界界限?

TikTok,这个以短视频为媒介的平台,正成为全球年轻一代表达创意的重要舞台。然而,其影响不仅仅停留在娱乐领域,更在艺术界引起了巨大的关注。本文将深入探讨TikTok是如何在短视频的形式下打破传统艺术界的界限,为创作者…

欢迎提交pr共同改进项目, pr的含义?

"提交PR"在软件开发和编程领域是一个常用术语,特别是在使用版本控制系统如Git时。这里的“PR”指的是“Pull Request”,它是一种通知项目维护人员您已经完成了一些代码改动并希望将这些改动合并到主项目中的方式。简单来说,当您对一…

【银行测试】超细支付功能测试+测试点总结分析(详全)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、支付功能怎么测…

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…

golang学习专栏

GOLANG专栏 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教程 MySQ…

Java 读取超大excel文件

注意&#xff1a;此参考解决方案只是针对xlsx格式的excel文件&#xff01; Maven <dependency><groupId>com.monitorjbl</groupId><artifactId>xlsx-streamer</artifactId><version>2.2.0</version> </dependency>读取方式1…

安装elasticsearch、kibana、IK分词器、扩展IK词典

安装elasticsearch、kibana、IK分词器、扩展IK词典 后面还会安装kibana&#xff0c;这个会提供可视化界面方面学习。 需要注意的是elasticsearch和kibana版本一定要一样&#xff01;&#xff01;&#xff01; 否则就像这样 elasticsearch 1、创建网络 因为我们还需要部署k…

java常用数据结构

List&#xff1a;ArrayList 和 LinkedList 1、ArrayList 和 LinkedList都是非线程安全 2、ArrayList 可以直接根据下表定位元素&#xff0c;查找速度快&#xff0c;但是修改元素慢&#xff1b;LinkedList 查找元素必须从第一个开始逐个查找&#xff0c;查找速度慢&#xf…

QT上位机开发(会员管理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了ini文件的解析办法&#xff0c;通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外&#xff0c;另外一种经常出…

GC6150 5V低压步进电机驱动芯片,低噪声、低振动 应用于摄像机,机器人 医疗器械等产品中。

GC6150是双通道5V低压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统&#xff0c;该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口&#xff0c;客户可以方使地调整驱…

【SpringBoot3】命令行运行jar包报错可能的一些原因

端口号冲突&#xff1a; 有其他的web程序在运行&#xff0c;占用了8080端口没有主清单属性&#xff1a; 在打包jar包前&#xff0c;没有加入打包的插件spring-boot-maven-plugin&#xff0c;参考1.SpringBoot入门的第一个完整小项目&#xff08;新手保姆版教会打包&#xff09;…

【EI会议征稿通知】第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024)

第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024&#xff09; 2024 5th International Conference on Electrical, Electronic Information and Communication Engineering (EEICE 2024) 第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024&#xff09;将于20…

docker安装esrally教程

本来用源码安装&#xff0c;首先要安装git,python,jdk&#xff0c;还要配环境特别繁琐&#xff0c;好不容易安装好后运行报如下错误&#xff0c;在官网和github搜不到解决方案&#xff0c;无奈之下只能用docker安装。 [ERROR] Cannot race. Error in load generator [0]Cannot…

redis容灾的方案设计

背景 今年各个大厂的机房事故频繁&#xff0c;其中关键组件Redis是重灾区&#xff0c;本文就来看下怎么做Redis的多机房容灾 Redis多机房容灾方案 1.首先最最直观的是直接利用Redis内部的主从数据同步来进行灾备&#xff0c;但是由于Redis内部的主从实现对机房间的网络延迟等…

基于ssm的剧本杀预约系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于剧本杀预…

el-table表格动态添加列。多组数据拼接和多层级数据的处理

提示&#xff1a;el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中&#xff0c;为避免闪屏&#xff0c;可以表格数据统一渲染总结 前言 需求&#xff1a;富文本编辑器 一、多组数据拼接 <template><div class"test">…