解剖“全球最大男性交友网站”,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/535559

相关文章

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架