解剖“全球最大男性交友网站”,GitHub十五年数据库架构演进

本文主要是介绍解剖“全球最大男性交友网站”,GitHub十五年数据库架构演进,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库编程大赛:一条SQL计算扑克牌24点

近期,GitHub全面升级到了MySQL 8.0。ITPUB特别邀请了NineData创始人、资深技术专家叶正盛老师,为大家解析GitHub历年数据库架构的发展历程,以及大型网站何时进行分库分表的改造。

图片

Hello,各位朋友!今天,我们一起来回顾GitHub,这个被程序员亲切地戏称为“全球最大的男性交友网站”的平台,在过去十五年的数据库架构演进历程。

GitHub自2008年上线以来,已经演变成全球最大的开源软件托管平台。在这里,约有1亿名程序员在这里贡献代码、交流思想。这背后,GitHub根据业务发展需求完成了数据库架构的多次升级,让我们一探究竟。尤其是大家比较关注的大型网站何时做分库分表的改造。

图片

2008年:单机的简约之始

图片

最初,GitHub非常简单,仅仅使用了一个单机的MySQL 5.0数据库。应用开发语言是Ruby on Rails,这个也是当时非常流行的开发语言和框架。

2009年:迈向主备架构

单机的数据库肯定是不合格的,可靠性风险太高,到了2009年,随着业务发展,GitHub迈向MySQL的主备架构,并采用了基于数据块同步的DRBD软件来执行主备复制,硬件上则是两台配备了8核32G内存和15,000转的SAS机械硬盘的服务器。

图片

2013年:性能提升与IDC搬迁

2011到2012年,GitHub将MySQL升级至5.1。

2013年,为了进一步增强数据库性能,GitHub执行了一次IDC搬迁,数据库硬件也得到了显著升级,尤其是采用了SSD固态硬盘和万兆网卡,这使得性能提升了一倍以上。期间,GitHub还进行了一次在线迁移,并宣布整个停机时间仅为13分钟,显示出了其在数据库管理上的高效能力。

细节上,GitHub通过进行大量历史数据清理,不仅节省了空间,并且提升了缓存的命中率。

这次升级后,GitHub的网页加载时间加快了一倍以上。

图片

2015-2016年:MySQL5.6/5.7

到了2015年初,GitHub进一步迈向MySQL 5.6,并在2016年升级至5.7。由于5.6到5.7都属于小版本升级,所以操作过程比较简单。根据业务拆分了很多集群,中间使用了ProxySQL代理服务,整体都是读写分离的技术架构。

图片

发布GHOST,创新地解决MySQLDDL锁表难题

MySQL表结构的变更往往会带来锁表问题。之前,通常使用Trigger(触发器)方案来解决。当时我在阿里巴巴集团工作时,对这个问题也非常关注,我们内部开发了一个名为MyDDL的软件。虽然我们考虑过通过解析binlog来减少服务器的影响,但由于技术难度,这个想法并未去实践。

2016年,GitHub推出了基于解析Binlog的GHOST(GitHub Online Schema Transformer)工具,实现了在线DDL的功能。这一解决方案现在在业界颇受欢迎,并且已经开源到了社区。

图片

重磅:分库分表架构升级

到了2019年,根据GitHub的公开数据,数据库每秒有95万次请求,其中主库请求5万次/秒,从库达到90万次/秒,这是一个典型的“读多写少”的负载。随着业务不断增长,单纯的主备架构已无法满足需求。GitHub开始做分库分表的数据库架构升级,GitHub选择了海外流行的Vitess,一款YouTube内部使用并后来开源到社区的分库分表中间件,相当于分布式的数据库方案,为业务的持续快速发展提供了强有力的支持。

图片

图片

2020年,GitHub进一步升级了他们的缓存解决方案,将Redis缓存替换为分布式版本,并完全替换了原有的Memcached。

重大的跨版本升级:MySQL5.7至8.0

进入2023年,GitHub将MySQL的5.7版本全面升级至8.0版本。这次大版本跨越,非常复杂,官方博客中有非常详细的介绍。他们不仅要做到在线升级,还要制定相应的回滚方案,并设置了MySQL5.7到8.0,以及8.0回退到5.7的复制链路,以确保万无一失。

图片

图片

GitHub这套方案非常复杂,主要是为了确保能够实现在线升级,如果升级失败,还可以回滚到老MySQL5.7,官方透露中间也踩了很多坑,这个需要非常资深的DBA团队才能完成。

我本人在数据迁移这个领域工作了很多年,开发了NineData产品,可以帮助客户做在线的数据复制、数据库迁移升级、ETL等能力,NineData做在线数据迁移的原理是通过解析Log实现,同时支持双向复制,这样可以做到如果升级失败,还能一键完成数据回滚。

图片

现如今,GitHub的总数据量约为300TB,使用了1200台数据库服务器,包括IDC主机和Azure云主机,反映了其云上和云下混合云架构的特点。

启发与总结

GitHub的数据库演进历程给我们丰富的启发:在业务初期,数据库架构尽量保持简洁,MySQL+Redis的数据库加缓存结构能够支撑到100万QPS左右,期间可以使用缓存、数据库读写分离、历史数据归档、业务垂直拆分、硬件升级等方案让数据库架构尽量保持简单。在按业务垂直拆分后,当超过了单机负载,就需要采取分库分表解决方案,这个升级会比较复杂,需要做好充分的业务改造预估以及SQL逻辑和性能的测试。GitHub选择的Vitess的分库分表中间件,国内也有很多解决方案,如PolarDB-X、TDSQL、SharedingSphere、TiDB和OceanBase等等,都是相对成熟的选择。

图片

GitHub的发展历程不仅是互联网数据库技术演进的缩影,也是对那些面临数据库扩容、分库分表等挑战的公司的一个借鉴。希望这里的分享能给您带来些许启示。如果您觉得有所帮助,请不吝分享给您的同事和朋友。

作者介绍

叶正盛

玖章算术CEO,NineData创始人

资深数据库专家,原阿里云数据库产品管理与解决方案部负责人,阿里巴巴去 IOE、异地多活、云计算多次技术变革核心成员,带领团队研发了阿里云数据传输DTS、数据管理DMS、数据库备份DBS、数据库自治DAS等产品。

这篇关于解剖“全球最大男性交友网站”,GitHub十五年数据库架构演进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/535560

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

poj 3723 kruscal,反边取最大生成树。

题意: 需要征募女兵N人,男兵M人。 每征募一个人需要花费10000美元,但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱。 给出若干的男女之间的1~9999之间的亲密关系度,征募某个人的费用是10000 - (已经征募的人中和自己的亲密度的最大值)。 要求通过适当的招募顺序使得征募所有人的费用最小。 解析: 先设想无向图,在征募某个人a时,如果使用了a和b之间的关系

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta