Redis如何轻松支撑万亿级日访问量?
Redis 在微博内部分布在各个应用场景,比如像现在春晚必争的“红包飞”活动,还有像粉丝数、用户数、阅读数、转评赞、评论盖楼、广告推荐、负反馈、音乐榜单等等都有用到 Redis。
图片来自 Pexels
本人将分为如下三个方面分享:
Redis 在微博的应用场景
Redis 在微博的优化
-
未来展望
Redis 在微博的应用场景
业务&规模&挑战
线上的业务有前面提到的信息流、广告、用户关系等等,还有现在大家可能比较感兴趣的热搜,用户一般会去看发生了什么事情,还有引爆阅读量的话题,以及现在兵家必争之地的视频,微博大大小小的业务都有用到 Redis。
线上规模方面,微博有 100T+ 存储,1000+ 台物理机,10000+Redis 实例。
关于面临的挑战,我们每天有万亿级的读写,线上的响应时间要求也比较高。
举一个简单的例子,我们部署资源是跨机房部署,但是有一些业务部门连跨机房部署存在的多余 2 毫秒的延迟都要投诉反馈(真的是臣妾做不到啊,如果单机房故障了呢?有些业务方真是异想天开)。响应时间基本上四个 9 是 20 毫秒。
成本的话因为我们线上有大量需求是上 T 的,所以成本压力其实也特别大。
技术选型
上图是微博数据库的技术选型,可以看到这里面不仅仅包含 Redis 等 NoSQL,还有队列、存储。
优化
从 2010 年开始,我们就基于官方的 2.0 版本引进 Redis,到现在已经有 9 个年头了。
我们主要做了以下这些方面的改进:
Redis 编码格式,在特殊场景下可以节省 30% 的空间。
主从库方面有独立的复制线程。
我们定制化一些数据结构,比如:LongSet 数据结构,它是一个“固定长度开放寻址的 Hash 数组”,减少 Redis dict 很多额外的指针开销。
在主从复制方面,独立复制线程+完全增量复制,这样的话,如果网络主从临时断了,只要从当前的 Pos 点同步数据就行。
在持久化方面,我们是全量的 RDB 加增量的 AOF 复制。
AOF 写入/ 刷盘,主线程—>BIO,避免了因为写入导致的阻塞。
落地时间,不可控—>cronsave 可控。
增加 aofnumber,设置 AOF 数量,避免因为写入过快,磁盘写满。
高可用,Redis 的 HA 我们并没有用官方的或者社区开源的,用的是我们自己开发的一套 Redis HA,保障在故障的情况下,能快速进行切换。
无阻塞落地。
增量复制->RDB+AOF。
在线热升级。
关系 Graph 定制,内存降为 1/10,性能相当。
计数定制化,内存降为1/4,性能提升 3-5 倍。
BloomFilter。
Redis 在微博的优化
高性能,读写快、访问快、响应时间快。
能够支持大容量的需求。
可扩展,因为接触的业务方比较多,就会发现一个问题,基本上没有几个业务方能把自己的需求描述得特别清楚,经常上线之后才发现内存不够了,或者写入扛不住了,所以这个时候我们需要在可扩展性方面提供一个强有力的支持。
Cache Service 服务化
一共有两种访问方式,第一种是 SDK,第二种是支持多语言的,通过 Proxy 把请求路由到后端的 Cache 里面。DBA 只要通过管理平台就可以对资源进行快速扩缩容。
Master
Maste-l1
Slave
Slave-l1
Slave 一般是做多机房的容灾,Slave-l1 做多机房的数据同步,这个同步只保证最终数据的一致性。
Cache Service 目前支持 MC 和 Redis 协议 2 种协议。
分享一下我们之前的成功案例,我们已经实现好几年的春晚 1000+ 台阿里云 ECS 弹性扩缩容,多次实现无降级平滑过渡,高峰期支持微博 50% 的春晚核心流量。
MCQ 服务化
如果这个时候 MySQL 宕机了,我们会有一个修复队列,专门有一个 Key 来存这部分的数据,等 MySQL 恢复以后再把这部分数据写入到 MySQL 里面。
去年比特币特别火,我们也想通过购买比特币的方式,在内部通过机器的资源或者内部开源的一些东西来做等价物质的转换,然后来应用这个服务,但是最终这个计划没有具体落地。
如何解决 Redis 容量过大?
基于前面的场景,像微博这种属性特别适合用这种方法,就算冷热数据不明显,比如上 T,每秒几 K 访问的情况,用这个方法也特别合适。
还有一个 BloomFilter,是基于布谷鸟算法来优化,初始化的时候指定 Filter 的容量,新增双向链表管理 Hash 冲突。
把前面的处理模块和后端整合一下就形成了以下这样的架构图:
简单易用:完全兼容 Redis,业务方不用做任何改动就可以迁移上。
成本优势:把热点数据或者频繁访问数据放在内存,全量的数据全部放磁盘,这是一个特别大的优势,可以突破内存容量限制。
高性能:热点数据在内存,热点数据访问性能和 Redis 相当。
下图是性能压测报告,我们对比了 Set 的随机对写:
仍满足不了新需求?
因此,我们借鉴了开源经验,也调研了 Twemproxy、Codis、Corvus、Redis-Cluser 这些功能:
第一就是迁移还是比较费时间。
第二是无法比较完美的动态增加节点,还有内部一些其他原因等等的约束。
一是能支持在线扩缩容。
二是支持多语言的访问,因为我们是要对整个公司进行推广的,而不是说只对一个部门,所以为了推广方便我们必须有这种功能。
三是对服务化特性的需求。
日志记录:生成日志文件以便跟踪。
Redis 存储方面:还是沿用我们内部改造的 Redis 版本,相对之前线上的版本,这次我们新增了官方比如 Mememory,内存编码的优化,以及内部新增的一些新的功能。
资源申请
资源分配
业务上线
资源查询
资源变更
未来展望
现在有很多公司对 Raft 做了二次开发,后续我们也会投入到在这方面中。
留言赠书活动
你觉得 Redis 使用过程的中难点在哪?欢迎底部留言分享,我们将从留言中抽取最精彩的 5 位网友送出价值 132 元的《Redis使用手册》一本。活动截止时间 11 月 6 号 20:00。
书籍简介:《Redis 设计与实现》作者黄健宏的最新力作,涵盖最新 Redis 版本,学习 Redis 的信心之选。本书系统化介绍 Redis 命令及其应用场景,内容深入,图文并茂,巨细靡遗,是掌握 Redis 的案头必备参考书。
简介:新浪微博核心 Feed 流、广告数据库业务线负责人,主要负责 MySQL、NoSQL、TiDB 相关的自动化开发和运维,参与 Redis、counteservice_ssd、Memcacheq 相关代码的开发,目前关注分布式系统。
编辑:陶家龙、孙淑娟
精彩文章推荐: