Pinterest MySQL实践利用分片来解决百亿数据的存储问题
mysql视频教程 栏目介绍利用分片解决百亿数据的存储 推荐(免费): mysql视频教程 这是一个关于我们在多个 MySQL服务器上分割数据的技术研究。我们在2012年年初完成了这个分片方法,
mysql视频教程栏目介绍利用分片解决百亿数据的存储
推荐(免费):mysql视频教程
这是一个关于我们在多个 MySQL服务器上分割数据的技术研究。我们在2012年年初完成了这个分片方法,它仍是我们今天用来存储核心数据的系统。
在我们讨论如何分割数据之前,让我们先了解一下我们的数据。心情照明,巧克力草莓,星际迷航语录……
Pinteres 是你感兴趣的所有东西的发现引擎。从数据的角度来说,Pinterest 是世界上最大的人类兴趣图集。有超过500亿的 Pin 被 Pin 友们保存在10亿块图板上。 用户再次 Pin,喜欢其他人的 Pin(粗略地说是一个浅显的复制品),关注其他 Pin 友,画板和兴趣,然后查看主页上所订阅Pin友的所有资讯。 太好了! 现在让它扩大规模!
成长的痛
在2011年我们取得了成功。 在 一些 评估报告里,我们的发展比其他的初创公司要快得多。在2011年9月,我们每一项基础设备都超出了负载。我们应用了一些 NoSQL 技术,所有这些技术都导致了灾难性的后果。 同时,大量用于读的 MySQL 从服务器产生了大量令人恼火的 bugs,特别是缓存。我们重构了整个数据存储模式。为了使之有效,我们仔细制定了我们的要求。
业务要求
解决方案由于需要将海量的数据切片分布到多个数据库实例上,不能使用关系数据库的连接、外键或索引等方法整合整个数据。想想就知道,关联的子查询不能跨越不同的数据库实例。
我们的方案需要负载平衡数据访问。我们憎恨数据迁移,尤其是逐个记录进行迁移,因关系的复杂性,这样非常容易发生错误且加重系统不必要的复杂性。如果必须要迁移数据,最好是逻辑节点集的整体迁移。
为了达到方案实施的可靠迅速,我们需要在我们的分布式数据平台上使用最易于实现、最健壮的技术方案。
每个实例上的所有的数据将被完全复制到一个从实例上,作为数据备份。我们使用的是高可用性的 MapReduce (分布式计算环境) 的 S3 。我们前端的业务逻辑访问后台数据,只访问数据库的 主实例。永远不要让您的前端业务去读写访问从实例 。因为它与 主实例 数据同步存在延迟,会造成莫名其妙的错误,一旦将数据切片并分布,没有一丝理由让你前端业务从 从实例 上读写数据。
最后,我们需要精心设计一个优秀的方案生成和解析我们所有数据对象的 全局唯一标识( UUID ) 。
我们的切片方案
不管怎样,我们需要设计符合我们需求的,健壮的,性能优良和可维护的数据分布解决方案。换句话说,它不能稚嫩(未经广泛验证)。因此,我们的基础设计建立在 MySQL 之上,参见 we chose a mature technology(选择成熟技术) 。设计之初,我们自然会跳开不用那些号称具有自动分布(auto-scaling)新技术能力的数据库产品,诸如 MongoDB,Cassandra 和 Membase 之类的产品,因为它们似乎实施简单却适用性太差(常常发生莫名其妙的错误导致崩溃)。
旁白:强烈建议从底层基础入手,避免时髦新鲜的东东 — 扎扎实实把 MySQL 学好用好。相信我,字字都是泪。
MySQL 是成熟、稳定并且就是好使的关系型数据库产品。不仅我们用它,包括许多知名大公司也使用它作为后台数据支撑,存储着海量的数据。(译注:大概几年前,由于MySQL随着 SUN 被 Oracle 的收购,归到 Oracle 名下。许多公司,如 google,facebook 等由于担心 MySQL 的开源问题,纷纷转到由 MySQL 原作者开发的另一个开源数据库 MariaDB 下)MySQL 支持我们对数据库要求按序数据请求,查询指定范围数据及行(记录)级上的事务处理的技术要求。MySQL有一堆功能特性,但我们不需要那些。由于 MySQL 本身是个单体解决方案,可我们却要把我们的数据切片。(译注:此处的意思是,一个单实例管理海量的数据,势必造成性能问题。现在把一个海量整体数据切片成一个个单体数据集,需要一个强有力的技术解决方案,把一个个的单体整合成一个整体,提高性能还不出错)下面是我们的设计方案:
我们起始使用8台 EC2 服务器,每台服务器都运行一个 MySQL 实例:
每个 MySQL 服务器各自以 主-主备份( master-master replicated )到1台冗余主机作为灾难恢复。我们前台业务只从主服务实例读/写数据 。我建议你也这么做,它简化许多事情,避免延迟故障。(译注:主-主备份( master-master replicated ) 是MySQL数据库本身提供的功能,指两台机器互做备份的一种模式,相对其它模式,如 主-从备份,两台机器数据完全一致,后台同步,每台机器有自己单独 IP 都可访问,可并发读/写访问。但原文作者一再强调的是虽然这两台互为冗余使用 主-主备份,都可访问。但你逻辑上区分 主-从,永远只从其中一个进行读/写。例如,图中所示, MySQL001A 和 MySQL001B 间 主-主备份,但你只从 MySQL001A 进行读/写访问。另:他们使用了16台机器,另8台做从机的可能不是 EC2 也未必)
每个 MySQL 实例可以有多个数据库:
注意每个数据库是如何唯一地命名为 db00000,db00001,直到 dbNNNN。每个数据库都是我们数据库的分片。我们做了一个设计,一旦一块数据被分配到一个分片中,它就不会移出那个分片。但是,你可以通过将分片移动到其他机器来获得更大的容量(我们将在后面讨论这一点)。
我们维护着一个配置数据库表,此表中记录这切片数据库在哪台机器上: