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

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

原文链接

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

STM32 RT-Thread 系统分析(1)- 启动文件 RT-Thread STM32 系统分析(1)- 启动文件前言基本信息前言说明三级目录 前言 基本信息 名称 描述说明 RT-Thread Studio 软件版本 版本: 1.1.3 RT-Thread 系统版本 4.0.2 STM32CubeIDE 软件版本 1.4.0 STM32芯片型号 STM32F013VG 前言说明 使用了STM32CubeIDE 和 RT-Thread Studio 建立了相同型号芯片的工程,对比其中启动文件内容差异如下: 左侧是RT-Threa 阅读详情

相关推荐

HDI盲埋孔设计规范:高速PCB信号完整性落地指南

盲埋孔是高密度互连(HDI)PCB实现高速信号完整性的关键技术,其本质是通过控制过孔stub长度、优化回流路径和提升布线密度,解决GHz级信号在传统通孔结构下出现的谐振、串扰与EMI超标问题。其设计核心在于叠层物理约束、电气参数建模与工艺能力协同,涉及stub长度计算、反焊盘尺寸推导、孔壁粗糙度Rz控制等关键指标。广泛应用于DDR4、PCIe Gen4、USB3.2等高速接口的PCB设计中,尤其在车载ADAS、5G基站及FPGA载板等对SI/PI要求严苛的场景中成为刚性门槛。

weixin_34416754的博客 438

Neural Collaborative Filtering学习笔记

学习《Neural Collaborative Filtering》。该论文介绍了利用深度神经网络去建模user-item interaction,提出了NCF框架,并实例化GMF、MLP、NeuMF。 MF出现的问题 1.假设所有隐藏因子相互独立,MF可以被看做是线性模型(在做内积时,相当于对应位置的权重都是1),仅仅是对浅层特征做处理,结果偏差较大。2.MF的隐藏因子不好确定。对于一个复杂的user-item interaction,低维的效果不好,但是对于一个稀疏矩阵,增加隐藏因子的数量变成高维可能会

aaHua_ 2057

similarity network fusion for aggregating data types on a genomic scale

基因组规模上的聚合数据类型的相似性网络融合 摘要:         近期的技术已经使收集不同类型的全基因组数据十分划算,结合这些数据去创建一个给定的疾病或生物过程的一个全面视图的计算方法是有必要的。相似网络融合(SNF:similarity network fusion)通过创建每一个可利用的数据类型的样本(如,患者)的网络可以解决这个问题。例如,创建一个给定一群患者疾病的全面视图,SNF计算

augustar学习笔记 7870

一文看懂Pinterest如何构建时间序列数据库系统Goku

导读:在Pinterest,开发人员依靠Statsboard来监控系统并发现问题,因此,可靠有效的监控系统对于开发速度来说非常重要。之前,Pinterest使用OpenTSDB来提取和提供指标数据。然而,随着Pinterest的发展,服务器也从数百个增加到数千个,每秒产生数百万个数据点,而且这个数字还在继续增长。\\虽然OpenTSDB在功能上运行良好,但其性能随着Pinterest的增长而降低,...

weixin_34101229的博客 230

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

VS code 调试显示preLaunchTask“g++“已终止,退出代码为-1。 生成‘... .exe‘文件错误

总结: 以后每个工程都需要按照这样的流程:创建一个.c/.cpp文件 -> F5运行 -> 配置tasks.json文件-> launch.json文件 -> 运行

qq_45151652的博客 2516

推荐系统常用数据集整理

推荐系统常用数据集整理 1. MovieLens dataset url: https://grouplens.org/datasets/movielens/ 描述: 推荐系统领域非常非常经典的数据集。MovieLens (https://movielens.org/) 是一家收集用户(user)对电影(movie)的评分并根据海量评分数据为用户提供电影推荐服务的网站。MovieLens推荐数据...

da_kao_la的博客 5016

ABAP 平台下配置 OAuth 2.0 Authorization Code 授权类型的完整指引

本文是面向ABAP管理员和SAP开发者的OAuth 2.0授权码配置实战指南。文章详细介绍了在ABAP平台启用Authorization Code的完整流程,包括前置条件检查(如TLS配置和系统用户准备)、SOAUTH2事务码中各字段配置要点(授权类型启用、Redirect URI设置、授权码有效期等)、Scope分配规则以及验证方法。通过一个销售订单OData接口的实际案例,说明了如何将抽象规范转化为具体配置。最后提供了多种验证方式(事务码测试、端点测试和Postman测试)以及关键配置参数(如授权码有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 298

机器学习数据集

前言数据集算是比较重要的学习资料了吧,在这里汇总一些好用的数据集以便使用, 关于一些内容可以参考一下知乎的提问UCI常用数据集UCI 一个不错的数据集下载网站 此处介绍几个点击;想比较高的数据集,后面有下载和存储的代码以及有关问题的说明.使用方式点击官方网站,你可以看到以下内容 可以看到右边有两个排行榜,最右边的是历史点击率的排行榜,位于该榜左边的也就是网页中间的是最新捐赠

FontTian的博客 1万+

让 ABAP 程序天生可翻译:Text Symbols 与 Text Pool 从入门到工程化落地

ABAP 国际化实践:Text Symbols 的工程价值与落地方法 摘要: 本文系统阐述了 ABAP 开发中 Text Symbols 的核心价值与实践方法。通过解耦程序逻辑与语言文本,Text Symbols 实现了代码国际化,避免了硬编码带来的维护难题。文章详细介绍了 Text Pool 结构、两种引用方式(独立引用 TEXT-001 和附着式 '(001)'),以及 SE38 和 SE63 的翻译流程。特别强调最大长度预留、术语统一等工程实践,并提供了 READ TEXTPOOL 自动化检查方案。最

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

【微服务】SpringBoot 整合 FastExcel 实现导入导出操作详解

SpringBoot 整合 FastExcel 实现导入导出操作详解

congge 4236

数据集整理汇总附链接(深度学习)

之前遇到的一些数据集,自己收集一下,归到一起使用方便,可能不是很全,持续更新汇总。。。 1. Image Datasets — 图像数据集 Dataset Link MNIST http://yann.lecun.com/exdb/mnist/ CIFAR-100 http://www.cs.utoronto.ca/~kriz/cifar.html Imagenet htt...

y459541195的博客 2228

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 2016

干货|免费文本语料训练数据集

关于Word2Vec,上篇文章文本分类特征提取之Word2Vec中已有还算详尽的叙述。简单总结下:word2vec是Google在2013年提出的一款开源工具,其是一个Deep Learning模型(实际上该模型层次较浅,严格上还不能算是深层模型,如果word2vec上层再套一层与具体应用相关的输出层,如Softmax,便更像是一个深层模型),它将词表征成实数值向量,采用CBOW(Continuo

AI深入浅出 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 475

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 426

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【基于 WebSocket 的多用户网页五子棋】—— 数据管理模块

但行好事,莫问前程

qq_42996461的博客 246

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 378

OpenClaw 深度调查:把 AI 助手做成你自己的控制平面

对 openclaw/openclaw 的完整技术尽调:Gateway 架构、Agent 运行时、工具与沙箱、30 个消息通道、181 个插件、安全信任边界、工程代价与采用建议。17 章 / 10 张图,全部数字标注口径,数据截至 2026-10-31。

厚积薄发 277

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 175

TransactionInactiveError:await 之后事务已经不活跃了

TransactionInactiveError 出现于 IndexedDB 事务已结束(非 active 状态)时调用 put、get 等操作。常见于 await 后或 setTimeout 中执行请求,因任务已完成,事务已提交或进入 finished 状态。请求必须在创建事务的同一任务中挂起,否则无效。解决方法:在 onsuccess 回调内同步发起后续操作,或提前将所有请求挂入事务。避免在异步上下文中使用事务操作,确保请求在事务活跃期内完成。

qq_40822000的博客 158

云计算课程小组PPT汇报任务书

36人分为6组,每组6人;形式:生活案例调研 + 理论解读;汇报时长7‑9min;PPT建议10‑14页。

Michelle8023的博客 202

大表 ALTER TABLE 怎么做?NineData OnlineDDL 配置与执行实践

介绍NineData OnlineDDL大表变更实践,涵盖执行策略、切表控制、拷贝批次与可视化进度追踪。

dbasenewbie的博客 294

软件项目交付时,源代码之外还应该交付哪些技术资料?

软件项目交付时,除可运行程序外,还应核对源代码、数据库结构、接口文档、部署运维、测试验收和账号资产。本文从实际交付环节拆解完整资料清单,并说明合同如何约定交付范围、知识产权与维护边界。

chengduyoushu的博客 299

Axum 初步入门学习笔记

)自定义错误实现后,可以直接作为Result的ErrAxum 是一个构建在 Tokio、Tower、Hyper 之上的 Rust Web 框架,核心能力是:Router 路由、Extractor 提取器、Tower 中间件、IntoResponse 响应机制、State 共享状态。那张分层架构图是“地图”不是“说明书”:它帮你建立全局观,但 Service、Repository、数据库、Redis、MQ 都是你自己在 Handler 内部调用的业务/基础设施层,不是 Axum 自带的。

weixin_43219667的博客 165

MySQL报Too many open files?句柄耗尽的排查与参数配置

文章讲清 max_connections 与 open_files_limit 两个额度、句柄被谁占走、分区表为什么最容易踩,给出从 error log 到 /proc/pid/limits 的定位顺序与句柄预算算法。

「一个在数据库赛道上边学边分享的学妹」——聚焦国产数据库/信创方向、分享学习笔记、踩坑经验和行业观察。 327
上一篇: 数据损毁!250 亿美金的 Pinterest,在数据库选型上的翻车经历
下一篇: GitHub 数据库 15 年进化史:幕后英雄如何成就 Copilot 传奇
Bytebase
博客等级 码龄5年 1348粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值