一次网站迁移故障及分析

一次网站迁移故障及分析,第1张

一次网站迁移故障及分析

公司运营项目迁移,这个项目最重要的是充值和允许玩家玩游戏,还有后台统计,是支付宝这样的第三方平台的支付工具。因为涉及到钱的问题,我们上个月就做好了迁移的准备,把代码和数据库调出来,提交给运营方测试。最后和运营商量凌晨0点充值的人最少,开始切域名。考虑到切换DNS后无法立即生效,我们做了301跳转。

1.暂停原始服务器数据库并导出相关数据库。

2.将导出的数据库同步到杭州xx服务器,导入数据库。

3.将域名切换到xx服务器

4.在原服务器上做301跳转到xx服务器(确保不要向原 *** 作服务器写入新数据)

5. *** 作有助于测试新的服务器数据是否正常。

按照上述过程,结果发生了许多意想不到的问题,因为这次迁移的LNMP环境不同,尤其是数据库。之前用的是Ver14.14发行版5.1.60,新服务器用的是Ver14.14发行版5.6.16。还有一个mysql主同步和次同步,它被过滤掉了,只同步了一些表。当时是凌晨迁移过来的。再次将最新数据导入新服务器mysql。由于版本问题,有一个mysql存储过程无法导入,也有一个默认值问题,如下图:默认值应该改为“NULL”而不是“none”。原来的mysql中还有一些预定任务无法导出,必须重新创建。

好了,上面的问题解决了,重新做了mysql主次同步和过滤。当时测试也正常。结果第二天早上八点半用户流量来了,网站打不开了。首先,我检查了php日志,出现了以下问题:

然后不断修改下面的参数,感觉调整到2048后已经到了临界值,因为这台机器只有8G内存。max_children=2048后发现内存基本满了,调整时内存可能会爆。当时调整php后发现短时间内可以正常访问,功能正常,但是10分钟左右又出现访问慢的问题。继续看php日志,还是上图的提示。我觉得这不是php的问题,因为这个网站原来的服务器并没有打开那么多php进程,但是运行正常,整个网站的导出流量并不大。

综上所述,发现php和mysql的连接被阻塞,导致php进程一直排队。当新的请求到来时,其他php进程只能启动新的php进程。php进程总是提示忙,不够用。需要调整max_children值,所以要看mysql有没有问题。

进入mysql,显示processlist,检查mysql的所有线程,发现付费库中有一个uc_members表,大量锁,

大量锁表,要求开发这个表是用户表,就是用户每次登录都要查询这个表。现在,我们终于找到原因了,就是php执行用户登录时,要读取mysql中的这个uc_members表。每个用户都要锁定表,然后查询用户登录信息,导致这个表一直被锁定。随着越来越多的用户请求,php进程的数量也在增加。我一直在等待mysql返回用户登录信息,但是mysql一直处于锁定状态,导致了这种现象。php进程卡住,用户无法登录,最后网站打不开。

使用MyISAM的引擎查看此表:


MyISAM引擎是表级锁,被InnoDB引擎替换为行级锁。再次显示processlist发现锁表大大减少,页面可以正常打开,用户可以登录。问题解决了。

InnoDB和Myisam的六个不同点:

参考:http://www.ha97.com/4197.html


总结:

有人建议开发部门不要在mysql中为以后的开发程序编写定时任务,因为很难看出执行是否成功,而且迁移mysql会很麻烦。你可以只写crontabforphp来执行定时任务,还有存储过程。如果一定要用mysql写存储过程,尽量标准化,防止以后迁移中出现很多mysql版本问题导致的奇怪现象。

这次失败主要是因为没有提前做压力测试,只做了网站的基本功能。在下一次网站迁移之前,必须进行压力测试、用户登录测试和回滚方案。完整的迁移过程应该是:


1.暂停原始服务器数据库并导出相关数据库。

2.将导出的数据库同步到杭州xx服务器,导入数据库。

3.对xx服务器进行压力测试和用户登录测试。

4.回滚方案,有问题及时回滚到原服务器,保证用户正常访问。

5.将域名切换到xx服务器

6.在原服务器上做301跳转到xx服务器(确保不要向原 *** 作服务器写入新数据)

7. *** 作有助于测试新的服务器数据是否正常。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/784288.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存