成人网站YouPorn使用Redis之经验谈
RedisToGo 的贾斯汀(Justin)最近对Manwin集团(YouPorn和Pornhub之类的成人网站背后的公司)的 IT 总监埃里克(Eric Pickup)做了一次采访。在采访中,埃里克讲述他们向 Redis 的迁移过程,为什么要做这样的迁移,以及迁移后的成效。对 Redis 感兴趣的朋友,可看看他的《建立一个易于扩充规模的网站》(Youtube)视频。下面是 Justin 对 Eric 访谈的译文。
贾斯汀:您能否谈谈你们为什么要过渡到Redis?
埃里克:基本上,大约两年前我们收购了这个网站(YouPorn)。当时它是用Perl编写的,这也是我被招进来的原因之一。虽然我曾经用Perl干过活,但是我们很快就认定了用它维护这个网站不可行。Perl的开发人员不足,尤其是能力强的高级开发人员更少。所以,如果我们继续用Perl维护它,它只能成为一个停滞不前的网站,而这显然是我们不想做的事情。
很快,我们决定要重构网站并开始调研不同的技术。其实我们的第一反应是PHP,但我们不想太早把自己局限住,所以我们也调研了基于Java的解决方案。在对我们内部实验过的技术进行了大量研究分析之后,我们决定坚持用PHP。
以前,我们也实验过Redis,Varnish和其他一些技术。有些我们内部的网站已经开始使用Redis,主要是用来做缓存解决方案。但我们还想知道,我们是否可以把它作为一个真正的数据存储平台来使用。
我们做了一些早期的测试,并把性能作为主要的决策因素,因为这在当时是(现在也还是)我们的一个大问题。我们对Redis的总体性能感到非常震撼,在经过一些讨论后,我们决定要使用Redis作为网站的主数据库。
此前该网站使用传统的LAMP架构编写而成。它用到了Linux,Perl,MySQL和Memcached。过渡过程显然是有一些难度的。实施过程有个折中:我们在架构中保留了MySQL,而且事后对此我真的很高兴我们这样做了。我们的网站并没有直接去读取MySQL数据库,但我们可以用它来做类似于填充新的列表或散列之类的事情,以及我们没有预见到的一些功能。我们更多地是用MySQL来实现现有的数据查询,Redis则用于网站。
我们开始用它做开发之后不久,我们很快认为我们做出了正确的决定。然后在开发了一个月左右的时间后,我们准备重新审视我们的决定,但很快就觉得没问题。这真的是一个很适合我们应用案例的技术。
贾斯汀:为什么这样说呢?在评估它是否是一个很好的决定的问题上,你们主要看哪些因素?
埃里克:很明显,易于开发是一个重大的因素,尤其是当你像这样重构整个项目的时候。幸运的是,Redis的数据结构和我们在做的工作匹配得很好。
YouPorn从根本上来说,主要是视频和对象的列表,无论是评论、喜欢、最受好评的影片,或观看次数最多的视频。这些都是列表和对象,显然很容易映射到哈希表里。我们也使用其他的一些数据类型,但我不得不说,我们使用的90%左右都会落到有序集合或哈希的结构里。
贾斯汀:决定使用Redis后,需要多久才能真正进行实施并使之生效?
埃里克:说实话,在当时我们还在提升团队能力。就像我说的,这是一个全新的项目,所以在起始阶段主要只有我和另外一个人。
我得说,在大约四个星期之内,我们就做出了网站原型的相当一部分。我们做好了首页,所有的主要页面,以及大部分的视频页面。你还可以查看评论 – 尽管那时候你还不可以增加评论 – 很多事只是两个人在短短的四个星期完成。这个时间表还包括了学习新的框架(那时候用了Symphony),所以说我们启动和运转都是很快的。
贾斯汀:您正在使用的Redis实例有多少个?
埃里克:我没有具体的数字,但应该不到10个。
贾斯汀:这真是令人印象深刻。你们怎么做到只用这么少的?
埃里克:随着时间的推移,我们不断新增功能,Redis实例数也是不断增加的,但一般来说,我们用Redis做了很多的缓存工作。我们第一次推出网站的时候,我们没有做缓存。我们只是依靠Redis本身。
随着时间的推移,我们发现以我们的标准来看服务器运行负担过重,所以我们开始添加某些级别的缓存。我们在网站上布署了第二个Redis节点,它用很短的缓存时间来处理最流行的页面视图。
你还必须明白,我们也使用了Varnish,它位于Web服务器的前端,所以网页本身也有相当数量的缓存,所以我们不会通过Redis来缓存每个页面。
贾斯汀:你去做架构上的决策的时候,你能否谈谈你是如何决定在哪里使用Redis的,在实施过程中有没有修正你的决策呢?
埃里克:我想说Redis是我们知道我们是要使用的热门技术之一。它和Varnish,他们都是我们早期就决定要用的。我们对它们的测试结果是相当不错的,就像我说的,我们公司之前就用过它们,所以它们对我们来说并不是未知的东西。
要说我们有什么修正,最大的变化是增加了Redis二级缓存层。这真的降低了服务器上每秒的查询数,并让我们有更安全的网络。
贾斯汀:实施后最大的好处,你觉得是什么?
埃里克:第一,我会说,是Redis带来的强大的快速创建新功能的能力。其实我的意思是,不只是Redis,而是完整的开发框架带来的,但我们已经写了一个基于Redis的基本库之上的很不错的库,这使我们能够迅速的把新功能融合到一起。这绝对是我们所见过的最大的好处。
(编译补充:2012年2月份,YouPorn 的技术人员 Eric Pickup 在 Google 群组宣告他们网站改用 Redis DB 后。扛住了每天1亿PV浏览量,每秒30万请求,已经坚持 2 周。)
贾斯汀:进行这种迁移的一些障碍或困难是什么?有没有什么定制化的东西,你必须弄清楚然后自己来做的吗?
埃里克:这我得想想。实现缓存层花了一些时间。就像我说的,当时服务器负担很重,而我们并不想为了这个问题投入越来越多的服务器,所以构建一个解决方案花了一些时间。
其他花时间的就是需要琢磨一些事情。现在,大多数使用Linux系统搭建的网站都使用MySQL作为数据存储。 MySQL的确拥有巨大的优势,它有大量的文档。如果你碰到一个问题,没准有人在此之前已经解决过了,你会找到一堆网站上都提供了相应的信息和建议。 Redis根本就还没有这样的社区。如果你想看看其他已经设置好的人写的东西,比如他们学到了什么,他们使用哪些设置,他们的经验是什么,会发现这样的信息很少。因为只有很少的提示和技巧,所以学习曲线上需要克服的困难就更多了。
相比MySQL,Redis的文档少得多,所以寻找寻求问题的解决办法或其他简单的事情,比如设置到磁盘的复制,需要多一点的时间。不过,由于Redis越来越受欢迎,文档和社区正在开始形成。
贾斯汀:你有任何提示或技巧想和我们的观众分享吗?
埃里克:我最想说的是最有价值的经验中最重要的一些,可是我懂的也不多。我不是系统管理员,而最重要的很多基本都是系统管理一类的东西。我想说很容易错过的一招是,当你设置到磁盘的复制时,如果你的磁盘是主从的集群,你要确保每个实例之间有足够的时间差,这样你就不会碰上所有实例都正好同时决定写磁盘的局面。
这很容易被忽视。我们起始时的服务器都运行正常,但后来,当我们添加更多的服务器的时候,我们保持了默认设置,而后来不得不去修复。这是人们可以从中受益很多的经验之一。我是软件开发人员,我会说最真实的经验教训是在系统管理层面。可我没有足够的信息来真正深入探讨这些问题。
贾斯汀:太好了。感谢您给我们这么棒的访谈,希望Manwin集团一切顺利!
埃里克:感谢您对我的采访。