RDS踩坑笔记

故事是这样的,我的客户宝宝之前在东家采购了一套B2C商城,是基于LNMP架构的。NGINX、PHP、MYSQL和REDIS都部署在一台8core16g的ECS上。随着用户越来越多,单机已经不能满足他了。对于他也对于我都是极幸运的,毕竟不是每个商城都能活下去。 所以我就准备帮他扩容了。扩容方案也很简单,将MYSQL和REDIS拆出去,换成云产品,然后再加一台ECS。

迁移成功之后,客户为了安心,就准备压测。压测的过程中,库存倒也正常,只是有一些订单异常了,100个订单其中有少数几个订单所属的商品数量为0,以致于商品金额也为0,订单金额也为0。那这就有问题了,而且是大问题。

由于之前也压测过,虽然结果不太漂亮,但是好歹流程是正常的。我首先想到的是两台ECS的原因,因为我也不是专业的运维,部署姿势也不专业。所以立即停掉了一台ECS,继续压测,问题仍然存在。无奈之下,我看看一下代码,由于年代久远,代码质量惨不忍睹,但是代码里面有事务、有锁,貌似问题不大。于是我就大胆猜想,是不是因为并发导致的数据错乱了。对比之下,我突然意识到,他们商城是许多年前采购的,也有一些年头了,那个年头一般都是用mysql55或56的,而RDS一般都是MYSQL57或80,猜想应该是版本的问题,版本之间具体有什么区别也不是很清楚。然后就猜想是配置,跟事务相关的配置一般常见的就是隔离级别。

果然,他们之前用的是MYSQL56,事务的隔离级别是MYSQL的默认隔离级别REPEATABLE-READ,而RDS是MYSQL57,事务的隔离级别默认是READ-COMMITTED,区别就在这里,然后马上调整RDS的隔离级别和MYSQL一样,改为REPEATABLE-READ。然后压测,问题解决了。为了确认是这个问题,我反复调整压测了几次,确认是隔离级别造成的。他的代码太乱了,就没有找具体是哪里的代码。四种隔离级别如下:
d

最后,某里的RDS号称是100%兼容MYSQL,但是默认隔离级别却不一样,这恐怕会让不少人踩坑。想来,某里这样做也仅仅是为了提升那么一点性能吧!!!

还有一件很巧的事情,就是我在调整参数的过程中,RDS报错了,提示实例状态不对。仔细一看,RDS实例的运行状态一直是切换主备中连重启都不能重启。客服回复是“后端检测到RDS实例所在物理机硬件有风险而发起的HA任务,RDS实例控制台将可维护时间范围是00:00-02:00,所以上午HA切换任务目前是暂停的状态(切换主备中),如果希望RDS实例继续进行HA切换任务,请在RDS实例控制台将可维护时间范围调整为当前的时间段 11:00–12:00”,调整了可维护时间范围,问题就解决了,运行状态也变成了运行中了,就可以正常调整参数了。

–end–

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值