当前位置: 首页 > 科技观察

【博文推荐】一次网站迁移失败及分析_0

时间:2023-03-15 01:09:00 科技观察

此博文来自博主lxshopping。有问题欢迎进入博主专页进行互动讨论!博文地址:http://lxshopping.blog.51cto.com/4542643/1574929公司运营项目迁移。这个项目最重要的是充值让玩家玩游戏,还有后台统计。是像支付宝这样的第三方平台,因为牵扯到钱,上个月就开始准备迁移了。代码和数据库已经移交并提交给运营方测试。***和凌晨0:00充值的操作商量起码,开始砍域名。考虑到DNS的切换不会立即生效,所以进行了301跳转。整个迁移过程是:1.暂停原服务器数据库,导出相关数据库2.将导出的数据库同步到杭州xx服务器并导入数据库3.将域名切换到xx服务器4.做301跳转到原服务器上的xx服务器(确保没有新的数据写入原运行服务器)5.运行辅助按照上面测试新服务器数据是否正常结果出现了很多意想不到的问题,因为LNMP这种迁移的环境是不同的,尤其是数据库。上一台使用的是Ver14.14Distrib5.1.60,新服务器使用的是Ver14.14Distrib5.6.16。有mysql的主从同步,经过过滤,只同步部分表。当时凌晨迁移,把***数据重新导入新服务器mysql。由于版本问题,发现有一个mysql存储过程无法导入。默认值有问题,如下图:默认值应该改为“NULL”,而不是“none”。原来mysql中还有一些定时任务无法导出,只能重新创建。好了,上面的问题解决了,重新做了mysql主从同步和过滤。当时检查正常。结果第二天早上8点30分来了用户流量,网站打不开。首先查看php日志,出现如下问题:然后一直修改以下参数,感觉调整到2048后,已经是临界值了,因为本机只有8G内存,而且max_children=2048后,我发现内存基本都满了,增加这个值可能会爆内存。是的,当时调整php后,发现有一小段时间可以正常访问,功能正常,但是过了大概10分钟,又出现了访问慢的问题。继续看php日志,还是上图的提示。我感觉这不是php的问题,因为本站原服务器并没有开那么多php进程,但是运行正常,整个站的出口流量不大。根据以上分析,发现应该是php连接mysql被阻塞,导致php进程一直在排队。当有新的请求过来时,因为其他php进程在排队,只能启动一个新的php进程,而php进程会一直提示Busy,notenough,需要调整max_children的值,所以看是不是有问题MySQL?进入mysql,showprocesslist查看mysql的所有线程,发现pay库中有一张uc_members表存在大量锁,大量锁表,问开发说这张表是用户表,就是用户每次登录都要查询这张表,现在终于找到原因了,就是php在执行用户登录的时候,需要读取mysql中的uc_members表。每次用户登陆都要锁表,然后查询用户登陆信息,导致这张表一直处于锁状态,随着用户请求越来越多,php进程也随之增加,等待mysql返回用户登录信息,但是mysql一直处于锁表状态,导致出现这种现象,php进程卡死,用户无法登录,网站**也打不开。MyISAM引擎就是用来查看这张表的:MyISAM引擎是表级锁,InnoDB引擎换成了行级锁。再次showprocesslist,锁表大大减少,页面可以正常打开,用户也可以登录,问题解决。InnoDB和Myisam的六大区别:参考:http://www.ha97.com/4197.html总结:已经建议开发部门以后的开发程序中不要在mysql中写定时任务,因为定时任务是用mysql写的并且执行成功了看是不是很难看,迁移mysql的时候会很麻烦。可以写crontab让php执行定时任务,也有存储过程。如果一定要在mysql中写存储过程,尽量规范化,防止以后迁移时由于mysql版本问题导致出现很多奇怪的现象。这次失败的主要原因是事先没有做压力测试,只是对网站进行了基本的功能测试。下次迁移网站前,一定要做好压力测试、用户登录测试和回滚计划。一个完整的迁移过程应该是:1.暂停原服务器数据库,导出相关数据库2.将导出的数据库同步到杭州xx服务器,再导入数据库3.在xx服务器上进行压力测试和用户登录测试4.回滚计划,回滚到原服务器,保证用户正常访问5.切换域名指向xx服务器6.在原服务器做301跳转到xx服务器(保证没有新数据写入原运营服务器)7.运营协助测试新服务器数据是否正常