最大的Redis集群:新浪Redis集群揭秘

前言

Tape is Dead,Disk is Tape,Flash is Disk,RAM Locality is King.       — Jim Gray

Redis不是比较成熟的Memcache或者Mysql的替代品,是对于大型互联网类应用在架构上很好的补充。现在有越来越多的应用也在纷纷基于Redis做架构的改造。

可以简单公布一下Redis平台实际情况

2200+亿 commands/day   5000亿Read/day   500亿Write/day

18TB+ Memory

500+ Servers in 6 IDC    2000+instances

应该是国内外比较大的Redis使用平台,今天主要从应用角度谈谈Redis服务平台。

Redis使用场景

1.Counting(计数)

计数的应用在另外一篇文章里较详细的描述,计数场景的优化 http://www.xdata.me/?p=262 这里就不坳述了。

可以预见的是,有很多同学认为把计数全部存在内存中成本非常高,我在这里用个图表来表示下我的观点:

Mem

很多情况大家都会设想纯使用内存的方案会很有很高成本,但实际情况往往会有一些不一样:

1.COST,对于有一定吞吐需求的应用来说,肯定会单独申请DB、Cache资源,很多担心DB写入性能的同学还会主动将DB更新记入异步队列,而这三块的资源的利用率一般都不会太高。资源算下来,你惊异的发现:反而纯内存的方案会更精简!

2.KISS原则,这对于开发是非常友好的,我只需要建立一套连接池,不用担心数据一致性的维护,不用维护异步队列。

3.Cache穿透风险,如果后端使用DB,肯定不会提供很高的吞吐能力,cache宕机如果没有妥善处理,那就悲剧了。

4.大多数的起始存储需求,容量较小。

2.Reverse cache(反向cache)

面对微博常常出现的热点,如最近出现了较为火爆的短链,短时间有数以万记的人点击、跳转,而这里会常常涌现一些需求,比如我们向快速在跳转时判定用户等级,是否有一些账号绑定,性别爱好什么的,已给其展示不同的内容或者信息。

普通采用Memcache+Mysql的解决方案,当调用id合法的情况下,可支撑较大的吞吐。但当调用id不可控,有较多垃圾用户调用时,由于memcache未有命中,会大量的穿透至Mysql服务器,瞬间造成连接数疯长,整体吞吐量降低,响应时间变慢。

这里我们可以用redis记录全量的用户判定信息,如string key:uid int:type,做一次反向的cache,当用户在redis快速获取自己等级等信息后,再去Mc+Mysql层去获取全量信息。如图:

Concept2

当然这也不是最优化的场景,如用Redis做bloomfilter,可能更加省用内存。

3.Top 10 list

产品运营总会让你展示最近、最热、点击率最高、活跃度最高等等条件的top list。很多更新较频繁的列表如果使用MC+MySQL维护的话缓存失效的可能性会比较大,鉴于占用内存较小的情况,使用Redis做存储也是相当不错的。

4.Last Index

用户最近访问记录也是redis list的很好应用场景,lpush lpop自动过期老的登陆记录,对于开发来说还是非常友好的。

5.Relation List/Message Queue

这里把两个功能放在最后,因为这两个功能在现实问题当中遇到了一些困难,但在一定阶段也确实解决了我们很多的问题,故在这里只做说明。

Pinterest使用Redis存储社交graph信息:

http://blog.gopivotal.com/case-studies-2/using-redis-at-pinterest-for-billions-of-relationships

Message Queue就是通过list的lpop及lpush接口进行队列的写入和消费,由于本身性能较好也能解决大部分问题。

6.Fast transaction with Lua

Redis 的Lua的功能扩展实际给Redis带来了更多的应用场景,你可以编写若干command组合作为一个小型的非阻塞事务或者更新逻辑,如:在收到message推送时,同时1.给自己的增加一个未读的对话 2.给自己的私信增加一个未读消息 3.最后给发送人回执一个完成推送消息,这一层逻辑完全可以在Redis Server端实现。

但是,需要注意的是Redis会将lua script的全部内容记录在aof和传送给slave,这也将是对磁盘,网卡一个不小的开销。

7.Instead of Memcache

很多测试和应用均已证明,

1.在性能方面Redis并没有落后Memcache多少,而单线程的模型给Redis反而带来了很强的扩展性。

2.在很多场景下,Redis对同一份数据的内存开销是小于Memcache的slab分配的。

3.Redis提供的数据同步功能,其实是对cache的一个强有力功能扩展。 

Redis使用的重要点

1.rdb/aof Backup!

我们线上的Redis 95%以上是承担后端存储功能的,我们不仅用作cache,而更为一种k-v存储,他完全替代了后端的存储服务(MySQL),故其数据是非常重要的,如果出现数据污染和丢失,误操作等情况,将是难以恢复的。所以备份是非常必要的!为此,我们有共享的hdfs资源作为我们的备份池,希望能随时可以还原业务所需数据。

2.Small item & Small instance!

由于Redis单线程(严格意义上不是单线程,但认为对request的处理是单线程的)的模型,大的数据结构list,sorted set,hash set的批量处理就意为着其他请求的等待,故使用Redis的复杂数据结构一定要控制其单key-struct的大小。

另外,Redis单实例的内存容量也应该有严格的限制。单实例内存容量较大后,直接带来的问题就是故障恢复或者Rebuild从库的时候时间较长,而更糟糕的是,Redis rewrite aof和save rdb时,将会带来非常大且长的系统压力,并占用额外内存,很可能导致系统内存不足等严重影响性能的线上故障。我们线上96G/128G内存服务器不建议单实例容量大于20/30G。

3.Been Available!

业界资料和使用比较多的是Redis sentinel(哨兵)

http://www.huangz.me/en/latest/storage/redis_code_analysis/sentinel.html

http://qiita.com/wellflat/items/8935016fdee25d4866d9

2000行C实现了服务器状态检测,自动故障转移等功能。

但由于自身实际架构往往会复杂,或者考虑的角度比较多,为此@许琦eryk 和我一同做了hypnos项目。

hypnos是神话中的睡神,字面意思也是希望我们工程师无需在休息时间处理任何故障。:-)

其工作原理示意如下:

hypnos

Talk is cheap, show me your code! 稍后将单独写篇博客细致讲下Hypnos的实现。

4.In Memory or not?

发现一种情况,开发在沟通后端资源设计的时候,常常因为习惯使用和错误了解产品定位等原因,而忽视了对真实使用用户的评估。也许这是一份历史数据,只有最近一天的数据才有人进行访问,而把历史数据的容量和最近一天请求量都抛给内存类的存储现实是非常不合理的。

所以当你在究竟使用什么样的数据结构存储的时候,请务必先进行成本衡量,有多少数据是需要存储在内存中的?有多少数据是对用户真正有意义的。因为这其实对后端资源的设计是至关重要的,1G的数据容量和1T的数据容量对于设计思路是完全不一样的

Plans in future?

1.slave sync改造

全部改造线上master-slave数据同步机制,这一点我们借鉴了MySQL Replication的思路,使用rdb+aof+pos作为数据同步的依据,这里简要说明为什么官方提供的psync没有很好的满足我们的需求:

假设A有两个从库B及C,及 A `— B&C,这时我们发现master A服务器有宕机隐患需要重启或者A节点直接宕机,需要切换B为新的主库,如果A、B、C不共享rdb及aof信息,C在作为B的从库时,仍会清除自身数据,因为C节点只记录了和A节点的同步状况。

故我们需要有一种将A`–B&C 结构切换切换为A`–B`–C结构的同步机制,psync虽然支持断点续传,但仍无法支持master故障的平滑切换。

实际上 我们已经在我们定制的Redis计数服务上使用了如上功能的同步,效果非常好,解决了运维负担,但仍需向所有Redis服务推广,如果可能我们也会向官方Redis提出相关sync slave的改进。

2.更适合redis的name-system Or proxy

细心的同学发现我们除了使用DNS作为命名系统,也在zookeeper中有一份记录,为什么不让用户直接访问一个系统,zk或者DNS选择其一呢?

其实还是很简单,命名系统是个非常重要的组件,而dns是一套比较完善的命名系统,我们为此做了很多改进和试错,zk的实现还是相对复杂,我们还没有较强的把控粒度。我们也在思考用什么做命名系统更符合我们需求。

3.后端数据存储

大内存的使用肯定是一个重要的成本优化方向,flash盘及分布式的存储也在我们未来计划之中。

  原文发布时间为:2013-10-10

时间: 2024-10-27 10:00:25

最大的Redis集群:新浪Redis集群揭秘的相关文章

新浪UC群聊设置技巧

"你加到团体里,一起群聊吧?"这样的话语对于http://www.aliyun.com/zixun/aggregation/11561.html">新浪UC的网友来说,是再熟悉 不过了.我们通过团体中的交流.娱乐和自发组织的活动,建立了一种人与人交往的信任感:相互尊重,没有贵贱之分,没有歧视.然而,群聊虽然能够和许多朋友共同交流,但有时也会让人 感到不便.比如,团体里 有的成员自己并不熟悉,他们的话题自己也不感兴趣,但却都一点不落的出现在聊天窗口里造成视觉干扰.再如,8

如何查找新浪UC好友

新浪UC逐渐开始受越来越多的网友关注.在这里我会向大家陆续介绍新浪UC的使用方法,教您用好新浪UC.今天学习如何查找新浪UC好友. 一:使用普通查找在主界面的"我的好友"列表空白处,点击鼠标右键,选择添加好友选项. 如下图所示: 或直接点击主窗口中的 查找按钮,出现查找好友窗口如下图所示: 在基本查找项里,提供了四中查找方式,分别是看看谁在线.通过UC号码查找,通过sina会员名查找和按昵称.电子邮件查找. 如选择了"看看谁在线"方式查找,所有UC在线用户将被列表显

新浪UC通讯软件的应用技巧

  新浪UC是国内较平投入研发的即时通讯软件.新浪UC集传统即时通信软件功能于一体,融合P2P思想的新一代开放式网络即时通信娱乐软件,将有声有色.阁文并茂的场泉聊天模式,以及视频电话.可断点续传的文件传输.能够多人聊天的多人让界,消息群发功能和在线游戏功能以及同学录(团体)等有机结合,形成一个完整的网上即时通讯娱乐平台,满足人们日常工作和生活的需要,给大家带来边说.边看.边玩的网络生活全新感觉. (1)消息群发 xp系统下载的新浪UC和网易POPO都具有消息群发功能,就是一条消息选择性地向多个好

新浪与Google(谷歌)结成战略合作伙伴关系

中介交易 SEO诊断 淘宝客 云主机 技术大厅 北京时间6月11日消息,中国第一门户网站新浪与全球最大的搜索引擎公司Google(谷歌)在北京联合召开新闻发布会,正式宣布双方达成战略合作关系.新浪与谷歌将在搜索.资讯.广告方面进行全方位战略合作,通过双方强势平台之间的密切互动,为广大网民提供精心整合的互联网搜索及资讯服务.[含新闻发布会全文] 基于双方的战略合作,新浪搜索服务中将嵌入谷歌网页搜索框,为网民提供更加方便的网页搜索,网民可以在新闻浏览和网页搜索服务之间便捷地切换.新浪与 谷歌的广告合

新浪掌门曹国伟:现在开始创业

过去十年,如果通过我的努力证明我是一个比较成功的职业经理人,我想在下一个十年用一种创业精神做我的企业,过去十年我和我的新浪打造成了国内最有影响力的门户,未来十年我希望我和我的团队能够缔造一个跨平台的.多媒体的平台,所谓跨平台就是跨PC互联网,跨手机,和电视终端的多领域的新媒体平台. ⊙记者 张韬 2009年9月28日,44岁的曹国伟和新浪管理层以1.8亿美元获得新浪9.41%的股权,成为新浪最大的股东.曹国伟几乎是凭借一己之力搞定了1.8 亿美元的资金来源,在两个月的时间内,帮助新浪管理层完成对

用数据说话,为何新浪要收购分众

这是某公司的网络广告活动的效果数据.可见,网站http://www.aliyun.com/zixun/aggregation/18020.html">品牌知名度越高的,似乎广告的CPC性价比越差.高品牌的媒体,可以获得很大的广告溢价. 随着越来越多的传统广告主触网,他们不懂得如何衡量网络广告效果,只看重网站的品牌影响力,难怪新浪的广告价格不断上涨,向不断增多的客户收取更高的广告费.但是随着各种社会化网站的崛起和用户碎片化,新浪在用户群的增长有限,广告位的性价比就可想而知了.难怪新浪要收购分

Redis(3.2.3)集群部署实战

一.Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis官网地址:http://redis.io/ Redis中文网地址:http://redis.cn Redis中文文档地址:http://redisdoc.com 二.Redis安装 系统环境:CentOS 6.8 mininal 初始化完成       下载,解压,编译: wget http://download.redis.i

《Redis官方文档》Redis集群教程

原文链接 译文链接 译者: tiffany 这篇教程是Redis集群的简要介绍,而非讲解分布式系统的复杂概念.它主要从一个使用者的角度介绍如何搭建.测试和使用Redis集群,至于Redis集群的详细设计将在"Redis集群规范"中进行描述. 本教程以redis使用者的角度,用简单易懂的方式介绍Redis集群的可用性和一致性. 注意: 本教程要求redis3.0或以上的版本. 如果你打算部署redis集群,你可以读一些关于集群的详细设计,当然,这不是必须的.由这篇教程入门,先大概使用一下

Infinispan 8 中新的 Redis 缓存存储实现

Infinispan 8 包含了一个新的在 Redis k/v 服务器中存储缓存数据的 cache store.这个 cache store 可以把缓存数据存储在一个集中的 Redis 中,所有的 Infinispan 客户端都可以访问. Cache store 支持三种 Redis 的部署方式:单服务器.主从切换(Sentinel)和集群(需要 Redis 3 支持).目前支持的 Redis 版本包括 2.8+ 和 3.0+. 数据过期和清理由 Redis 负责,可以减轻 Infinispan