MySQL作为公司根底架构的主要组件,早期就被Facebook用于存储像文章,评论,赞(likes)和页面之类的数据。
我们展示数据的一种方法就是社交图谱(social graph),此中的工具如人(people),文章(posts),评论(comments)和页面(pages)是经过节点间分歧的关系类型(模子)互相联系关系(图中的有向边-directed edges)的。分歧的联系关系关系类型可以表现老友关系(friendship between two users),用户爱好某个工具的关系(user like another object),还可以表现文章属主(ownership of post)关系等等。
过来的5到10年里,数据库范畴又迎来了一次立异的低潮,像NoSQL和NewSQL曾经成了关系数据库(relational databases)的强力竞争者。与此同时硬件范畴也在敏捷地开展,固态存储装备和多核CPU曾经成为业界的主流,可以为数据库供给宏大的功能晋升。固然我们曾经可以经过让MySQL运用FlashCache来发扬出固态存储装备的优势,可是对基于固态存储的数据库优化另有非常多任务要做,只要如许才干最大限制的开掘出硬件的功能。
这些改动对Facebook来讲意味着甚么?起首,它意味着在进步呼应速度的同时我们有更多的时机来进步数据库根底设备(infrastructure)的效力,如下降动力的运用和硬件的开支。其次,它意味着我们需求对那些为处理Facebook负载而行将上线的数据库系统在适应性(suitability)和功能方面做一次系统的评价。
MySQL很好地统筹了灵敏性、功能和易于治理的特征,可是我们的数据库项目团队仍不时地探究在MySQL中存储社交图谱数据的其他办法。后来我们运用一些开源的功能测试Tools来评测数据库系统。但是,数据库功能测试的黄金规律是要在真实的产品负载状况下去测试系统的功能,可是普通的Tools都达不到如许的请求。当需求对Facebook根底设备中的某个主要组件实行调剂时,我们需求了解在生产负载的状况下数据库系统是怎么运作的。我练习的大部分工夫都用于剖析社交图谱的数据和数据库查询时的负载,因此我提取了很多LinkBench可以用来对负载实行建模的要害参数。
LinkBench运用的一个特殊主要的属性就是出度散布(out-degree distribution),它把持图中每一个节点的出度。出度在过来人们研讨过的很多收集中像人际关系网或网页间的链接都遵照着幂律散布(power-law distributions),这关于包括着各类节点类型的社交图谱也异样实用,以下图所示:
LinkBench也需求模仿在生产情况下对数据库的查询操作。Facebook网站和手机使用所运用的数据大部分来自于内存缓存,只要一切写操作和小部分读缓存缺失(cache-miss)状况下才会运用到MySQL。Facebook的任务负载首要是以大量的读操作为主的,因而即便在缓存射中率很高时,读操作缺失(read miss)也弘远于写操作的。
下面的图展现了在生产情况中的某个数据库实例上分歧的操作跟着工夫的推移而发生的负载变更。从图中可以看到关于边的操作和读操作,特殊是鸿沟扫描(edge range scan)会给系统带来极大的担负。举个鸿沟扫描的例子,如“按最早到比来的工夫次序找出某个文章的一切评论”或“找出某个用户的一切老友”。
在真实情况中的MySQL实例上,对社交图谱的各类操作跟着工夫的变更图。百分比是按相对以后实例上每秒均匀操作数盘算得来的。
经过对负载跟踪(workload trace),并进一步剖析了分歧操作的拜访形式(access pattern)后,我发明了一些更风趣的工具:LinkBench被设计为可定制和可扩大的。它答应我们经过生成社交图谱的子集来模仿负载,这一特征对评价数据库处置特定联系关系类型的功能来讲是相当主要的。例如,将以写为主(write-heavy)和读为主(read-heavy)的联系关系类型辨别存储到分歧的数据库后端是有需要的,因而我们可以针对每品种型做独自的功能测试。它也答应我们运用比拟轻易的办法来编写适配器从而支撑新的数据库系统,因而我们可以比拟出在类似的负载下它与MySQL的功能差别。
真实的功能测试任务是由LinkBench driver担任的,它是一个用于生成社交图谱和各类操作的Java顺序。测试任务分为两个阶段:载入阶段(load phase),会生成一个初始的图谱并载入(loaded in bulk)到数据库中;恳求阶段(request phase),很多恳求线程会用各类操作对数据库实行并发拜访。在恳求阶段,各类操作的延迟和吞吐量城市被统计并给出陈述。
我们对打了Facebook补钉(请看http://www.facebook.com/MySQLatFacebook)的MySQL 5.1.53实行功能测试。我们在数据库中生成了12亿个节点和49亿条边,用MySQL规范的未经紧缩的InnoDB表存储,占用了1.4TB硬盘空间。MySQLServer具有2个CPU,8+中心(8+ cores/socket),144G内存,和16kB读取延迟(read latency at 16kB)小于500μs的固态硬盘。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务