文档章节

Scaling Pinterest

mohan_zl
 mohan_zl
发布于 2015/07/10 13:58
字数 679
阅读 33
收藏 0

Pinterest

Evolve Process

  1. Amazon ec2 + s3, edge cast, Akamai, level3
  2. 180 web engines, 240 api engines
  3. 88 mysql db, with 1 slave each
  4. 110 redis, 200 memcache
  5. 4 redis task manager, 80 task processors
  6. shared solr

中间使用过Cassandra, MongoDB, MemBase, Elastic search, task queue, task router, 但最终抛弃,原因:

  1. 架构应该实现,但需要扩展时,只需要掏钱加机器就可以解决
  2. 选择成熟,社区支持好,简单,免费的开源产品,而且非常重要的一点,fail in their special way

cluster VS shared

选择了shard,主要觉得cluster太复杂,发生故障时难处理等。

cluster

Cassandra, MemBase, HBase

结论:太复杂,并且错误模式太多

  1. cluster manager是SPOF
  2. fail modes: data rebalance break, data corruption across all nodes, improper balancing that cannot be easily fixed, data authority fail.. etc

sharding

结论:简单,可控。 缺点:join/transaction等需要应用层处理,scheme changes需要规划

进化过程:

  1. 1 DB + Foreign keys + Joins
  2. 1 DB + Denormalized + Cache
  3. 1 DB + Read slaves + Cache
  4. Several functionally sharded DBs + Read slaves + Cache (垂直切分)
  5. ID shared DBs + Read slaves + Cache (水平切分)

user table不做shared,通过user name和email确保唯一性,使用一个大数据库保存

通过cache解决read slave延迟问题

切分策略:参考Cassandra ring model, MemBase, Twitter's Gizzard

数据库表设计:Object and Mapping。Object如Board, Pin以Blob+版本号存储,Mapping存储映射关系,如UserHasPin, UserHasBoard,同时映射是多对多的,以支持反向查找

Scripting

使用脚本,将老的没分片架构,迁移到新的分片架构。工程量很大,足足花了4、5个月(预期2个月)。应用程序必须同时对两个系统插入数据。

Pyres,一个到Github Resque的python接口队列,建立在redis之上。在迁移中出现大量错误,为了保证数据处理中不会出现暂时性错误如用户丢失board,必须重复运行任务。

(个人觉得有点挫的,有没有更好的方法?)

未来方向

基于service的架构,如follower service,只处理follower request。

  1. 现有架构,所有服务连接到mysql和memcache,服务之间没有分离。30K个与memcache的连接就耗用了大量的内存。而且现有架构,所有工程师拥有所有的server权限,这是很不安全的。
  2. 基于service的架构,可以将每个service的server控制在一个范围,同时团队也可以围绕着service进行建立。

Pinteret的经验教训

  1. keep it simple, keep it fun
  2. cluster management is a SPOF
  3. the least data you move across your nodes, the more stable your architecture
  4. a service oriented architecture rules
  5. don't freak out about losing a little data. Pinterest keep data in mem and write it periodically. (不同业务不一样,如电商肯定不能这么干的,数据丢了还得了?)

© 著作权归作者所有

上一篇: Lambda Architecture
下一篇: eclipse开发web应用
mohan_zl
粉丝 1
博文 3
码字总数 1150
作品 0
杭州
架构师
私信 提问
Pinterest 首位产品经理:爆发式增长背后的 5 大经验总结

编者注 本文由数据分析公司 GrowingIO 编译,选自前 Pinterest 产品主管 Sarah Tavel 的领英文章。 原文地址: https://www.linkedin.com/pulse/five-lessons-from-scaling-pinterest-sarah...

张溪梦 Simon
2017/09/15
0
0
Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问

Pinterest一直保持着指数增长,每一个半月都会翻一翻。在两年内,他们实现了从0到数百亿的月PV;从开始的两个创始人加一个工程师增长到现在超过40个工程师,从一个小型的MySQL服务器增长到1...

Jean
2013/12/29
0
0
Pinterest架构之路-两年内从0到10亿月访问量

前言 Pinterest已经可以驾驭每2.5个月流量就翻一倍的指数增长,他们实现了在2年内每月pv从0到10亿的结果。从2个创始人加1位工程师到超过40名工程师,从只有1台MySQL服务器到180台web服务器、...

swingcoder
2015/07/27
0
1
《Pinterest如何扩展IT架构》

当一家网站突然开始流行,用户数每月增长数倍时,最常见问题的就是服务器崩溃。全球最流行的图片兴趣分享网站——Pinterest的工程师在本周四的Surge大会上分享了他们的经验教训和解决之道。 ...

李辉
2012/09/29
0
0
Pinterest的PWA实践

摘要:Pinterest 在他们新的移动端网页体验中使用了 PWA。在这篇文章中,作者对 Pinterest 是如何通过保持 Javasrcipt 包的精简和通过 Service Workers 保持网络弹性来确保该网站在移动设备上...

前端之巅
2018/01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js动态设置元素高度

this.$refs.xxx.style.height= this.contentHeight; 元素需要绑定

Carbenson
49分钟前
2
0
今天的学习

今天学到了ci框架中的查询语句的where条件语句: 1、$this->db->select('')->from('')->where('id = ??')->get()->result_array();2、$this->db->select('')->from('')->where('id', '??'......

墨冥
59分钟前
2
0
MySQL在高并发下的订单撮合、系统使用、共享锁与排他锁保证数据一致性

前序 距离上次择文发表,两月余久。2018年也即将要结束了,目前的工作依然是与区块链应用相关的,也很荣幸在9月初受邀签约出版暂名为《区块链以太坊DApp实战开发》一书,预计在明年年初出版。...

我最喜欢三大框架
今天
2
0
深入理解Flutter多线程

该文章属于<简书 — 刘小壮>原创,转载请注明: <简书 — 刘小壮> https://www.jianshu.com/p/54da18ed1a9e Flutter默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。 ...

刘小壮
今天
3
0
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

//有点投机啦 import java.util.ArrayList; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList <Integer> s=new ArrayLi......

南桥北木
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部