第1页
豆瓣数据架构实践
员(yùn)旭(xù)鹏(péng) 2014-04-19
第2页
关于豆瓣
- 2005 年 3 ⽉月上线 - 以发现和分享为核⼼心的社区 - 读书、电影、⾳音乐、同城、⼩小组、阅读、
FM、东西等等
第3页
- 架构变迁 - ⼏几个问题 - ⼀一些挑战
第4页
一些数据
- 2TB+ 结构化数据 (MySQL) - 3TB+ ⾮非结构化⽂文本数据 (DoubanDB) - 100TB+ 图⽚片、⾳音乐等 (DoubanFS) - 约 30 个集群 (MySQL) - 约 30 对 Redis - 约 20 台服务器,⼀一半线上、⼀一半离线 (MySQL) - 2 个 DBA (2013.08 前 0.5 个)
第5页
Application
rw
luz
第6页
读压⼒力⾼高
Application
rw
luz
第7页
读压⼒力⾼高
Application
rw
luz
引⼊入 Memcached
第8页
Memcached
Application
rw
luz
第9页
数据挖掘和推荐反馈
Memcached
Application
rw
luz
第10页
数据挖掘和推荐反馈
Memcached
Application
rw
luz
新的 slave ⽤用于离线读
第11页
Memcached
Application
rw
read
repl
luz luz slave
Data mining
write
第12页
Memcached
Application
rw
read
repl
luz luz slave
Data mining
读写压⼒力⾼高,离线写对线上带来冲击
write
第13页
拆库,使⽤用独⽴立的库⽤用于数据挖掘反馈
Memcached
Application
rw
read
repl
luz luz slave
Data mining
读写压⼒力⾼高,离线写对线上带来冲击
write
第14页
Memcached
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第15页
MyISAM 全⽂文搜索出现性能问题
Memcached
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第16页
MyISAM 全⽂文搜索出现性能问题
Memcached
Application
rw
read
repl
luz elf
elf slave
Data mining
repl
luz slave
write read
使⽤用独⽴立的搜索引擎
第17页
Memcached Search
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第18页
⼤大⽂文本字段严重影响性能
Memcached Search
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第19页
⼤大⽂文本字段严重影响性能
Memcached Search
Application
rw
read
repl
luz elf
elf slave
Data mining
repl
luz slave
write read
开发 BeansDB,拆分⽂文本字段
第20页
Memcached Search
BeansDB
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第21页
Memcached Search
BeansDB
读压⼒力增长快
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第22页
Memcached Search
BeansDB
读压⼒力增长快
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
读写分离
第23页
Memcached Search
BeansDB
Application
rw
Data mining
read
repl
luz elf
elf slave
read
repl write
luz slave
read
第24页
读写分离开发成本⾼高
Memcached Search
BeansDB
read
Application
rw
read
repl
luz elf
elf slave
repl
luz slave
write read
Data mining
第25页
读写分离开发成本⾼高
Memcached Search
BeansDB
read
Application
rw
read
repl
luz elf
elf slave
Data mining
repl
luz slave
write
read
停⽤用读写分离,继续拆库
第26页
Memcached Search
BeansDB
rw
muk
Application
rw
read
repl
luz elf
elf slave
repl repl
muk slave luz slave
write read
read
Data mining
第27页
去重、计数代价⾼高
Memcached Search
rw
muk
Application
rw
read
repl
luz elf
elf slave
BeansDB
repl repl
muk slave luz slave
write read
read
Data mining
第28页
去重、计数代价⾼高
Memcached Search
rw
muk
Application
rw
read
repl
luz elf
elf slave
BeansDB
repl repl
muk slave luz slave
write read
read
Data mining
引⼊入 Redis
第29页
Memcached Search
BeansDB Redis
rw
muk
Application
rw
read
repl
luz elf
elf slave
repl repl
muk slave luz slave
write read
read
Data mining
第30页
- 架构变迁 - ⼏几个问题 - ⼀一些挑战
第31页
Application
Failover
Application
master
slave
slave master
第32页
Failover
- 早期通过 hostname 访问数据库,切换后需要重启应⽤用
- skinbark => leaflock
第33页
Failover
- 早期通过 hostname 访问数据库,切换后需要重启应⽤用 - skinbark => leaflock
- 后来改为 hosts alias,切换时更新 hosts,不需要重启应⽤用 - luz_m(on skinbark) => luz_m(on leaflock)
第34页
Failover
- 早期通过 hostname 访问数据库,切换后需要重启应⽤用 - skinbark => leaflock
- 后来改为 hosts alias,切换时更新 hosts,不需要重启应⽤用 - luz_m(on skinbark) => luz_m(on leaflock)
- 服务器变多,更新 hosts 过程太慢,开发配置推送系统 - 基于 zookeeper
第35页
分库分表
Application Middleware
luz elf
第36页
分库分表
- sqlstore Python 客户端库,数据库访问中间层,屏蔽分库细节
第37页
分库分表
- sqlstore Python 客户端库,数据库访问中间层,屏蔽分库细节 - 分库、分表前预发布新路由信息,重启应⽤用
第38页
分库分表
- sqlstore Python 客户端库,数据库访问中间层,屏蔽分库细节 - 分库、分表前预发布新路由信息,重启应⽤用 - 应⽤用变多之后重启所有的应⽤用很困难
第39页
分库分表
- sqlstore Python 客户端库,数据库访问中间层,屏蔽分库细节 - 分库、分表前预发布新路由信息,重启应⽤用 - 应⽤用变多之后重启所有的应⽤用很困难 - 基于配置推送系统,亚秒级更新进程内的路由信息
- 基于 zookeeper + inotify
第40页
定位性能问题
db db
第41页
定位性能问题
- 从 Web ⼊入⼜⼝口处给每个查询增加注释,标明来源
第42页
定位性能问题
- 从 Web ⼊入⼜⼝口处给每个查询增加注释,标明来源 - 基于 tcpdump + dpark 从旁路分析流量,从多个纬度分析查询
第43页
定位性能问题
- 从 Web ⼊入⼜⼝口处给每个查询增加注释,标明来源
- 基于 tcpdump + dpark 从旁路分析流量,从多个纬度分析查询
- 外⽹网 IP - ⼊入⼜⼝口 URL - normalized SQL - 时间 -…
第44页
应对突发的性能问题
旁路收集
实时反馈
分析
修正
第45页
应对突发的性能问题
- 给客户端推送临时的封禁规则,封禁有性能问题的查询
第46页
应对突发的性能问题
- 给客户端推送临时的封禁规则,封禁有性能问题的查询 - 优化索引,或改写查询、重构应⽤用
第47页
追溯问题和审计
0 00:00
01:00
02:00
03:00
04:00
05:00
06:00
07:00
第48页
追溯问题和审计
- tcpdump 旁路收集并保留历史数据
第49页
追溯问题和审计
- tcpdump 旁路收集并保留历史数据 - 离线分析数据,追溯问题
第50页
追溯问题和审计
- tcpdump 旁路收集并保留历史数据 - 离线分析数据,追溯问题 - 敏感数据访问审计
第51页
数据备份和恢复
- 逻辑备份,恢复很慢 - 物理备份⾄至 MooseFS - 多机房在时间上交错备份 - PITR(即时恢复)使⽤用 MooseFS snapshot + binlog
第52页
监控与报警
Graphite + StatsD
第53页
- 架构变迁 - ⼏几个问题 - ⼀一些挑战
第54页
连接压力
- 使⽤用长连接获得更好的性能 - 每实例 3000 - 5000 连接 - 基于 proxy 的外部连接池
第55页
- ⼤大事务 - 极慢查询 - CPU 密集型查询 - 资源隔离
QoS
第56页
人才的延续
第57页
理想的 DBA
- 扎实的系统管理能⼒力
第58页
理想的 DBA
- 扎实的系统管理能⼒力
- 掌控 MySQL / Redis / MongoDB / 以及其他 任何所需系统的能⼒力
第59页
理想的 DBA
- 扎实的系统管理能⼒力
- 掌控 MySQL / Redis / MongoDB / 以及其他 任何所需系统的能⼒力
- 深⼊入研究特定问题的能⼒力
第60页
理想的 DBA
- 扎实的系统管理能⼒力 - 掌控 MySQL / Redis / MongoDB / 以及其他
任何所需系统的能⼒力
- 深⼊入研究特定问题的能⼒力
- ⾃自动化⼀一切能⾃自动化的东西的能⼒力
第61页
理想的 DBA
- 扎实的系统管理能⼒力 - 掌控 MySQL / Redis / MongoDB / 以及其他
任何所需系统的能⼒力
- 深⼊入研究特定问题的能⼒力
- ⾃自动化⼀一切能⾃自动化的东西的能⼒力
- 持续的⾃自驱动⼒力
第62页
理想的 DBA
- 扎实的系统管理能⼒力 - 掌控 MySQL / Redis / MongoDB / 以及其他
Don’t任何所需系统的能⼒力 Be Afraid!
- 深⼊入研究特定问题的能⼒力 - ⾃自动化⼀一切能⾃自动化的东西的能⼒力 - 持续的⾃自驱动⼒力
第63页
Q&A
http://www.douban.com/people/recordus/
xupeng@douban.com
Twitter: @xupeng 微博:@yunxupeng
第64页
谢谢!