SlideShare una empresa de Scribd logo
1 de 49
豆瓣网技术架构的
  发展历程
      2009.4
      洪强宁
hongqn@douban.com

        1
豆瓣网简介




  2
一些数据
•   2.8M注册用户,约1/4 活跃用户
•   千万级非注册用户
•   20M动态请求,峰值500-600/sec
•   23普通PC服务器 (1U*15 /2U*8 )
•   12台




                  3
单服务器
• 1 台 1U服务器(frodo)
    – 单核 AMD Athlon 64 1.8GHz
    – 1G内存 ,160G SATA *2
•   Gentoo Linux
•   MySQL 5
•   Quixote (a Python web framework)
•   Lighttpd + SCGI(shire)
•   Memcached(!)
                     4
Internet




                    Lighttpd


        SCGI


        App
                              FS




MySQL          Memcache            Static Files

                          5
Gentoo Linux
• 容易维护
 – emerge mysql
 – ebuild 便于管理 patch
• 只安装需要的东西
• 安全性
 – GLSA(Gentoo Linux Security Advisories)



                     6
MySQL
• The world most popular open source
  database
• 写少读多/写多读少             MyISAM
• 读写并发高          InnoDB
• Replicate for backup




                  7
Python
•   开发迅速
•   Battery included
•   第三方库成熟
•   社区成长中
    – CPUG http://python.cn/




                       8
Quixote
• 简单,轻量,易于实现REST风格的URL
• 当时还没有 Django, TurboGears, Pylons这些选择,只有一个笨重
  的ZOPE(2005年3月)
• http://www.douban.com/subject/1000001




                      9
Lighttpd
• 很好的动态和静态性能
• 原生SCGI支持
 – SCGI: 一个简化版本的FastCGI, 有Quixote开
   发者开发
• 所有的请求都通过80端口的lighttpd进程
  分发,动态内容走SCGI到localhost上的
  Quixote进程


                10
Memcache
• 从上线就在使用,有效减轻MySQL负担
• 对libmemcache做了python封装(使用
  Pyrex), 性能是纯python版的 3x+
 – [以下代码略]




              11
1.2M 时问题出现(2006)
• 1.2M 动态请求/天
• 磁盘IO成为瓶颈
• 需要寻找新机房




                12
解决方案
• 购买两台1U服务器
 – Pippin和meriadoc
 – 双核, 4G内存, 250G SATA *3
• 一台作为应用服务器,一台作为数据库服
  务器
• 迁移到双线双IP机房,使用DNS解析不同
  网段IP
• 开始多人协作开发,frodo作为开发用机
• (subversion, trac, etc…)
                13
几点发现
• 数据库的内存分配对性能影响重大
 – Innodb_buffer_pool_size
• 磁盘随机寻道速度比吞吐量更重要
• 网上找来的IP段分布很不靠谱




                    14
1.5M 时问题出现
• 1.5M动态请求/天,尚未达到性能瓶颈
• 机房不靠谱,频繁故障
• IP段分布数据不靠谱,用户反映访问缓慢




          15
解决方案
• 换到靠谱的机房,多线单IP(BGP)
• 购买了一台新的服务器(arwen)
 – 74G 10000转 SATA *3
 – 作为数据库服务器
 – 开始使用专门的服务器作为后台计算




            16
Internet
                         解决方案



     Lighttpd
                                                    Data Mining
                  SCGI
                                       write           read
                  App


                                  MySQL replicate    MySQL
                                  Master             Slave
Static Files      Memcache


                             17
2M时问题出现
• 2M动态请求/天
• 静态文件服务磁盘IO成为瓶颈
 – 上百万的小图片(用户头像,封面图片,etc…)
• 数据库服务器接近瓶颈




             18
2M 解决方案
• 购买三台服务器,双核,4G, 250G SATA*3
• 将图片从一个大目录切分成10000个文件一个目
  录
 – mod_rewrite保持URL不变
• 独立的图片lighttpd进程,启用mod_memcache
  模块,缓存小图片
 – 减小磁盘IO对页面访问的影响
• 将应用服务从web服务器独立出去
 – 把更多的内存分配给静态文件服务
• 增加一个只读数据库
                  19
只读数据库
• Store增加farmr属性,为一个可用的只读数据库
  游标
• 头疼的replicate delay问题
 – 辅库复制需要时间
 – 更新主库后,下一个请求往往就是要读数据(更新数据
   后刷新页面)
 – 从辅库读会导致cache里存放的是旧数据
   • 灵异事件!
• 解决方法:更新数据库后,在预期可能马上用得
  到的情况下,主动刷新缓存
 – 。。。不完美,but it works
                  20
避免replicate delay引起的灵异事
             件
• 代码段略
• [key : flush_subject, 中mc.set的时候带
  上了主库的数据库游标 ]




                 21
2.5M时问题出现
• 2.5M动态请求/天
• 数据库磁盘空间不够了
 – 我上/九点 数据量庞大
• SATA 盘故障率高
• 数据库压力增大




               22
解决方案
• Scale up, 购买四台 IU服务器
 – 16G内存,147G SCSI*2 + 500G SATA
 – SCSI 做RAID-0
• 用MySQL slave 来保证冗余
• 增加memcached节点数目
• 所有的MyISAM 表都改为InnoDB表
 – 提高内存利用效率
• 将全文搜索移至Sphinx
                 23
5.2M时问题出现
• 5.2M 动态请求/天
• 图片流量费用成为最大成本
• Web服务器的磁盘IO还是会影响动态页面
  性能
• 应用服务器进程数不够了
• 机柜空间不够了


           24
5.2M 解决方案
• 天津的机房便宜一些 ☺
  – 承担图片流量
  – 后台数据挖掘计算
  – 容灾备份
• 购买3台 1U服务器: 4核,32G内存,1T SATA*3
• 优化前端,启用otho.douban.com和
  lotho.douban.com域名
  – Lighttpd 1.5 with aio support
  – 部署LVS
• Scale up: 应用服务器内存升级 4G -> 8G
                         25
26
北京        天津




     27
6.4M时问题出现
• 6.4M 动态请求/每天 (5M PV)
• 应用服务器成为瓶颈
 – 内存:占用总是增长,似乎有内存泄露
 – CPU: memcache 对象序列化/反序列化




               28
6.4M 解决方案
• 第二台应用服务器上线
 – Lighttpd 的 mod_sgi 只能 round-robin
 – Lighttpd 1.5 不稳定
 – mod_proxy
   • Proxy.balance = fair(load based, passive
     balancing)
• 当进程占用内存超过阀值,当前请求完成
  后自杀
• 使用spread聚合日志

                       29
30
11M 时问题出现
•   11M 动态请求/天 (3台应用服务器)
•   跨机房写入成为后台计算的瓶颈
•   Sphinx 的定制性不够
•   相册产品开发中,需要解决图片存储问题
•   灵异现象: 网站变慢,积攒了大量连接得不
    到处理,load却不高


             31
11M 解决方案
• 数据库分库
  – 九点相关表独立出来
  – 数据挖掘相关表独立出来,主库放在天津,北
    京只读
• Sphinx -> Xapian
• 使用MogileFS



                     32
11M 解决方案
• Libmemcache -> libmemcached, 使用
  consistent hash 降低memcache 调整代价
  – 修正libmemcache的consistent hash相关bug
• 应用服务器升级至4 Core CPU
  – 修正libmemcache的failover相关bug
• 用nginx 替代lighttpd做load balance
• 最后发现罪魁祸首是spread, 冏
  – 改成用nginx 记录日志


                    33
34
多数据库连接
• 表名全局唯一,维护一个表名至数据库的
  映射




• 在数据库间挪表变得容易,在主辅库间平
  衡负载也变得容易
          35
13M 时问题出现
• 13M 动态请求/天
• 计划将所有静态图片都导入MogileFS
 – 文件小,数量大,TrackerDB可能成为瓶颈
• 相册产品很受欢迎,存储空间开始紧张




             36
13M的解决方案
• 购买8台新服务器
 – 32G内存,4core CPU
 – (300G SCSIx2 + 1T SATA)x3
 – (1T SATA x3 ) x 5
 – 6台北京, 2台天津
• 开发DoubanFS



                   37
Douban FS
• 没有中心数据库,直接按照文件名hash查找所在
  节点,可伸缩性更好
• 按照hash值存成目录树,每个节点负责一组hash
  值区域
• 定时同步,基于文件修改时间的Merkle Tree
• 利用consistent hash 减少增删节点带来的数据
  移动量
• WebDAV作为读写接口
• 读性能为MogileFS的3倍,写性能为50倍
               38
Consistent Hash




       39
Merkle Tree




     40
41
16M时问题出现
•   16M动态请求/天
•   数据库大文本字段严重影响了数据库性能
•   DoubanFS中小图片导致IO增高
•   数据库可用性要求提高




            42
解决方案
• 开发DoubanDB
 – 更好的伸缩性
 – 大文本字段移出后,MySQL的性能得到增强
• MySQL 双Master方案
 – Failover更简单
 – 解决replicate delay问题




                  43
DoubanDB
•   分布式Key-Value 数据库
•   从amazon dynamo获得灵感,做了一些简化
•   三个接口: set(K,V), get(K,V),delete(K,V)
•   Memcache协议作为读写接口
•   真正的Merkle Tree,基于内存,后改为基于磁
    盘文件
•   Consistent hash
•   使用TokyoCabinet 作为底层存储
•   数据库中的大文本字段进入DoubanDB
•   DoubanFS2.0 基于DoubanDB 实现

                     44
45
46
最新的一些改动
• 将DoubanFS和数据挖掘程序移回北京机房
 – 简化文件上传流程和代码
 – 更好的利用硬件资源
• 使用ngnix作为最端
• www.douban.com 也部署LVS
• 使用RabbitMQ代替spread



               47
一些经验
• 把钱花在内存上是值得的
• 建立良好的profile工具,并利用之
• Memcache并不廉价,仔细控制cache的
  对象大小和访问方式
• 避免数据库的join操作
• 在产品上做出限制以避免过慢的查询
• 仔细拆分前后台运算

            48
谢谢




 49

Más contenido relacionado

La actualidad más candente

基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践jackbillow
 
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosqlknuthocean
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎frogd
 
InnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCInnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCfrogd
 
Mvcc (oracle, innodb, postgres)
Mvcc (oracle, innodb, postgres)Mvcc (oracle, innodb, postgres)
Mvcc (oracle, innodb, postgres)frogd
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background宗志 陈
 
Flash存储设备在淘宝的应用实践
Flash存储设备在淘宝的应用实践Flash存储设备在淘宝的应用实践
Flash存储设备在淘宝的应用实践Feng Yu
 
Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析frogd
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践Feng Yu
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结Lixun Peng
 
Kvmopt osforce
Kvmopt osforceKvmopt osforce
Kvmopt osforcemeecheng
 
硬件体系架构浅析
硬件体系架构浅析硬件体系架构浅析
硬件体系架构浅析frogd
 
Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&LockLixun Peng
 
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)frogd
 
美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术团队
 
Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统
Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统
Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统Dahui Feng
 
Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010Tim Y
 

La actualidad más candente (18)

基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践基于MySQL的分布式数据库实践
基于MySQL的分布式数据库实践
 
“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql“云存储系统”赏析系列分享三:Sql与nosql
“云存储系统”赏析系列分享三:Sql与nosql
 
My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎My sql 5.6新特性深入剖析——innodb引擎
My sql 5.6新特性深入剖析——innodb引擎
 
InnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCCInnoDB Transaction Lock and MVCC
InnoDB Transaction Lock and MVCC
 
Mvcc (oracle, innodb, postgres)
Mvcc (oracle, innodb, postgres)Mvcc (oracle, innodb, postgres)
Mvcc (oracle, innodb, postgres)
 
Leveldb background
Leveldb backgroundLeveldb background
Leveldb background
 
Flash存储设备在淘宝的应用实践
Flash存储设备在淘宝的应用实践Flash存储设备在淘宝的应用实践
Flash存储设备在淘宝的应用实践
 
Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析Oracle rac资源管理算法与cache fusion实现浅析
Oracle rac资源管理算法与cache fusion实现浅析
 
淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践淘宝商品库MySQL优化实践
淘宝商品库MySQL优化实践
 
对MySQL应用的一些总结
对MySQL应用的一些总结对MySQL应用的一些总结
对MySQL应用的一些总结
 
Kvmopt osforce
Kvmopt osforceKvmopt osforce
Kvmopt osforce
 
硬件体系架构浅析
硬件体系架构浅析硬件体系架构浅析
硬件体系架构浅析
 
Database.Cache&Buffer&Lock
Database.Cache&Buffer&LockDatabase.Cache&Buffer&Lock
Database.Cache&Buffer&Lock
 
Mesos intro
Mesos introMesos intro
Mesos intro
 
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
数据库内核分享第二期(Inno db 日志 回滚段 & 崩溃恢复实现详解)
 
美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍美团点评技术沙龙010-点评RDS系统介绍
美团点评技术沙龙010-点评RDS系统介绍
 
Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统
Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统
Yupoo! (花瓣网/又拍云) 架构中的消息与任务系统
 
Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010Build scalable microblog qcon beijing 2010
Build scalable microblog qcon beijing 2010
 

Similar a 豆瓣网技术架构变迁

Douban qcon2009 beijing
Douban qcon2009 beijingDouban qcon2009 beijing
Douban qcon2009 beijingdrewz lin
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优thinkinlamp
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践mysqlops
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)Feng Yu
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析iammutex
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展Sky Jian
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈lovingprince58
 
Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2redhat9
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰Scourgen Hong
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲84zhu
 
构建可扩展的微博系统
构建可扩展的微博系统构建可扩展的微博系统
构建可扩展的微博系统lonegunman
 
分布式缓存与队列
分布式缓存与队列分布式缓存与队列
分布式缓存与队列XiaoJun Hong
 
MySQL自动切换设计与实现
MySQL自动切换设计与实现MySQL自动切换设计与实现
MySQL自动切换设计与实现orczhou
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0jinqing zhu
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconYiwei Ma
 
基于My sql的分布式数据库实践
基于My sql的分布式数据库实践基于My sql的分布式数据库实践
基于My sql的分布式数据库实践锐 张
 

Similar a 豆瓣网技术架构变迁 (20)

Douban qcon2009 beijing
Douban qcon2009 beijingDouban qcon2009 beijing
Douban qcon2009 beijing
 
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
 
MySQL应用优化实践
MySQL应用优化实践MySQL应用优化实践
MySQL应用优化实践
 
美团技术团队 - KVM性能优化
美团技术团队 - KVM性能优化美团技术团队 - KVM性能优化
美团技术团队 - KVM性能优化
 
MySQL和IO(下)
MySQL和IO(下)MySQL和IO(下)
MySQL和IO(下)
 
NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析NoSQL误用和常见陷阱分析
NoSQL误用和常见陷阱分析
 
基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展基于MySQL开放复制协议的同步扩展
基于MySQL开放复制协议的同步扩展
 
内存数据库[1]
内存数据库[1]内存数据库[1]
内存数据库[1]
 
分布式Key-value漫谈
分布式Key-value漫谈分布式Key-value漫谈
分布式Key-value漫谈
 
Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2Bypat博客出品-服务器运维集群方法总结2
Bypat博客出品-服务器运维集群方法总结2
 
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲
 
java title
java titlejava title
java title
 
构建可扩展的微博系统
构建可扩展的微博系统构建可扩展的微博系统
构建可扩展的微博系统
 
分布式缓存与队列
分布式缓存与队列分布式缓存与队列
分布式缓存与队列
 
MySQL自动切换设计与实现
MySQL自动切换设计与实现MySQL自动切换设计与实现
MySQL自动切换设计与实现
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0
 
A
AA
A
 
Taobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qconTaobao casestudy-yufeng-qcon
Taobao casestudy-yufeng-qcon
 
基于My sql的分布式数据库实践
基于My sql的分布式数据库实践基于My sql的分布式数据库实践
基于My sql的分布式数据库实践
 

豆瓣网技术架构变迁