本文主要是介绍解剖“全球最大男性交友网站”,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十五年数据库架构演进的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!