作者文章: Fenng

Flickr Stats 功能的设计经验

继续我的学习笔记之旅。Flickr 的 DBA Dathan Pattishall 在前几天的 MySQL 大会上分享了 Scaling Heavy Concurrent Writes In Real Time (Record every Referral for Flickr Realtime) ,其中介绍了 Flickr Stats 的设计经验。国内好多 Web 站点其实也在设计类似的功能,只是不知道细节罢了。

数据结构原型

字段               数据类型         
Path_query Varchar(255) PK
Domain Varchar(50)
Owner Bigint
When Date
Object-ID Bigint
Object-Type Tinyint
Counts and stuff Various ints May be some keys

主键是字符串,开销太大。其他的索引如果做主键,也比较大。当表大小超过内存的时候,插入速度很慢,I/O 能力也上不来。

优化数据结构

数据预处理,通过 CONV(SUBSTR(MD5(Url),0,16),16,10) 把 Path_query 修改为 64 位的 ID (8字节), 主键为 ID+Owner+object+object-type,这个统计信息很容易抽象到一个数据对象,这个索引的设计也在于此。

另外补充一点,利用 PHP 的 ip2long() 和 long2ip() 函数对 IP 地址作预处理,耗费的存储空间只为原来地 25%,这是个很有趣的技巧。

数据 Sharding

对于海量的数据,以一个礼拜为间隔,水平分割。按照不同的数据力度每周一个表,每年一个全局表,再加上一个汇总表。数据量越大,InnoDB 存储引擎针对字符串的索引浪费的空间就越大。单个查询的 I/O 也自然大了起来。

所有应用对 DB 的响应要求 是 300 毫秒。但高并发写入的时候响应时间就糟糕起来。Flickr 的 Java 牛人实现了 Referral 队列,每 4000 条做批量处理。这样 IO 拥塞的就解决掉了。

总体的服务器规模过去 介绍过,对专业版用户的数据是永久保留的,而普通用户则只保留几周,为节省空间,采用 MyISAM 引擎,当用户转为专业版时,迁移数据。

补充一下,抓取 URL 是用的 curl 。最后,这篇 PPT 在线观看。

–EOF–

补充一张图:

Flickr Stats.png

这是该功能的 UI 设计。

  • 1) 请求触发统计。默认不激活统计。从而节省大量不必要的开销;
  • 2) 统计,没必要过度设计;
  • 3) 元素可点击
  • 4) 设计洁癖

《功夫之王》喜剧之王

公司团队活动,集体观影。笑翻,没想到李连杰、成龙联手,喜剧效果直逼星爷。

打斗固然精彩,冲着李、成两位,票钱也不冤枉。必需要说的是,台词超经典。举一个例:

天行者:"我们是不是不能走出沙漠了?...我都快要冻死了" 
默僧(李连杰)慢慢转头(深沉地):"不要忘了呼吸"

鲁彦(成龙)喝的那个长生不老药…绿色液体…看到那里我禁不住脱口而出,「好像雪碧」

最后的玉帝,演出效果和《食神》里面那个梦遗大师颇有神似之处。问天行者要实现啥愿望(这不就是按照上帝的功能来整嘛),「我只想要回家」,玉帝长出一口气说道:「那我就放心了」。

–EOF–

读书日晒一下书单

今天是世界读书日。不说技术这些无聊的东西了,晒一下今年以来在卓越亚马逊上的购书清单。

* 德川家康/第六部双雄罢兵
* 山南水北
* 漫长的告别
* 乡土中国–故园徽州
* 德川家康–第五部.龙争虎斗
* 大败局(修订版)
* 激荡三十年–中国企业(下)
* 鹿鼎记(共5册新修版)/口袋本金庸作品集
* 激荡的百年史(插图珍藏本)
* 汪曾祺谈吃
* 德川家康4:兵变本能寺
* 乌合之众:大众心理研究(最新版本)
* 抗战时代生活史
* 中国古代文化常识(插图典藏本)
* 痛风的诊断与治疗/临床常见病症诊疗丛书
* 银元时代生活史
* 魔鬼经济学
* 德川家康3:天下布武

看来这段时间就和《德川家康》较劲了。另外比较喜欢韩少功《山南水北》的恬淡。《银元时代生活史》传递出来的生活趣味也很有意思,和去年看过的《侠隐》有的一比。

发现自己对书的评语基本上分「好看」与「不好看」,如何好看? 有趣,如何有趣? 好看…

–EOF–

eBay 的 Personalization Platform 采用 MySQL

过去写过很多关于 eBay 数据平台架构的帖子,过去eBay 的信息架构里 DB 都是采用 Oracle 的,大多数 DBA 朋友也都知道 eBay 在 Oracle 方面的技术搞得非常好。这次的 The 2008 MySQL Conference & Expo 披露出来的信息,eBay 在 MySQL 上做了很大胆的尝试,eBay Personalization Platform 就是用 MySQL 打造的。Sun 当然不会放弃这个大好的宣传机会(这两家在技术上的合作一向也比较多),所以年度最佳应用给了 eBay (一同获奖的还有 Virgin Mobile France 和 Facebook )。

面临的应用场景:客户端 Cookie 最大 4K,如果要传递更多定制化信息就不好搞了。作为电子商务站点,肯定有要为用户提供更具有关联性的商品信息的业务需求,这样就要跳出原有的窠臼。通过数据库集群来存储类似的信息就是有必要的,但 eBay 原有 Oracle 数据库上的压力已经很大。

eBay 采用 MySQL Memory Engine 做数据库 Cache 层解决方案(如果纯粹用 Memcached 类似的方案也不太适合的,读写比例接近), eBay 工程师 Igor Chernyshev 对内存引擎做了质的改进,而这些改进是开放出来的(Mysql-heap-dynamic-rows 项目,对 VARCHAR 列的内存开销算法做了革命性的改进)。另外一个 Patch 扩充了并发能力,一台普通的 Sun 4100 上能支撑 20000 个并发连接。每秒钟处理 13000 个 TPS,读写各半。25 台机器组成的集群,每天支撑 40 亿次的读写请求,为每个用户传递的定制数据平均大小 40 K,从 4K 到 40K ,足够多的定制信息可以存储了。

架构示意图(来源):
eBay_mysql_platform.png

这个个性化平台系统虽说关键,但是存储的数据并非不能丢失的。这也是 eBay 大胆采用 MySQL 的一个考虑因素吧。

MySQL 更大规模部署时代似乎来临。

–EOF–