### 新浪微博Redis优化历程 #### 业务场景 在新浪微博的实际应用场景中,Redis主要应用于以下三个领域: 1. **计数(Counter)**:用于实时统计用户的各种行为数据,如点赞数、评论数等。 2. **关系(Graph)**:处理用户之间的社交关系,例如关注、粉丝列表等。 3. **通知提醒**:实现用户间的即时消息通知功能。 随着业务的发展,这些应用场景对系统的性能提出了更高的要求,尤其是在数据量和并发量方面。 #### 数据概况 截至分享时点,新浪微博使用的Redis存储具有以下特点: - **IDC分布**:共部署于6个不同的数据中心。 - **服务器数量**:超过500台服务器。 - **实例总数**:运行了3700多个Redis实例。 - **记录条数**:存储了千亿级别的记录。 - **内存占用**:总体占用内存超过24TB。 - **每日操作量**: - **命令执行量**:每天执行7千亿次命令。 - **读取量**:每天进行1.2万亿次读取操作。 - **写入量**:每天完成2千亿次写入操作。 #### Redis存储前时代 在引入Redis之前,新浪微博主要采用了Memcached(简称mc)作为热点数据缓存,并将全量数据落地MySQL数据库。这种方式在初期能满足需求,但随着数据量的增长和技术发展的限制,逐渐暴露出以下问题: 1. **数据量增长**:例如,Graphmc达到30GB以上,峰值TPS达到了10万。 2. **MySQL成为瓶颈**:由于线程阻塞导致访问延迟,同时MySQL对于列表类型数据的处理能力有限。 3. **关系计算困难**:对于复杂的关系计算,从MC获取全量数据后进行本地计算会导致超时。 #### 解决方案 为了解决这些问题,新浪微博采取了以下措施: 1. **初期方案**: - 增加Memcached的容量至40GB,并增加Graphdb的一主六从配置。 - 实施监控机制,以便及时清理僵死线程。 - 对于关系计算性能问题暂时没有找到有效解决方法。 2. **最终方案**: - 引入Redis作为存储系统,用于处理图形和计数等场景。 - 在Redis中实现了复杂关系计算的O(1)时间复杂度。 - 这促进了更多复杂需求的实现,并将Graphdb恢复为一主三从的配置。 #### Redis存储初期 在最初使用Redis的阶段,新浪微博面临了以下几个挑战: 1. **数据分片不足**:导致后续扩容难度较大。 2. **内存占用超出预期**:部分数据类型的选择不当,例如过度使用zset。 3. **业务混合存放**:不同业务混放在同一实例中,不利于管理和扩展。 4. **可用性不足**:小业务初期没有slave备份,在服务器故障时会造成服务异常;大业务挂载过多slave,高峰时段write操作可能出现超时。 针对这些问题,新浪微博采取了以下优化措施: 1. **容量规划**: - 提前预测容量需求,并预先分配足够的数据分片。 - 选择合适的数据结构,避免过度使用zset等高内存消耗类型。 - 将不同业务分别存放,避免混放。 2. **提高可用性**: - 为所有Redis实例增加slave备份。 - Master实例挂载不超过两个slave,采用M-S-S方式挂载。 - 跨IDC复制同步,增强冗余性和可用性。 - 在低峰时段进行升级维护,并通过域名访问来减少影响。 #### Redis存储爆发期 随着时间的推移,新浪微博Redis存储进入了一个快速发展的阶段。在此期间,团队面临着新的挑战: 1. **大规模集群管理**:随着业务的增长,Redis集群规模不断扩大,达到了上百GB级别,管理多个集群的需求变得越来越重要。 2. **运维复杂度提升**:为了应对大规模集群带来的挑战,团队需要进一步优化运维流程和工具,确保系统的稳定运行。 在这一阶段,新浪微博重点解决了以下几个关键问题: 1. **崩溃问题**:通过对Redis的深入研究,发现读写操作会使用pageCache,从而导致Redis进入swap状态并最终崩溃。 2. **网络阻塞**:全量复制过程中可能会导致网络拥塞,进而影响其他服务。 3. **负载不均**:客户端通过域名访问Redis,但由于域名解析返回的IP地址随机,导致连接不均衡,进而引起负载不均衡的问题。 针对上述问题,新浪微博采取了一系列改进措施: 1. **紧急方案**: - 当内存占用超过物理内存的3/5时,启动迁移端口的策略。 - 开发ClientBalancer组件来均衡域名下的IP连接,实现负载均衡。 2. **进一步优化方案**: - 及时清理pageCache,减少对正常业务的影响。 - 优化AOF机制,取消rewrite操作,改为使用rotate。 - 借鉴MySQL的经验,实现独立的IO线程处理RDB和AOF的复制操作。 - 支持热升级功能,避免因重启造成的服务中断,提高可运维性。 通过这些优化措施,新浪微博成功地解决了在Redis使用过程中遇到的各种挑战,保障了系统的高效稳定运行。
- 粉丝: 33
- 资源: 14
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Android的设备管理与优化系统.zip
- C#商家联盟会员积分消费管理系统源码带微信和文档数据库 SQL2008源码类型 WebForm
- 高频隔直通交电路(电路仿真)
- 低频隔直通交电路(电路仿真)
- (源码)基于C++和CMake的生物仿真模拟系统.zip
- html 2048小游戏
- (源码)基于Thrift框架的游戏匹配与管理系统.zip
- C++(Qt)软件调试-符号转换工具cv2pdb (24)
- 基于FlaskWebIDSKDD99深度学习入侵检测 框架 html + css + jquery + python 3.9
- 基于PythonSnort入侵检测IDS系统 框架 html + css + jquery + echart + python