推荐大家安装和使用的基础系统是Ubuntu,它提供了一种滚动更新的方式,即sudo do-release-upgrade, 如果这种脚本能按预期的方式工作,理论上它可以平滑地从最古老的Ubuntu无缝升级到最新的版本。但是要注意的是,Ubuntu并不能保证更新后的系统中安装的所有应用程序都能正常工作,甚至会自动卸载部分已经被从仓库中剔除的软件包。所以,我个人觉得这种方式不适合生产服务器的更新和升级。
为什么要迁移?
从应用系统的角度看也好,从业务需求的角度也好,我们并不关心它基础的系统到底是Linux还是Windows,我们只希望它能稳定的提供运行应用程序的基础环境,所以运维的朋友有句话叫做“能跑就别动”。我们现在要去更新它,一定要有充足的理由:
操作系统为Ubuntu22.04,之后用官网的一键安装脚本进行安装,测试,为迁移系统构造一个基础环境。
然后我们来考虑迁移老的数据。如果你原来的系统是Ubuntu18.04之后的,没有进行二次开发,那么使用install目录中的bak.sh备份的数据,用scp复制到新服务器上,用restore.sh脚本还原,大概率就可以迁移所有的数据。
对于有二次开发的朋友,那么就要分别进行下面几个数据的迁移:
数据库(mysqldump jol > jol.sql )
测试数据(tar czf data.tar.gz /home/judge/data)
Web二开代码+题面图片(tar czf web.tar.gz /home/judge/src/web)
判题源码(若改过,tar czf core.tar.gz /home/judge/src/core)
之后将他们scp到新服务器上,还原数据库(mysql jol< jol.sql ),准备进行代码合并。 代码的合并,主要遵循一个原则,就是如果这个文件自己没有改过,那么用最新版本,如果这个文件自己改过,那么尽量提取出修改的内容,在最新版文件上复现当初的修改。如果实在做不到,那么考虑暂时放弃当初的二开,以最新版本为准。这样,能够最大概率保证新系统的可用。 如果进行了二开,那么老的代码在新环境中很可能出现一些内部服务器错误500。这些报错默认的位置在/var/log/nginx/error.log中。可以根据报错信息,搜索相关解决方案。从我个人维护的服务器相关经验看,主要集中在php从5.x和7.x更新到8.x的过程中,部分语法被遗弃,部分语法有修改的情况。数量不会特别多,代码改动量在10-20行左右。难点是定位到需要修改的位置,和具体的修改方案。前者主要看日志中的行号,后者主要看搜索引擎的提示。当然,有条件也可以请教一下chatGPT。 如果有其他的业务系统在共用服务器,那么根据其需求构建环境安装,然后迁移数据,逻辑是相似的。比如java开发的系统,那么就安装openjdk+tomcat,如果是nodejs开发的系统,那么就安装nodejs环境。对于大多数Web系统,我们只需做好nginx的虚拟主机配置,管理好不同域名、端口的请求去往正确的应用就可以了。 这里有一种可能是,系统里存在一个php5.x编写的业务系统,非常复杂,且无法迁移到php8.x。这时,可以考虑利用docker在本地安装一个ubuntu14.04的镜像。然后在其中运行php5.x,把本地目录用volume的形式提供给容器里的php访问,而数据库和nginx都使用外面的最新版。这个方案我是测试可行的,如有需要的老师可以留言,我们另外开一篇详细讲解。 数据迁移过程中,要尽量留下完整的操作记录,最好由两个人结对完成操作,每一步都由第一人操作,第二人记录。迁移完成后,要立刻对迁移后的系统进行详细的测试和使用,确保所有重要的业务点都可以正常使用。 如果一切顺利,那么只需再一次将数据库从老系统备份和迁移,那么就可以关闭老的服务器,开始使用新系统服务器。关机后如果1个月之后没有发现缺失功能和数据,老服务器就可以考虑进入退役流程了。 如果老的服务器还有很长的使用年限,只是软件陈旧,则可以着手重装操作系统到最新版本,然后重复之前的操作,把数据再迁移回来。如果是物理服务器,还能顺带更换新硬盘、增加内存。这样就完成了远古系统的跨世代升级,临时购买的帕鲁服务器也就真的可以拿去玩帕鲁了。