屌丝程序员如何打造日pv百万的网站架构


程序员如何一个人打造 日PV百万的网站架构 曹力 @ShiningRay 的特征 • 穷(买不起服务器,租不起带宽) • 野心大(其实目标是1000wPV) • 智商情商有限(不敢使用NB的工具和算法) • 有点小聪明 本人经历 • 2008年~2011年维护过糗事百科 • 2011年~2012年创办过博聆网 • 2012年至今在暴走漫画 应用场景 • 功能类似Blog、留言板 • 用户以浏览为主 • 同一时刻大部分用户看到的内容大体一致 • 有一定的交互(投票,留言,私信) • 需要SEO 同时 都很没有节操和下限 Let's start 简单的算术 • 1天=86400秒,12小时=43200秒 • 上午9点至下午9点占90%访问量 • 12小时900,000 PV≈20.8 PV/s • 20.8PV/s 相当于每个请求48毫秒 • 高峰时期会有2~5倍请求量 • ≥100rps 100RPS & 200ms Rails 进程 x 20 初始的架构 RailsRails Mysql Memcache Nginx RailsRails x 20 Nginx 一台服务器 穷 单一服务器的问题 •CPU吃紧(4核不错了) • 内存吃紧(8G高端啊) • 磁盘IO吃紧(RAID真奢侈) (2009年) 坑爹啊 难点 • 每个页面都需要显示用户信息 • 每个文章的顶埋数量变化非常快 根据观察 • 50%~80%访客是不登陆的 • 首页等几个页面占了50%以上访问量 • 页面上80%内容是不变的,剩下的主要为 用户相关信息 根据观察 • 用户关注的核心是内容,这部分是变化少 • 未登录用户交互更少,也不关注数据的准 确性 有变化的部分有变化的部分 策略 • 未登录用户直接返回缓存内容 • 分离页面上的静态内容和动态内容 – 先载入相对不常变的缓存的内容 – 然后加载经常变化的内容 Rails Mysql Memcache Nginx PageCache 浏览器 baozoumanhua.com//session.json/scores.json?ids=1, 2,3,4 异步载入优势 • 最快速地让用户看到他们最希望看到的页 面内容 • 子请求不进行模板渲染 • 子请求仍然可以进行缓存 • 子请求可以和HTTP API放在一起实现(可 单独进行优化,参见《Build Api Services Asynchronously》 - 黄 志敏 (@flyerhzm)) 简单的计算 • 首页等页面可缓存的页面占80%访问量 =80w PV • 即,实际只有20w的请求是需要单独处理的 完整页面 • 80%的用户是非登录用户,80w实时数据请 求可以被(短时)缓存。 • 20w用户信息的请求(亦可缓存) 一台服务器一天100wPV 挑战成功 计算有错误? 不要在意细节 有一天高帅富王尼玛找到我 曹力,我们来搞一票大的吧 日访问量1000万PV! 日访问量1亿PV! 高帅富的开发方式 系统性能不够?! 多买几台服务器! 我眼中的容量规划 老板眼中的容量规划 1台服务器=100w PV 10台 = 10 * 100w PV = 1000w PV 100台 = 1亿 PV 1亿 PV = $$$$$$$$$.... Challenge1. 多台Rails服务器与缓存 caches_page的问题 • 只能使用文件系统 • 多机共享则必须使用NFS •NFS需要进行较多的配置、挂载 • 如果不进行定期清理,文件数量会不断增 加 • 如果在文件数量很多,遍历目录进行清理 消耗时间太长 • 优势:省内存。 文件系统→Memcache Memcache的优势 • 配置简单 • nginx内建对memcache后端的支持 • 自动失效 SuperCache https://github.com/ShiningRay/super_cache super_caches_page :index use Rails.cache Rails Mysql Nginx MemCache Rails Rails Challenge2. 缓存的横向扩展 nginx+多台memcache的问题 • nginx不支持使用一致性哈希来选择 memcache后端(可以使用第三方模块) Membase to rescue Membase特点 • 完全兼容Memcached协议 • 横向扩展性极强 • 任意节点可以读取到全部数据 •GUI操作简便 • 高可用性,自动故障转移 Couchbase/Membase 控制台 Rails Mysql Master Membase Nginx Nginx Nginx Membase Membase Rails Rails Rails RailsRails Mysql Slave Challenge3. Dog Pile Effect What's Dog Pile Effect ARails Rails Rails Rails A A A A ?Rails Rails Rails Rails A A A A 解决方案 • WriteThrough:不失效缓存,当更新数据 后直接更新缓存 • Lock:当缓存对象过期时,只有获得锁的 进程才能更新缓存 过期A Rails 1 Rails 2 A A lock 无法获取锁 使用过期的内容 Lock 机制 Distributed Lock实现方式 • Memcache的原子操作 • Redis的原子操作 SuperCache super_caches_page :index, :lock => true 日1000万PV达成! 总结 • 使用80/20原则进行缓存 • Membase替换Memcache • 使用锁来防止Dog Pile Effect 谢谢观赏 http://baozoumanhua.com One More Thing 冇问题 官方许可原糗事百科代码开源啦! https://github.com/qiushibaike/moumentei by @ShiningRay
还剩56页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

n2nc

贡献于2016-01-19

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf