尽管Facebook使用MySQL,但它们并不是一成不变的使用它。 事实上,他们的团队已经提交了许多MySQL核心和Innodb插件的高性能增强。 他们的主要重点是增加性能计数器到Innodb。 其他更改集中在IO子系统上,包括以下新功能:
1 innodb_io_capacity:设置服务器的IO容量以确定后台IO的速率限制
2 innodb_read_io_threads, innodb_write_io_threads:设置后台IO线程
3 innodb_max_merged_io:设置可能合并到一个大IO请求中的相邻IO请求的最大数量
Facebook使用MySQL作为键值存储,其中数据随机分布在一大组逻辑实例中。 这些逻辑实例分散在物理节点之间,负载均衡在物理节点级完成。 Facebook已经开发了一个分区方案,其中全局ID被分配给所有的用户数据。 他们也有一个自定义的归档方案,它基于每个用户的频繁和最近的数据。 大部分数据是随机分布的。 令人惊讶的是,据传Facebook有1800个MySQL服务器,但只有3个全职DBA
。我分享下他们MySQL运维优化的逻辑,大家可以借鉴参考一下。本质上讲,他们用的是修改后的MySQL,不是原生MySQL。Facebook创办以来就一直在使用MySQL数据库,也随着数据量的增大而不断改进他们的自有MySQL,目前已经可以轻松支撑来自20多亿用户的数据量。
所以Facebook优化MySQL的经验我觉得有很多借鉴学习之处,有相关数据库经验也可以在评论区讨论探讨,互相学习学习。
1.每台机器都使用多实例的模型,每个机器放多个实例,每个实例放多个DB,多实例之间没有资源隔离,充分发挥实例间的最大性能。
2.将大部分核心业务引擎切换到MyRocks,不改变服务器配置大概可以节省一半服务器资源。
看了这么多,作为一个当时参与阿里去lOE过程的人,聊聊个人看法。
阿里在定下2014目标上市时,内部就开始发起去IOE运动,2013年收尾。全球上市意味着要经过全球检验,要合法合规(至少大面上要这样)。首要过的,就是专利(如现在高通,每部用它专利的手机都得给它交钱)。随阿里商业化程度的进行,马云就放眼全球。当时核心诉求是,可控性(不能将自己的咽喉放在别人的手上)。记得我当时还问过为什么会发起这么大成本的去IOE化,得到的是IOE不可控(比如orocle,发生一个问题可能几天之后才得到响应,对于快速发展的互联网来说,是不可接受的)。从互联网商业角度来讲,钱不是关键的,时间、流量才是王者。互联网服务要求稳定、快速解决大于一切。这也是现在分布式的核心诉求(大数据也是)。能用钱解决的问题都不是问题,比如互联网企业前期大部分是巨额亏损的(如BAT,滴滴,共享单车…),它们要的是快速占领市场。在此前题下,lOE,有两大致命伤:
1,出问题后解决的效率太低(lOE作为稳定性产品,更新节奏是比较慢的,并且因为不开源,意味着它是黑箱,遇到问题你连找临时解决的方案都很难,等到厂商问题解决,黄花菜都凉了),
2,不可控。互联网是快速试错的过程,今天稳定的东西可能明天就满足不了需求了。指望厂商跟进,就会错过大量的时机(这也是现在大数据技术快速发展和各大互联网企业投入巨大资源自研的原因)。数据库作为互联网核心部件(数据就是金钱),命脉必须掌握在自己手里。开源推进了现代互联网的快速发展,技术不再是少数企业的专利,开源能集结全球人才的聪明才智,能够快速解决问题,而不是局限于等待少数人去改变。开源意味着可预测,可控制、可把它作为基础发展为最适合自身业务的东西。
其它:1,免费,降低成本。2,可研究,人才众多。3,实时大数据,批量。
Facebook最初诞生的时候并不是大公司,所以整个数据底层都是放在MY SQL上,因为MY SQL不需要授权费,对facebook是最划算的,而在发展壮大后,MY SQL同样够用,当然会一直用下去了。
为什么Facebook还会用MY SQL?
1.MySQL早期就是为PC互联网服务的,而且是免费开源的,Facebook早期是学生创业,跟本没钱,而且Facebook最开始是PC产品,用MY SQL是自然的。
2.用MY SQL更省钱。除了MY SQL还有商业数据,比如Oracle数据库,但是商用数据库价格非常的贵,比如官方报价一般25/CPU核,以及采购小型机一般80-120万/台,存储设备一般500万一套,但是Facebook现在有近万台的服务器,这是一笔极为庞大的资金。
MySQL 早期就是为 Web 应用而生的,而 Facebook 正是此领域的业务场景;另外从成本价格来讲,MySQL 开源免费的,Oracle 价格高。在版权上,大公司更注重版权,开发人员也不能随便用盗版,所以,如果全部用正版数据库,肯定增加成本的。而 MySQL 开源免费。当然,也并不是说 MySQL 没啥优点。MySQL 作为是一种开放源代码的关系型数据库管理系统(RDBMS),任何人都可以在 GeneralPublic License的许可下下载且个性化优,另外,MySQL 的可靠性,速度以及它适应性强而受人欢迎。提供用于管理、检查、优化数据库操作的管理工具 用其来管理内容无疑是很好的选择,而且 MySQL 数据库系统使用最常用的为数据库管理语言--结构化查询语言(SQL)进行数据库管理。不仅如此,MySQL 其自身的特点也是它的加分项。它支持AIX、FreeBSD、Windows等多种操作系统。不仅能够作为一个单独的应用程序应用在客户端服务器网络环境中,还能够作为一个库而嵌入到其他的软件中提供多语言支持。虽然其他的大型数据库例如 Oracle、DB2、SQL Server 等相比,MySQL 自有它的不足之处,如规模小、功能有限等,但是这丝毫也没有减少它受欢迎的程度 。当下 IT 行业的走向是开源化、免费化。这就意味着个人可以定制更加具有个性化需求的数据库,从而节省开销。这点上 MySQL 是符合的,阿里巴巴等大型项目也用了 MySQL ,主要用了分布式存储、缓存、分表分库等技术,灵活运用而已。当然,现在许多的数据库的功能虽然很强大,但经常性使用的无非几种,或者有些比较适合自己使用的功能, oracle 等无法定制。所以 MySQL 这种开源的数据库会越来越火。另外,Facebook 也并非一成不变使用 MySQL,节省开销是一回事,但体验使用质量好更是一回事,新的需求产生会催促其进行升级成长,比如 Facebook 建 立了自己的 Cassandra 数据商店并且在其网站上重点推出一项新的搜索功能。据Facebook的工程师 Avinash Lakshma 介绍,Cassandra 仅用 0.12 毫秒就可以写入 50 GB 的数据,比 MySQL快了超过 2500 倍。Twitter公司也计划从 MySQL 迁移到 Cassandra 数据库,因为后者具有更大的弹性、可扩展性和大量的社区网络开源开发人员。欢迎更多交流留言评论 !
其实不止是Facebook,大部分互联网公司都是在使用Mysql数据库(会辅助使用Nosql数据库,这里暂时不讨论)。
首先不能否认的是,如果是按照单库运行,Oracle、DB2这些商业数据库还是很强大的。IT公司的传统套路就是IOE,其中O就是指的Oracle。另外I是指IBM的服务器,E是指EMC列阵存储。三个加起来很强大,基本上可以支持一般的企业的业务,当然,也很贵,非常贵。
当到了Facebook这个级别的公司,数据量可不是几千万,几个亿这个级别的了,这时候如果数据还是单机的话,已经很难支撑基数大、增长快的数据了;这时候的做法就是分库,把数据保存到不同的数据库节点上。
这时候Mysql的优势就显示出来了:
1.facebook确实在使用MySQL,主要是因为免费开源,因为免费降低了成本,也因为开源,其可定制化比较强,基于MySQL的第三方版本也比较多。facebook自己就基于MySQL搞了一个MyRocks数据库。
RocksDB是FaceBook基于Google开源的LevelDB实现的,使用LSM(Log-Structure Merge)树来存储数据。Facebook开发工程师对RocksDB进行了大量的开发,使其符合MySQL的插件式存储引擎框架的要求,移植到了MySQL上,并称之为MyRocks。MyRocks支持基于SQL的数据读写、锁机制、MVCC、事务、主从复制等MySQL绝大部分功能特性。从使用习惯考虑,使用MyRocks还是使用MySQL/InnoDB并没有多大区别。
2.数据量大的问题,主要是通过分布式和分库分表来解决的,并不是单机存储。oracle的缺点就在于这,oracle虽然单机数据处理量大,但是对集群和扩展的支持比较差。mysql单机不行,但是可以集群啊,集群不够,还可以分布式啊。况且facebook这种业务,也不适合oracle。
Mysql的优点很多,主要列举以下几点:
(1) 是开源的,就是说是免费的,你不需要支付额外的费用。
(2) 是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
(3) MySql的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。
(4) 拥有一个非常快速而且稳定的基于线程的内存分配系统,可以持续使用面不必担心其稳定性。
因为没有哪种数据库能支撑这么大的数据量。所以,大型互联网公司都不用oracle,而是用mysql。因为mysql虽然单独1台不如oracle,到时他们会用很多台mysql。
而且,mysql是开源的,facebook等公司用的mysql都是他们优化过的版本,增加了适合他们自己特点的功能和性能的提升。
现代的大用户量的网站早就不用oracle了,而是用分布式的很多台mysql机器。淘宝开始也用oracle,后来发现支撑不了服务,所以慢慢也全部转成mysql了。
2004年成立的Facebook很快便占据了社交网站的榜首,智能手机出现标志着互联网全面转向手机端,在移动互联网时代Facebook的APP也同样霸占着社交APP排名榜首。有很多网友就非常好奇Facebook使用哪个数据库来存储庞大的用户资料?通过了解社交网络的老大哥Facebook的数据库演变,从中吸取宝贵的经验教训。
Facebook中的个人资料不仅仅是姓名、Email、兴趣等属性列表,而是一个非常丰富的社交图谱,包括了亲人/朋友、群组、喜欢、分享等等。刚开始的Facebook社交页面非常简单,采用PHP来构建应用程序,MySql作为长期使用数据库,采用Memcache作为后备缓存支持。PHP应用程序可以直接访问MySql和Memcache,中间没有数据抽象层。
这种简单的数据库架构在访问量很少的情况下优势确实非常明显,但Facebook从2005年开始用户量就飞速增长,最终这种数据架构导致了开发人员敏捷性急剧下降。因为工程师需要使用两种截然不同的数据模型来对数据进行处理,MySql存储主从对集合、Memcache则用于存储和提供派生的平面键值的SQL查询,MySql和Memcache相互协作成为了一个很大的难题,开发者使用数据库前首先要获得关于这两个数据库如何相互协作的复杂知识。