### 新浪微博Redis优化历程详解
#### 一、业务场景
**Redis在新浪微博的应用**
- **计数(Counter)**: 对于高频次的增减操作,如点赞、评论数量等,Redis提供了高效的计数功能。
- **关系(Graph)**: 处理用户之间的关注、粉丝等社交关系,利用Redis进行快速的查询和更新。
- **通知提醒**: 实现消息推送、通知等功能,确保实时性和高效率。
**业务场景中的数据规模**
- **IDC**: 使用了6个数据中心。
- **服务器数量**: 部署了500多台服务器。
- **实例数量**: 运行了3700多个Redis实例。
- **记录数量**: 存储了千亿级别的数据记录。
- **内存占用**: 消耗了超过24TB的内存资源。
- **每日处理命令数**: 达到了7千亿条命令。
- **每日读取量**: 超过了1.2万亿次。
- **每日写入量**: 达到了2千亿次。
#### 二、Redis存储架构演进
**Redis存储前时代**
- **热数据Memcached (mc)**: 用于缓存热点数据。
- **全量数据MySQL**: 存储全部数据,但在处理大规模数据时成为瓶颈。
- **数据量**: 图形数据(Graphmc)约10GB,计数器数据(mc2)约2GB。
**问题出现**
- **2010年**: 图形数据(Graphmc)达到30GB以上,峰值达到了10万TPS,MySQL成为性能瓶颈。
- **MySQL瓶颈**: 出现线程阻塞,访问延迟;List类型的业务处理变得低效。
- **计算难度**: 面对大量关系计算的需求时,从Memcached获取全量数据并在客户端进行计算会导致超时。
**解决方案**
- **初期方案**:
- 扩大Memcached容量至40GB,并增加Graphdb的从库数量。
- 监控并及时清理僵死线程。
- 关系计算性能问题暂时无解。
- **最终方案**:
- 引入Redis作为存储层,用于图形和计数数据的存储。
- 在Redis上实现了关系计算的O(1)时间复杂度。
- 支持更多复杂需求。
- Graphdb恢复为主从结构。
**小结**
- **项目初期**: 数据规模为30GB,日PV为5千,技术选型更注重开发速度。
- **产品需求与技术相互促进**: Redis的引入促进了业务需求的发展。
#### 三、Redis存储初期
**Redis初期配置**
- **Redis版本**: 2.0
- **图形数据**: 使用Hash存储,每个实例40GB,峰值10万TPS,部署了4个服务器。
- **计数数据**: 20GB,2万TPS,部署了2个服务器。
**问题出现**
- **2011年**: 因初始经验不足导致了一系列问题:
- 数据分片不足,扩容困难。
- 部分数据类型使用不当,导致内存消耗超出预期。
- 多业务混放在同一实例中,难以拆分。
- 可用性不足,缺乏冗余配置。
- 重启耗时较长,影响服务稳定性。
**解决方案**
- **容量规划**:
- 提前预估容量,合理分配数据分片。
- 合理选择数据类型,避免过度使用zset。
- 业务独立存储,避免混合部署。
- **提高可用性**:
- 所有Redis实例增加从库。
- Master只挂载不超过2个从库,采用M-S-S的方式挂载。
- 跨IDC部署主从复制。
- 在低峰期进行升级和维护,将IP地址指向域名,以减少中断时间。
**问题升级**
- **2011年底**: 遇到图形数据达到100GB后的“灵异事件”:
- Redis在凌晨低峰期无征兆崩溃。
- 批量升级或扩容过程中,引发其他业务异常。
- 多个slave负载不均,导致响应时间显著增加。
- 在线版本过多,增加了运维难度。
**问题分析**
- **崩溃原因**: Redis使用了pageCache,导致进入swap空间而崩溃。
- **网络阻塞**: 全量复制导致网络拥堵。
- **负载不均**: 客户端通过域名访问,导致连接分布不均匀。
**问题解决**
- **紧急方案**:
- 当内存使用超过物理内存的3/5时,迁移端口。
- 错峰升级/扩容,减少对网络的影响。
- 开发ClientBalancer组件,实现域名下的IP连接均衡。
- **进一步优化方案**:
- 清理pagecache,减少对正常业务的影响。
- AOF模式去除了rewrite,改为rotate。
- 引入类似于MySQL的独立IO线程,处理RDB和AOF的复制工作。
- 支持热升级,提高运维效率。
- 其他优化措施。
**小结**
- **小规模**: 50GB以下,1-2个集群,可手动运维。
- **中规模**: 100GB以上,3个或更多集群,重视可运维性和开源组件的应用。
#### 四、Redis存储爆发期
在经历了不断的迭代和优化后,新浪微博的Redis存储进入了爆发期。此时,系统已经能够应对大规模数据的挑战,并且具备了高度的稳定性和扩展性。通过不断地探索和技术革新,新浪微博成功地构建了一个高效、可靠的分布式存储系统,支撑着其庞大的社交网络服务。