从 DigitalOcean 迁移到 Hetzner:月成本降超八成,零停机且性能提升!

张开发
2026/4/19 9:58:41 15 分钟阅读

分享文章

从 DigitalOcean 迁移到 Hetzner:月成本降超八成,零停机且性能提升!
突发从 DigitalOcean 到 Hetzner 迁移成本大降且零停机2026 年 3 月 17 日进行了一次从 DigitalOcean 到 Hetzner 专用服务器的实际生产迁移处理了 30 个数据库共 248 GB 的 MySQL 数据、34 个 Nginx 站点、GitLab EE、Neo4j 以及实时移动应用流量且实现了零停机。迁移原因在过去几年里在土耳其运营软件公司成本升高通货膨胀飙升土耳其里拉兑美元大幅贬值以美元计价的基础设施成本成沉重负担。每月向 DigitalOcean 支付 1432 美元租用一台配置为 192GB 内存、32 个 vCPU、600GB SSD、两个 1TB 块存储卷并开启备份功能的 droplet性价比不再合理。后来发现了 Hetzner AX162 - R其 CPU 为 AMD EPYC 9454P48 核 / 96 线程RAM 为 256 GB DDR5磁盘为 1.92 TB NVMe Gen4 RAID1月成本仅 233 美元每月节省 1199 美元每年节省 14388 美元且新服务器性能更强大所以决定迁移。迁移前的运行环境此项目涉及的技术栈包括 30 个 MySQL 数据库248 GB 数据、跨多个域名的 34 个 Nginx 虚拟主机、GitLab EE42 GB 备份、Neo4J 图数据库30 GB 图数据、Supervisor管理数十个后台任务、Gearman 任务队列、多个为数十万用户提供服务的实时移动应用。旧服务器运行 CentOS 7已过生命周期新服务器采用 AlmaLinux 9.7是与 RHEL 9 兼容的发行版也是 CentOS 的自然继任者此次迁移也是摆脱旧操作系统的机会。零停机迁移策略采用分六个阶段的迁移方案阶段 1在新服务器上安装完整技术栈安装 Nginx从源代码编译使用与旧服务器相同的编译标志、PHP通过 Remi 仓库安装使用旧服务器相同的 .ini 配置文件、MySQL 8.0、Neo4J 图数据库、GitLab EE、Node.js、Supervisor 和 Gearman配置与旧服务器一致。通过 rsync 复制 SSL 证书迁移完成后强制更新。阶段 2使用 rsync 克隆 Web 文件通过 SSH 并加上 --checksum 标志将 /var/www/html 目录克隆到新服务器切换前进行最后一次增量同步。阶段 3设置 MySQL 主从复制旧服务器为主服务器新服务器为只读从服务器使用 mydumper 进行初始批量加载从转储元数据中记录的精确二进制日志位置开始复制。阶段 4降低 DNS TTL编写脚本调用 DigitalOcean DNS API将所有 A 和 AAAA 记录的 TTL 从 3600 秒降低到 300 秒不触碰 MX 或 TXT 记录等待一小时让旧 TTL 过期。阶段 5将旧服务器的 Nginx 转换为反向代理编写 Python 脚本解析 34 个 Nginx 站点配置文件备份原始配置替换为指向新服务器的代理配置。阶段 6切换 DNS 并停用旧服务器使用 Python 脚本调用 DigitalOcean API将所有 A 记录切换到新服务器的 IP旧服务器作为冷备份保留一周后关闭。整个过程服务始终可用。MySQL 迁移这是最复杂的部分数据转储使用 mydumper 而非 mysqldump借助新服务器 48 个 CPU 核心并行导出和导入数小时可完成原本需数天的工作。将转储文件传输到新服务器使用 rsync 通过 SSH 传输mydumper 的 --compress 标志使传输更快。加载数据使用 myloader 加载数据。MySQL 5.7 到 8.0 的问题因使用 CentOS 7 只能用 MySQL 5.7迁移前验证数据与 MySQL 8.0 兼容后安装 MySQL 8.0 社区版性能显著提升但导入后 mysql.user 表列结构不正确通过一系列操作解决问题。设置 MySQL 复制将新服务器配置为旧服务器的副本复制因错误 1062 停止通过设置 SET GLOBAL slave_exec_mode IDEMPOTENT 解决关键数据库无错误同步。切换前的测试临时编辑本地机器的 /etc/hosts 文件将域名指向新服务器的 IP测试 API 端点、管理面板等确认无误后进行切换。隐藏的 SUPER 权限问题主从复制同步后发现新服务器上 INSERT 语句虽设置 read_only 1 仍能执行原因是 PHP 应用用户被授予 SUPER 权限撤销权限后 read_only 1 正常阻止写入操作。DNS 准备所有域名通过 DigitalOcean DNS 管理编写脚本调用 DigitalOcean API 降低 TTL只处理 A 和 AAAA 记录不触碰 MX 或 TXT 记录等待一小时让旧 TTL 过期后可切换。将旧服务器的 Nginx 转换为反向代理编写 Python 脚本解析配置文件将其替换为代理配置关键是 proxy_ssl_verify off因新服务器 SSL 证书针对域名禁用验证可行。切换操作当复制的 Seconds_Behind_Master 为 0 且反向代理准备好后按顺序执行切换DNS 切换脚本在约 10 秒内将所有 A 记录更改为新服务器的 IP。切换后的最后处理迁移后发现许多 GitLab 项目的 Webhook 仍指向旧服务器的 IP编写脚本通过 GitLab API 扫描并批量更新 Webhook。最终成果月成本从 1432 美元降至 233 美元每年节省 14388 美元新服务器性能更强大CPU 从 32 个 vCPU 提升到 96 个逻辑 CPU内存从 192 GB 增加到 256 GB DDR5存储从约 2.6 TB 混合存储变为 2 TB NVMe RAID1停机时间为 0 分钟迁移过程约 24 小时未影响用户。关键经验总结MySQL 复制是零停机迁移的最佳选择迁移前检查 MySQL 用户权限脚本自动化一切对于大型数据集mydumper myloader 远胜 mysqldump对于稳定工作负载云服务提供商成本较高。本次迁移中使用的所有 Python 脚本已开源。

更多文章