数据损毁!250 亿美金的 Pinterest,在数据库选型上的翻车经历。
原文 https://read.engineerscodex.com/p/how-pinterest-scaled-to-11-million
扩展 Pinterest 的经验教训
使用已知的成熟技术。Pinterest 当时涉足较新的技术,导致了数据损坏等问题。
保持简单。(反复出现的主题!)。
不要太有创意。团队采用的架构可以增加更多相同的节点来扩大规模。
限制选项。
数据库分片 > 集群。这减少了跨节点的数据传输,是件好事。
享受乐趣!新工程师能够在第一周内贡献代码。
2010 年 3 月:Closed beta 发布,1 名工程师
2011 年 1 月:10,000 名用户,2 名工程师
基本的 web server 技术栈(亚马逊 EC2、S3 和 CloudFront)
用于后端的 Django(Python)
4 台 web server 作为冗余
NGINX 作为反向代理和负载均衡。
1 个 MySQL 主数据库 + 1 个只读数据库
用于计数的 MongoDB
1 个任务队列和 2 个任务处理器,用于异步任务
2011 年 10 月:320 万用户,3 名工程师
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 集群
⚠️ 集群崩了
数据库集群 (Database Clustering) 是将多个数据库服务器连接起来作为一个系统共同工作的过程。
2012 年 1 月:1100 万用户,6 名工程师
亚马逊 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
Pinterest 如何手动分片数据库
数据库分片 (Database Sharding) 是一种将单个数据集分割成多个数据库的方法。 优点:高可用性、负载平衡、数据放置算法简单、易于拆分数据库以增加容量、易于定位数据
手动分片的一个小例子
然后,当数据库空间耗尽时,他们就会将其分片。
2012 年 10 月: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
Pinterest 的数据库结构 ID
分区 ID:哪个分区(16 位) 类型:对象类型,如针(10 位) 本地 ID:在表中的位置(38 位)