为什么你必须在2024年6月30日之前行动
说实话,当CentOS Linux 7在2024年6月30日彻底停止维护的时候,很多运维同学的第一反应是:”我的服务器还能跑啊,再等等吧。”这种想法很危险。就像你开着一辆20年前的车,厂家早就停止提供零件和技术支持了,你却还在指望它每天安全上路。阿里云官方已经明确发出警告,继续使用停服后的CentOS系统,意味着你将失去所有安全补丁、漏洞修复和技术支持。想象一下,如果哪天你的服务器被黑客攻入,里面的用户数据、业务信息全部泄露,这时候你去哪里找阿里云的技术支持?他们说”系统已停服,我们帮不了你”。这种场景真的不是危言耸听。
我见过太多案例,有些中小企业因为担心迁移复杂、业务中断,选择硬扛。结果在2024年下半年,某电商平台因为CentOS 7的安全漏洞被攻击,导致全站宕机48小时,直接经济损失超过200万。这笔钱如果用来购买专业的迁移服务,再加上几个月的云服务器费用,根本不算什么。AlmaLinux作为CentOS的直系继承者,由云原生计算基金会(CNCF)支持,Red Hat创始人之一发起,就是为了填补CentOS停服后留下的空白。它完全兼容RHEL/CentOS的二进制包,迁移成本几乎为零,这才是最理性的选择。
迁移前的准备:别急着动手,先做好这些关键步骤
第一步:全面盘点你的服务器资产
在开始任何迁移工作之前,你需要像医生给病人做全面体检一样,先把家里底子摸清。登录你的阿里云控制台,进入ECS实例管理页面,记录下所有运行CentOS的云服务器实例。不要只看数量,更要关注每个实例的具体用途——是Web服务器、数据库、还是定时任务?这一步看似简单,但很多运维人员会忽略,导致迁移过程中遗漏关键业务。
创建一份详细的资产清单表格,包含以下字段:
| 实例ID | 实例名称 | 公网IP | 内网IP | OS版本 | 业务用途 | 运行服务 | 依赖组件 | 备份状态 | 负责人 | 优先级 |
|--------|----------|--------|--------|--------|----------|----------|----------|----------|--------|--------|
| e-bp1xxx | web-prod-01 | 47.xx.xx.1 | 172.16.0.10 | CentOS 7.9 | 主站前端 | Nginx, PHP-FPM | MySQL, Redis | ✅ 已备份 | 张三 | 高 |
| e-bp2xxx | db-prod-01 | 47.xx.xx.2 | 172.16.0.20 | CentOS 7.9 | 核心数据库 | MySQL 5.7 | - | ✅ 已备份 | 李四 | 紧急 |
| e-bp3xxx | job-cron-01 | 47.xx.xx.3 | 172.16.0.30 | CentOS 8 | 定时任务 | Crond, Python | Celery | ⚠️ 未备份 | 王五 | 中 |
这份表格不仅是迁移的路线图,更是后续责任追溯的依据。每一行都代表一个需要保护的业务单元。优先级排序很重要——数据库和核心业务必须最先迁移,非核心的测试环境可以最后处理。
第二步:构建完整的备份策略
备份是迁移的安全网,没有备份的迁移就是裸奔。在阿里云环境中,你有多种备份手段可以选择。
快照备份是最基础也是最可靠的方案。 对于每个CentOS ECS实例,创建系统盘和数据盘的全量快照。在控制台中依次选择”实例”→”磁盘”→”创建快照”。这个过程可能需要几分钟到几小时,取决于磁盘大小。创建完成后,记录下快照ID,这些快照可以恢复到任意时间点,是你的最终保险。
但对于业务数据,快照还不够。 你需要对应用数据进行专项备份。以数据库为例,使用mysqldump导出全量数据:
# 导出MySQL数据库(建议通过阿里云RDS或自建MySQL)
mysqldump -u root -p --all-databases --single-transaction --routines --triggers > /backup/mysql_full_$(date +%Y%m%d_%H%M%S).sql
# 如果是PostgreSQL
pg_dumpall -U postgres > /backup/pg_full_$(date +%Y%m%d_%H%M%S).sql
# 如果是Redis,确保AOF持久化开启,然后拷贝dump.rdb文件
cp /var/lib/redis/dump.rdb /backup/redis_$(date +%Y%m%d_%H%M%S).rdb
对于文件服务,使用rsync或tar打包备份:
# 备份网站文件
tar -czvf /backup/web_files_$(date +%Y%m%d_%H%M%S).tar.gz \
--exclude='node_modules' \
--exclude='.git' \
/var/www/html
# 备份配置文件
tar -czvf /backup/configs_$(date +%Y%m%d_%H%M%S).tar.gz \
/etc/nginx \
/etc/php-fpm.d \
/etc/my.cnf.d \
/root/.ssh
备份验证环节经常被忽略。 备份完成后,必须验证备份文件的有效性。尝试在一个临时环境中恢复数据,确认可以正常启动服务。如果备份了100GB数据却无法恢复,那比没备份更糟糕。
第三步:选择目标AlmaLinux版本
AlmaLinux有多个版本分支,选择哪个版本取决于你的业务需求。目前主流选择是AlmaLinux 8和AlmaLinux 9。
AlmaLinux 8 基于RHEL 8,支持到2029年,与CentOS 7在包管理(YUM/DNF)和系统服务(systemd)上有良好的兼容性。如果你使用的是较老的应用栈,或者依赖CentOS 7特有的一些组件,AlmaLinux 8是更稳妥的选择。
AlmaLinux 9 基于RHEL 9,提供更长的支持周期(到2032年),内置更新的工具链(Python 3.9+、GCC 11+、Nginx 1.20+等),性能更好,安全性更强。如果你的应用已经适配了较新的技术栈,或者计划长期稳定运行,AlmaLinux 9是更面向未来的选择。
建议在阿里云控制台中创建新的ECS实例时,选择AlmaLinux 8.8或AlmaLinux 9.2镜像。这些是当前的稳定版本,已经过充分测试。不要选择过早的版本,也不要选择最新的rc(候选发布)版本。
第四步:分析应用依赖和兼容性
这是迁移中最容易被低估的环节。每个CentOS系统都是一个复杂的生态,运行着各种服务和依赖。你需要像侦探一样,把所有线索都找出来。
使用以下命令全面分析系统状态:
# 查看已安装的RPM包列表
rpm -qa --qf '%{NAME}\n' | sort > /tmp/centos_packages.txt
# 查看正在运行的服务
systemctl list-units --type=service --state=running > /tmp/running_services.txt
# 查看监听端口(了解对外暴露的服务)
ss -tlnp > /tmp/listening_ports.txt
# 查看定时任务
crontab -l > /tmp/crontab_root.txt
ls -la /etc/cron.d/ >> /tmp/cron_d_contents.txt
# 查看自定义环境变量和启动脚本
cat /etc/profile.d/*.sh > /tmp/profile_d.txt
cat /root/.bashrc >> /tmp/bashrc.txt
cat /root/.bash_profile >> /tmp/bash_profile.txt
# 查看挂载的数据盘和文件系统
df -h > /tmp/disk_usage.txt
mount > /tmp/mounts.txt
cat /etc/fstab > /tmp/fstab.txt
# 查看SELinux状态和配置
getenforce > /tmp/selinux_status.txt
sestatus >> /tmp/selinux_status.txt
把这些输出文件都保存到本地,作为迁移后的对比基准。迁移完成后,你需要用同样的命令在新系统上执行,确保所有组件都正确迁移。
特别关注以下几个容易出问题的地方:
Python环境:CentOS 7默认Python 2.7,很多老旧脚本依赖它。AlmaLinux 8/9默认Python 3.9+,如果你的应用硬编码了#!/usr/bin/python,迁移后会直接报错。解决方法是在新系统上安装python2和python2-devel,或者修改脚本中的Python路径。
# 在AlmaLinux 8/9上安装Python 2兼容性
sudo dnf install python2 python2-devel -y
# 或者更推荐的方式:修改脚本
sed -i 's|#!/usr/bin/python|#!/usr/bin/python3|' /path/to/your/script.py
PHP版本:CentOS 7默认PHP 5.4,极其老旧且有安全漏洞。AlmaLinux 8/9默认PHP 8.0+。如果你的代码大量使用已废弃的函数(如mysql_*系列),需要先重构代码再迁移。建议在新系统上先部署测试环境,运行完整的测试套件,确保所有功能正常。
依赖的第三方仓库:检查/etc/yum.repos.d/目录下是否有CentOS专属的仓库配置文件。AlmaLinux有自己的仓库,部分CentOS仓库可能不兼容或已失效。
# 查看当前配置的所有YUM仓库
ls -la /etc/yum.repos.d/
cat /etc/yum.repos.d/*.repo
# 查看已启用的仓库
dnf repolist enabled
对于常用的EPEL、Remi、NGINX官方等第三方仓库,AlmaLinux都有对应的配置方式,提前查阅官方文档准备。
两种主流迁移方案:选择最适合你的路径
方案一:原地升级(In-Place Upgrade)——适合测试环境和小规模业务
原地升级是指直接在现有CentOS系统上执行系统升级,将CentOS 7/8升级至AlmaLinux。这种方式的好处是业务停机时间最短,只需要重启几次即可完成。但缺点是风险相对较高,一旦升级失败,恢复起来比较麻烦。
原地升级的核心步骤:
# 1. 确保系统完全更新到CentOS最新版本
sudo yum update -y
sudo reboot
# 2. 安装AlmaLinux release package
# 注意:使用对应版本的release包,CentOS 7升AlmaLinux 8,CentOS 8升AlmaLinux 9
sudo dnf install https://repo.almalinux.org/almalinux-release-latest-8.noarch.rpm -y
# 3. 安装lemmy工具(用于系统转换)
sudo dnf install lemmix -y
# 4. 执行转换(这步会花费较长时间,建议在低峰期执行)
sudo lemmix convert
# 5. 转换完成后重启系统
sudo reboot
原地升级的注意事项:
- 升级过程中不要中断,特别是
lemmix convert步骤,可能会持续数小时,取决于包数量和系统负载 - 升级前确保有完整的快照备份,一旦失败可以通过快照回滚
- 检查第三方仓库兼容性,某些私有仓库可能不包含AlmaLinux版本
- 升级后验证所有服务的状态,特别关注自定义服务是否启动正常
- 部分旧版内核模块可能需要重新编译(如VirtualBox Guest Additions、某些网卡驱动等)
方案二:全新部署 + 数据迁移 —— 推荐的生产环境方案
这是更稳妥的方式。你创建一台全新的AlmaLinux ECS实例,然后在原CentOS实例和新AlmaLinux实例之间迁移数据和配置。虽然需要更多的停机时间,但风险可控,回滚简单(只需切换DNS或负载均衡指向新实例即可)。
具体操作流程:
1. 创建目标AlmaLinux ECS实例
在阿里云控制台创建新实例时,选择AlmaLinux镜像。推荐配置:
- 镜像:AlmaLinux 8.8 x64 或 AlmaLinux 9.2 x64
- 实例规格:与原CentOS实例相同或更高配置
- 系统盘:至少50GB,建议选择ESSD云盘以获得更好性能
- 数据盘:根据原实例数据盘大小配置
- 安全组:开放必要的端口(SSH 22、HTTP 80、HTTPS 443、数据库端口等)
创建完成后,记录新实例的内网IP地址,例如172.16.0.100。
2. 基础系统配置
登录新实例,执行以下基础配置:
# 更新系统到最新状态
sudo dnf update -y
# 安装常用工具
sudo dnf install -y vim net-tools curl wget git htop tmux rsync
# 配置主机名
sudo hostnamectl set-hostname <your-new-hostname>
# 配置时区(如果需要)
sudo timedatectl set-timezone Asia/Shanghai
# 禁用Selinux(生产环境建议保持Enforcing,但初期可以设为Permissive便于调试)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 配置防火墙规则
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
3. 迁移系统配置
将之前备份的配置文件同步到新系统:
# 从原CentOS服务器复制配置文件
# 注意:使用rsync可以保留权限和属性
rsync -avz --progress \
root@<old-centos-ip>:/etc/nginx/ \
/tmp/nginx-config/
rsync -avz --progress \
root@<old-centos-ip>:/etc/php-fpm.d/ \
/tmp/php-fpm-config/
rsync -avz --progress \
root@<old-centos-ip>:/etc/my.cnf.d/ \
/tmp/mysql-config/
# 在新系统上应用配置
# 先安装对应服务
sudo dnf install -y nginx php-fpm php-mysqlnd mysql-server
# 替换配置文件(注意备份原有配置)
sudo cp /tmp/nginx-config/* /etc/nginx/
sudo cp /tmp/php-fpm.d/* /etc/php-fpm.d/
sudo cp /tmp/mysql-config/* /etc/my.cnf.d/
# 检查配置语法
sudo nginx -t
sudo php-fpm -t
重要提示:配置文件中的路径可能需要调整。例如,CentOS 7的PHP配置文件在/etc/php.ini,而AlmaLinux 8的PHP配置文件可能因版本不同而位置有差异。建议使用diff工具对比新旧配置:
diff /etc/php.ini /tmp/php-config/php.ini
对于nginx配置,注意include路径可能不同,需要检查配置文件中是否有硬编码的路径。
4. 迁移应用数据
使用rsync增量同步数据,这是最关键也是最耗时的步骤:
# 第一次全量同步(建议在业务低峰期执行)
rsync -avz --progress \
--exclude='node_modules' \
--exclude='.git' \
--exclude='__pycache__' \
root@<old-centos-ip>:/var/www/html/ \
/var/www/html/
# 数据库迁移
# MySQL示例:在原系统导出,在新系统导入
mysqldump -u root -p --all-databases | ssh root@<new-alma-ip> 'mysql -u root -p'
# PostgreSQL示例
pg_dumpall -U postgres | ssh root@<new-alma-ip> 'psql -U postgres'
在业务停服前的最终同步阶段,执行最后一次增量同步,确保数据一致性:
# 业务停服后的最终同步
rsync -avz --delete \
--exclude='node_modules' \
--exclude='.git' \
root@<old-centos-ip>:/var/www/html/ \
/var/www/html/
# 数据库最终同步(使用binlog或时间戳确保一致性)
mysqldump -u root -p --single-transaction --flush-logs \
--all-databases > /tmp/final_db_dump.sql
scp /tmp/final_db_dump.sql root@<new-alma-ip>:/tmp/
mysql -u root -p < /tmp/final_db_dump.sql
--delete参数确保新系统上的文件与原系统完全一致,删除在新系统上新增但原系统已删除的文件。--flush-logs确保MySQL导出时使用最新的binlog位置,方便后续增量同步。
5. 迁移定时任务和自定义脚本
# 复制cron配置
rsync -avz root@<old-centos-ip>:/etc/cron.d/ /etc/cron.d/
rsync -avz root@<old-centos-ip>:/var/spool/cron/ /var/spool/cron/
# 复制自定义服务脚本
rsync -avz root@<old-centos-ip>:/etc/systemd/system/ /etc/systemd/system/
# 重新加载systemd配置
sudo systemctl daemon-reload
sudo systemctl enable <your-custom-service>
6. 测试验证
在新系统上启动所有服务,进行全面的测试:
# 启动并验证服务
sudo systemctl start nginx
sudo systemctl status nginx
sudo systemctl start php-fpm
sudo systemctl status php-fpm
sudo systemctl start mysqld
sudo systemctl status mysqld
# 测试网站访问
curl -I http://localhost
# 测试数据库连接
mysql -u root -p -e "SHOW DATABASES;"
使用浏览器或自动化测试工具访问应用,验证所有功能是否正常。特别关注:
- 用户登录是否正常
- 文件上传下载是否成功
- 定时任务是否按预期执行
- 日志是否正常写入
- 性能是否满足要求
7. 切换流量
测试通过后,进行DNS或负载均衡切换。如果使用阿里云负载均衡SLB,可以将后端服务器组中的老ECS实例下线,加入新ECS实例:
”`bash
检查负载均衡配置
aliyun slb Describe
