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)和性能方面做一次系统的评估。
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硬盘空间。MySQL服务器拥有2个CPU,8+核心(8+ cores/socket),144G内存,以及16kB读取延迟(read latency at 16kB)小于500μs的固态硬盘。
评论删除后,数据将无法恢复
评论(7)