题目
- 现在你是twitter搜索负责人,设计搜索系统,提供图片、文字搜索
- 用户1.5 billion,日活800 million
- 每天新增400 million tweets (每个tweet大小300B)
- 每天搜索次数500M
- 搜索格式包含多个words以及 and/or
- 设计高效存储和查询tweets的系统
约束
- 日存储量120GB,月3.6TB,10年432TB
- tweet数量:日400M,月12B,年144B,5年740B
- 读qps 6K, 写qps 4.5K
- 读写均衡,高并发系统
服务
high level
- 索引服务 + 存储服务
- 存储数量很大,一台机器存不下,sharding要能加快搜索;
- 存储时需要做一些优化,加快搜索;生成索引信息,提取word和对应tweetId;可以快速找到某个word对应的tweetid列表;
- 用户只会关心她关注的好友的信息,如果一个人粉丝特别多,pull可能不行;
存储
存储规模
- 机器数量:5年220TB,按照80%利用率;需要300TB;75台机器;
- 1T数据条数,1000billion数据;需要一个发号器srv,7位62编码即可实现
索引规模
-
预估index的大小:
- 一个word平均5B,500K个word,5 * 500KB = 2.5MB
- tweetID:每个tweetID的大小为7B,5年,7B * 740B = 5TB;考虑每条tweet有50个word,有效word是20个;每个tweetID被重复使用20次;需要100TB
- 总大小 (100TB + 2.5MB) = 100TB
-
机器预估:
- 内存144GB,大概需要700台机器存储index
-
sharding on words 主要问题
- 访问热点word,导致机器负载过高
- 分布不均匀,有些word是高频词,引用的tweet过多
- 解法:??
-
sharding on tweetID
- 需要遍历所有的index server,聚合tweetid集合
扩展
索引服务down掉如何处理
- 重建索引