GitHub 是如何从 MySQL 5.7 升级到 8.0 的

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本) InnoDB:现在,在长时间运行的回滚过程中,进度消息会定期记录为信息注释级别的错误消息,最初为 ER_IB_LONG_ROLLBACK_FULL(附加事务信息),后跟连续的 ER_IB_LONG_ROLLBACK. (WL#15822)系统变量的默认值为 group_replication_consistency now BEFORE_ON_PRIMARY_FAILOVER;从以前的版本升级时,已拥有该SYSTEM_USER权限的用户将自动被授予该 OPTIMIZE_LOCAL_TABLE权限。 阅读详情

原文链接


file
15 年前,GitHub 从一个使用一个 MySQL 数据库的 Ruby on Rails 应用程序起步。从那时起,GitHub 不断的演进着 MySQL 架构,以满足平台的扩展和弹性需求,包括构建高可用性、实施自动化测试和数据分片。如今,MySQL 仍是 GitHub 基础架构的核心部分,也是我们首选的关系型数据库。

以下是我们如何将 1200 多台 MySQL 主机从 5.7 版本升级到 8.0 的故事。在不影响我们 SLO 的情况下升级集群并非易事–规划、测试和升级本身就花费了一年多的时间,并且需要 GitHub 内部多个团队的通力协作。

升级的动机

为什么要升级到 MySQL 8.0?随着 MySQL 5.7 的生命周期即将结束,我们将我们的集群升级到了下一个主要版本 MySQL 8.0。我们还希望使用能够获得最新安全补丁、错误修复和性能增强的 MySQL 版本。我们还想测试 8.0 中的一些新功能并从中受益,包括在线 DDL、隐藏索引和压缩的 binlogs 等。

GitHub 的 MySQL 基础设施

在我们深入了解如何进行升级之前,让我们先从 10,000 英尺的高度看一下我们的 MySQL 基础设施:

  • 我们的集群由 1200 多台主机组成。它是我们数据中心中的 Azure 虚拟机和裸机主机的组合。
  • 我们存储超过 300 TB 的数据,并在 50 多个数据库集群中每秒处理 550 万次查询。
  • 每个集群都配置了高可用的主备。
  • 我们的数据是分片的。我们利用水平和垂直分片来扩展 MySQL 集群。我们有 MySQL 集群来存储特定产品领域的数据。我们还为大业务提供了水平分片的 Vitess 集群,这些业务的增长超出了单主 MySQL 集群的规模。
  • 我们拥有一个庞大的工具生态系统,包括 Percona Toolkit、gh-ost、orchestrator、freno 和用于操作集群的内部自动化系统。

所有这些总结起来就是一个多样化且复杂的部署,需要在维护我们的 SLO 的同时进行升级。

准备工作

作为 GitHub 的主要数据存储,我们对可用性保持高标准。由于我们的集群规模和 MySQL 基础设施的重要性,我们对升级过程提出了一些要求:

  • 我们必须能够升级每个 MySQL 数据库,同时遵守我们的 SLO 和 SLA。
  • 我们无法在测试和验证阶段发现所有的潜在故障。因此,为了 SLO,我们需要能够回滚到之前的 MySQL 5.7 版本而不中断服务
  • 我们 MySQL 集群中的工作负载非常多样化。为了降低风险,我们需要原子化地升级每个数据库集群,并穿插安排其他重大更改。这意味着升级过程将相当漫长。因此,我们从一开始就知道我们需要能够维持运行混合版本的环境。

升级准备工作于 2022 年 7 月开始,即使在升级第一个生产数据库之前,我们也需要实现几个里程碑。

准备基础设施的升级

我们需要为 MySQL 8.0 确定适当的默认值并执行一些基准性能测试。由于我们需要操作两个版本的 MySQL,因此我们的工具和自动化需要能够处理混合版本,并了解 5.7 和 8.0 之间新的、不同的或已弃用的语法。

确保应用的兼容性

我们将 MySQL 8.0 添加到了所有使用 MySQL 的应用程序的持续集成 (CI) 中。我们在 CI 中并行运行 MySQL 5.7 和 8.0,以确保在长时间的升级过程中不会出现 regression。我们检测到 CI 中的各种错误和不兼容性,帮助我们删除任何不再支持的配置或功能,并转义任何新的保留关键字。
为了帮助应用程序开发人员过渡到 MySQL 8.0,我们还启用了一个选项,可以在 GitHub Codespaces 中选择 MySQL 8.0 预构建容器进行调试,并提供 MySQL 8.0 开发集群以进行额外的预生产测试。

保持沟通透明

我们使用 GitHub Projects 创建滚动日历来在内部沟通和跟踪我们的升级计划。我们创建了问题模板来跟踪业务团队和数据库团队的清单,以协调升级。

file

升级计划

为了满足我们的可用性标准,我们采取了逐步升级策略,允许在整个过程中进行 checkpoint 和回滚。

第一步:滚动升级 replica 副本

我们首先升级单个副本并在其仍处于离线状态时进行监控,以确保基本功能稳定。然后,我们导入生产流量并继续监控查询延迟、系统指标和应用程序指标。我们逐渐将 8.0 副本上线,直到升级整个数据中心,然后继续升级其他数据中心。我们在线上保留了足够的 5.7 副本以便回滚,但我们不再导入生产流量,而是由 8.0 接管所有只读流量。

file

第二步:更新 replication 复制拓扑

一旦所有只读流量都通过 8.0 副本提供服务,我们就调整了复制拓扑,如下所示:

  • 8.0 主候选,配置为直接在当前 5.7 主下复制。
  • 在该 8.0 副本的下游创建了两个复制链:
    • 一组仅 5.7 个副本(不提供流量,但已准备好以防回滚)。
    • 一组仅 8.0 副本(服务流量)。

拓扑仅在很短的时间内(最多几小时)处于这种状态,直到我们进入下一步。

file

第三步:把 MySQL 8.0 切换为主库

我们选择不在主数据库主机上进行直接升级。相反,我们将通过使用 Orchestrator, 执行 grace failover 将 MySQL 8.0 副本提升为主。此时,复制拓扑由一个 8.0 主数据库和两个附加到其上的复制链组成:一组用于回滚的离线 5.7 副本和一组提供在线服务的 8.0 副本。

Orchestrator 还配置为将 5.7 主机列入黑名单,防止其成为潜在的 failover 候选者,以防止在发生计划外 failover 时意外回滚。

file

第四步:内部实例升级

我们还有用于备份或非生产工作负载的 MySQL。这些也在后续被升级以保持一致性。

第五步:清理

一旦我们确认集群不需要回滚并成功升级到 8.0,我们就删除了 5.7。验证包括至少一个完整的 24 小时流量周期,以确保在高峰流量期间不会出现问题。
Image

回滚能力

确保升级策略安全的核心部分是保持回滚到 MySQL 5.7 版本的能力。对于只读副本,我们确保有足够的 5.7 副本保持在线状态来服务生产流量负载,如果 8.0 副本性能不佳,则通过禁用它们来启动回滚。对于主服务器,为了在不丢失数据或不中断服务的情况下回滚,我们需要能够维持从 8.0 复制数据到 5.7 的兼容性。

MySQL 支持从一个版本到下一个更高版本的复制,但不明确支持反向操作。当我们在临时集群上测试将 8.0 主机升级为主主机时,我们发现所有 5.7 副本上的复制都中断了。我们需要克服几个问题:

  • 在 MySQL 8.0 中,utf8mb4 是默认字符集,并使用更现代的 utf8mb4_0900_ai_ci 排序规则作为默认值。MySQL 5.7 的早期版本支持 utf8mb4_unicode_520_ci 排序规则,但不支持最新版本的 Unicode utf8mb4_0900_ai_ci。
  • MySQL 8.0 引入了管理权限的角色,但 MySQL 5.7 中不存在此功能。当 8.0 实例变为集群中的主实例时,我们遇到了问题。我们的配置管理正在扩展某些权限集以包含角色语句并执行它们,这破坏了 5.7 副本中的下游复制。我们通过在升级窗口期间临时调整受影响用户的定义权限来解决此问题。

为了解决字符排序规则不兼容的问题,我们必须将默认字符编码设置为 utf8,将排序规则设置为 utf8_unicode_ci。

对于 GitHub.com 整体,我们的 Rails 配置确保了字符排序规则的一致性,并使数据库的客户端配置标准化变得更加容易。因此,我们非常有信心能够为最关键的应用程序维持向低版本的复制兼容性。

遇到的挑战

在我们的测试、准备和升级过程中,我们也遇到了一些技术挑战。

怎么处理 Vitess

我们使用 Vitess 来水平分片关系数据。在大多数情况下,升级我们的 Vitess 集群与升级 MySQL 集群没有太大区别。我们已经在 CI 中运行 Vitess,因此我们能够验证查询兼容性。在我们的分片集群升级策略中,我们一次升级一个分片。VTgate(Vitess 代理层)通告 MySQL 的版本,某些客户端行为取决于此版本信息。

例如,一个应用程序使用的 Java 客户端禁用了 5.7 服务器的查询缓存,因为查询缓存在 8.0 中被删除,因此它会报错。因此,一旦单个 MySQL 主机针对给定的键空间进行了升级,我们就必须确保我们还更新了 VTgate 设置以通告 8.0。

Replication 复制延迟

我们使用只读副本来扩展读可用性。GitHub.com 需要低复制延迟才能提供最新数据。

在我们的早期测试中,我们遇到了 MySQL 中的复制错误,该错误已在 8.0.28 上修补。

由于这个错误已经在上游修复,我们只需要确保部署高于 8.0.28 的 MySQL 版本即可。

我们还观察到,导致复制延迟的大量写入在 MySQL 8.0 中更加严重。这使得我们避免大量写入变得更加重要。在 GitHub,我们使用 freno 根据复制延迟来对限流写请求。

通过 CI 的查询语句在生产环境挂掉了

我们知道我们不可避免地会在生产环境中遇到新问题,因此我们采取了逐步升级副本的策略。我们遇到过已经通过 CI,但在生产环境中遇到实际工作负载时会失败的查询。最值得注意的是,我们遇到了一个问题,即带有大型 WHERE IN 子句的查询会使 MySQL 崩溃。我们有包含数万个值的大型 WHERE IN 查询。在这些情况下,我们需要在继续升级过程之前重写查询。查询采样有助于跟踪和检测这些问题。在 GitHub,我们使用 Solarwinds DPM (VividCortex)(一种 SaaS 数据库性能监视器)来实现查询可观察性。

经验和教训

从测试、性能调整到解决已发现的问题,整个升级过程花费了一年多的时间,并涉及来自 GitHub 多个团队的工程师。我们将整个集群升级到 MySQL 8.0,包括临时集群、支持 GitHub.com 的生产集群以及支持内部工具的实例。此次升级凸显了我们的可观察性平台、测试计划和回滚能力的重要性。测试和逐步升级策略使我们能够及早发现问题并减少主要升级遇到新故障类型的可能性。

虽然有逐步升级的策略,但我们仍然需要能够在每一步进行回滚,并且需要可观察性来识别信号以指示何时需要回滚。启用回滚最具挑战性的方面是保持从新的 8.0 主副本到 5.7 副本的复制兼容性。我们了解到,Trilogy 客户端库中的一致性使我们在连接行为方面具有更高的可预测性,并使我们确信来自主 Rails 应用的流量不会破坏兼容性。

然而,对于我们的一些 MySQL 集群来说,这些集群具有来自不同框架/语言的多个不同客户端的连接,我们发现向复制兼容性在几个小时内就被打破了,这缩短了回滚的机会窗口。幸运的是,这些情况很少,而且我们没有遇到在需要回滚之前复制中断的情况。但对我们来说,这是一个教训,即了解已知且易于理解的客户端连接配置是有好处的。它强调了制定指导方针和框架以确保此类配置的一致性的价值。

之前对数据进行分片的努力得到了回报——它使我们能够针对不同的数据域进行更有针对性的升级。这很重要,因为一个失败的查询会阻止整个集群的升级,并且对不同的工作负载进行分片允许我们进行零碎升级并减少在此过程中遇到的未知风险的影响范围。为此付出的代价是,我们 MySQL 集群的增长。

上次 GitHub 升级 MySQL 版本时,我们有 5 个数据库集群,现在我们有 50 多个集群。为了成功升级,我们必须投资可观察性、工具和集群管理的建设。

总结

MySQL 升级只是我们必须执行的一种日常维护工作 - 对于我们在集群上运行的任何软件来说,拥有一个升级路径至关重要。作为升级项目的一部分,我们开发了新的流程和操作能力来成功完成 MySQL 版本升级。然而,我们在升级过程中仍然有太多需要手动干预的步骤,我们希望减少完成未来 MySQL 升级所需的工作量和时间。

我们预计,随着 GitHub.com 的发展,我们的集群将继续增长,并且我们的目标是进一步对数据进行分片,这将随着时间的推移增加 MySQL 集群的数量。构建操作任务的自动化和自我修复功能可以帮助我们在未来扩展 MySQL 操作。我们相信,只有投资可靠的集群管理和自动化,才能使我们能够扩展 GitHub, 并跟上所需的维护,从而提供更具可预测性和弹性的系统。

该项目的经验教训为我们的 MySQL 自动化奠定了基础,并为将来在保持服务能力的前提下,更高效地进行升级,铺平道路。


💡 更多资讯,请关注 Bytebase 公号:Bytebase

【HCIE】FRR+BFD+OSPF与BGP联动 FRR+BFD+OSPF与BGP联动 阅读详情

相关推荐

我是如何让爬虫在小红书风控下“偷数据”的?xhs爬虫这些骚操作你可能想不到

最绝的是,他们连评论区都做了动态加载,第一页显示20条评论,再往下滑就变成“加载失败”,实际上得模拟真人反复上滑下滑才能触发完整加载。上个月我们团队帮一家美妆品牌抓竞品爆款笔记,刚开了10个爬虫账号,结果5分钟不到,系统直接弹窗警告“检测到非正常操作”——后来发现,问题出在Wi-Fi上。小红书的风控每周都在升级,上周还能用的方案,这周可能就得重写。但要是想大规模采集,比如监控竞品爆文、分析用户画像,劝你先算笔账:光是一个能抗封的账号矩阵,每月成本就得烧掉几万块,更别说还得养团队随时应对系统升级。

klj3388的博客 1万+

【Mysql数据库5.7逻辑升级8.0.30 (从删库,到跑路)】

我最早接触mysql用的一直是5.5版本,用5.5版本遇到比较难搞定的问题就是复制单线程,包括一些性能上面的问题,后来升级到5.6到后面的5.7能带来直观的感受就是性能上做的优化以及提升,后来得知5.7即将停服不在更新,加上在项目交付归档安全扫描时遇到的安全漏洞(5.7已经不在提供漏洞修补),决定将mysql来一次大版本升级,最大的风险就是停服风险,数据备份相关工作一定要做好,因为8.0版本相对比与5.7还是有很多改进地方,下面会一一列举,要做好一切计划准备避免未知风险,如果项目整体结构庞大,涉及到的业务场

m0_67864787的博客 1647

推荐系统公平性之流行度偏差(fairness in recommender systems -- popularity bias)

主要参考论文:《The Unfairness of Popularity Bias in Recommendation》 RMSE@RecSys 2019 流行度偏差是什么 先定义流行物品和非流行物品。下图是(Movielens 1M)数据集中物品的评分情况。 图的横坐标表示不同物品,纵坐标表示物品的评分次数。可以看出只有少部分物品得到了很多的评分,大部分曲线尾部的物品都只有少量的评分,我们也把这部分物品称为长尾物品。在本文中,我们取曲线的前20%对应的物品为流行物品,剩余的为非流行物品(长尾物品)。 然

beilizhang的博客 5290

MySQL5.7升级到MySQL8(离线安装升级)

MySQL5.7的安装见此文章:MySQL5.7版本Liunx系统下安装_大宇进阶之路的博客-优快云博客现在最新的mysql8版本安装包,MySQL软件下载官网:MySQL :: Download MySQL Community Server (Archived Versions)解压mysql8安装包:并更改名称为mysql8,放到原先mysql5.7的目录下 更改mysql8的目录权限:chown -R mysql:mysql mysql8 修改vim /etc/my.cnf配置文件尾部增加配置:c

大宇进阶之路的博客 6706

一文吃透 SAP HANA SDA:把分散数据当作本地数据来用的那把钥匙

摘要:SAP HANA SDA(Smart Data Access)技术详解:150字精要 SAP HANA SDA是一种数据虚拟化技术,允许在不复制数据的情况下访问远端数据源。核心功能包括: 通过Remote Source定义连接配置 创建Virtual Table作为本地代理 支持谓词下推优化查询性能 与SDI技术协同工作扩展数据集成能力 典型应用场景包括: 跨系统联邦查询 冷热数据分层管理 混合云数据整合 远程表复制(RTR)实现近实时数据同步 实施要点: 需关注适配器能力差异 合理运用查询下推优化

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 329

MATLAB - 浮动基座机器人的逆运动学

本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。

机器人控制与仿真应用 2440

mysql5.7 源码安装

mysql5.7 源码安装

junzida的博客 1844

QT应用编程: 基于UDP协议设计的大文件传输软件

一、环境介绍 QT版本: 5.12.6 编译器: MinGW 32 传输协议: UDP 功能介绍:软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件;服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。...

2804

php mysql redis orm_GitHub - yumufeng/fastwork: 一个基于swoole的轻量级PHP常驻内存型框架,支持协程、waitgroup、DI容器,Redis连接...

fastwork此框架借鉴了TP5.1的设计,便于自己工作开发中使用,基于swoole4.x 开发的基于swoole_http_server和协程的轻量级swoole框架,支持DI容器,Redis连接池、ORM数据库连接池、Facade门面、router路由、Cookie、Session、日志Log、Validate验证组件等的PHP微框架要求环境php => 7.1.0swoole =&g...

weixin_36047538的博客 224

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

k8291121的博客 2724

以 DeleteRestrictions 与 inlineDelete 为核心的 Fiori Elements 表格删除机制全解

SAP Fiori elements 中删除操作的设计与实现涉及多维度考量。框架默认依据 OData 元数据判断删除能力,通过 DeleteRestrictions 注解实现行级条件控制(deletable-path)。表格支持两种删除模式:工具栏集中删除与响应式表格行内删除,但二者不建议混用。关键约束包括:行内删除仅适用于 Responsive Table,且与多选功能互斥。配置需遵循三层架构:后端能力注解、前端表格形态和运行时交互。设计上强调禁用优于隐藏的可用性原则,并需保持列表页与对象页的删除体验一致

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

GitHub 的底层数据库从 MySQL 5.7 无缝升级到 MySQL 8.0 的实践经验

所以从上述内容可以看出,不管是升级之前所做的准备工作,还是具体升级所制定的计划,GitHub都做了大量备份、冗余、验证的工作,从而保证系统能够顺利切换至新版本机器。另外由于需要操作新老两个版本的 MySQL,其内部所用的工具和自动化设施需要能够支持处理两个混合版本,并了解5.7和8.0之间新的、不同的或者已经弃用的语法。这一步也采取了一种谨慎的升级策略,通过先提升一个8.0版本的副本为新的主用库,来逐步进行数据库的升级,并确保在升级过程中有足够的回滚能力和服务能力。

tSRXH的博客 990

SpringBoot系列之实现一个AI聊天助手

本文介绍了基于Spring Boot框架实现的AI聊天助手项目。该项目使用Spring Boot 3.2.3、Spring AI 1.0.0-M5等技术栈,集成DeepSeek-R1-Distill-Llama-8B模型实现智能对话功能。文章详细介绍了项目配置流程、运行方式和核心代码实现,包括ChatMessage模型类和服务类ChatService的关键功能,如消息处理、历史记录管理和AI响应获取等。读者可通过提供的GitHub链接获取完整代码,快速搭建自己的AI聊天应用。

Nicky's blog 1452

GitHub是怎样把MySQL 5.7升级到8.0的?

并且Orchestrator还把5.7的主机列为故障转移的黑名单,防止发生切换的时候,又出现5.7的实例提升为主的情况。如果在8.0的版本下运行了足够长的时间(至少24小时),则把集群内5.7版本的MySQL全删除。先升级部分副本,然后将部分只读流量切上去,也会保留足够的5.7副本,以方便回滚。那么,你现在所在的公司,线上环境使用的是哪些MySQL版本呢?一部分是5.7的从(暂时不提供查询,用来做回滚用的)。一部分是5.7的从(暂时不提供查询,用来做回滚用的)另外一部分是8.0的从,用来承担只读查询。

Ly768768的博客 107

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[Upgrading GitHub.com to MySQL 8.0] GitHub 升级 MySQL 8

GitHub使用MySQL来存储大量的关系数据。这是我们如何无缝升级我们的生产集群到MySQL 8.0的故事。, and15年前,GitHub作为一个Ruby on Rails应用程序开始,只有一个MySQL数据库。从那时起,GitHub已经发展了其MySQL架构,以满足平台的扩展和弹性需求,包括构建高可用性,实现测试自动化和分区数据。今天,MySQL仍然是GitHub基础设施的核心部分,也是我们选择的关系数据库。这是我们如何将1200多台MySQL主机升级到8.0的故事。

howeres的博客 255

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

这个陪伴我7年的软件,倒下了!

所以从上述内容可以看出,不管是升级之前所做的准备工作,还是具体升级所制定的计划,GitHub都做了大量备份、冗余、验证的工作,从而保证系统能够顺利切换至新版本机器。另外由于需要操作新老两个版本的 MySQL,其内部所用的工具和自动化设施需要能够支持处理两个混合版本,并了解5.7和8.0之间新的、不同的或者已经弃用的语法。这一步也采取了一种谨慎的升级策略,通过先提升一个8.0版本的副本为新的主用库,来逐步进行数据库的升级,并确保在升级过程中有足够的回滚能力和服务能力。

IT界那些事儿 212

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

再见了!这个陪伴我7年的软件!

所以从上述内容可以看出,不管是升级之前所做的准备工作,还是具体升级所制定的计划,GitHub都做了大量备份、冗余、验证的工作,从而保证系统能够顺利切换至新版本机器。另外由于需要操作新老两个版本的 MySQL,其内部所用的工具和自动化设施需要能够支持处理两个混合版本,并了解5.7和8.0之间新的、不同的或者已经弃用的语法。这一步也采取了一种谨慎的升级策略,通过先提升一个8.0版本的副本为新的主用库,来逐步进行数据库的升级,并确保在升级过程中有足够的回滚能力和服务能力。

CodeSheep 1594

再见,MySQL 5.7!!

点击关注公众号:互联网架构师,后台回复2T获取2TB学习资源!上一篇:2T架构师学习资料干货分享大家好,我是互联网架构师!GitHub 团队近日分享了他们将 GitHub.com 的底层数据库无缝升级到 MySQL 8.0 的经验。 据介绍,GitHub 使用 MySQL 来存储大量关系数据,因此在不影响网站服务级别目标 (SLO) 的情况下升级主机集群(1200 多台 MySQL 主机)绝非易...

emprere的博客 125

GitHub.com跑了1200多台MySQL主机,如何无缝升级到8.0?

据介绍,GitHub 使用 MySQL 来存储大量关系数据,因此在不影响网站服务级别目标 (SLO) 的情况下升级主机集群(1200 多台 MySQL 主机)绝非易事。其团队表示,为了升级到 MySQL 8.0,他们规划、测试和升级本身总共花费了一年多的时间,并且需要 GitHub 内部多个团队的协作。由于需要操作两个版本的 MySQL,因此 GitHub 内部使用的工具和自动化设施需要能够兼容处理混合版本,并了解 5.7 和 8.0 之间新的、不同的或已弃用的语法。步骤 4:升级面向内部的实例类型。

IT界那些事儿 121

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

到了2019年,根据GitHub的公开数据,数据库每秒有95万次请求,其中主库请求5万次/秒,从库达到90万次/秒,这是一个典型的“读多写少”的负载。GitHub开始做分库分表的数据库架构升级,GitHub选择了海外流行的Vitess,一款YouTube内部使用并后来开源到社区的分库分表中间件,相当于分布式的数据库方案,为业务的持续快速发展提供了强有力的支持。单机的数据库肯定是不合格的,可靠性风险太高,到了2009年,随着业务发展,GitHub迈向MySQL的主备架构,并采用了基于数据块同步的。

云原生智能数据管理平台 2636

GitHub 跑了 1200 多台 MySQL 主机,如何实现无缝升级到 8.0 版本?

GitHub 团队近日分享了他们将 GitHub.com 的底层数据库无缝升级到 MySQL 8.0 的经验,我们来看看他们是如何完成了这一壮举。

Lorin 洛林的后端技术小站 1392

GitHub.com 用了 17 个月,如何将 1200 台 MySQL 主机无缝升级到 8.0 版本?

摘要:GitHub 使用 MySQL 存储大量关系型数据。近日,GitHub 工程团队在官方博客上发布了一篇长文,详细地分享了其如何将生产团队无缝升级到 MySQL 8.0 的故事,值得一读。原文地址:https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/作者 | Jiaqi Liu、Daniel Rogart、Xin W...

优快云资讯 1万+

GitHub 的 1200 多台 MySQL 主机是如何无缝升级到8.0的?

来源:OSC开源社区GitHub 团队近日分享了他们将 GitHub.com 的底层数据库无缝升级到 MySQL 8.0 的经验。据介绍,GitHub 使用 MySQL 来存储大量关系数据,因此在不影响网站服务级别目标 (SLO) 的情况下升级主机集群(1200 多台 MySQL 主机)绝非易事。其团队表示,为了升级到 MySQL 8.0,他们规划、测试和升级本身总共花费了一年多的时间,并且需要 ...

程序猿DD 225

Windows环境下部署MySQL主从并模拟升级到8.0

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 一、部署实例 1.下载2个软件 http://ftp.kaist.ac.kr/mysql/Downloads/MySQL-5.7/mysql-5.7.35-winx64.zip http://ftp.kaist.ac.kr/mysql/Downloads/MySQL-8.0/mysql-8.0.26-winx64.zip2.解压一下 3.初始化 记录下密码 C:\Users\Administrator>D:\t..

GreatSQL2021的博客 1002

1200 多台 MySQL 主机,是如何无缝升级到8.0的?

你好,我是坚持分享干货的 EarlGrey,翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。如果我的分享对你有帮助,请关注我,一起向上进击。创作不易,希望大家给一点鼓励,把公众号设置为“星标”,给文章点个“赞”和“在看”,谢谢大家啦~来源:OSC开源社区GitHub 团队近日分享了他们将 GitHub.com 的底层数据库无缝升级到 MySQL 8.0 的经验。据介...

codingpy的博客 131

全球最大代码托管平台升级到MySQL 8.0实战

在深入探讨升级过程之前,让我们先从直升飞机上俯瞰一下GitHub的MySQL基础设施:集群由1200多台主机组成,包括Azure虚拟机和数据中心的裸机。跨50多个数据库集群存储300多TB数据,每秒处理550万查询。每个集群都配置了主从复制作为高可用。数据被分区:通过水平分库分表和垂直拆分来扩展MySQL集群,不同的集群存储不同域的产品数据。大型域的数据库使用了水平拆分的Vitess集群。

PGCCC的博客 279
上一篇: 用 Bytebase 做数据库 schema 迁移
下一篇: Bytebase 2.12.0 - 改进自动补全和布局导航
Bytebase
博客等级 码龄5年 1349粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值