早期的表锁和现在的行锁。SQL 数据在并发的情况下,为了维持数据一致性,往往会进行锁。早期的 MySQL 采用的 MyISAM 类型的表,为了提高性能,使用了“表锁”,但是在互联网应用下,很快就发现,这种“提高性能”的设计实际上是不符合实际的。因为互联网业务并发量非常大,导致了频繁的锁表,加上关系型数据表没有分布能力,导致请求进一步集中,更加恶化了这种情况。所以后期 MySQL 改为使用 InnoDB 表格式,付出更多的性能代价换取“行”锁,有效缓解了这一问题。但是“行”锁依然在大并发的情况下,有可能付出较高的延迟性代价,特别是碰到上面所说的错误 #1 和错误 #2,扩大了故障的损害蔓延。
主从同步失效导致的业务故障。作为典型的“读写分离”场景,使用主从同步是 MySQL 最常见的使用方法。但是主从同步本身,在网络出现偶发故障,以及其他一些故障(如磁盘满)的时候,缺乏自我恢复的能力。如果业务依赖于主从同步,很容易出现不可发现的数据错误。如果这些数据错误在业务逻辑上是无法纠正的,那么就导致了最严重的事故——数据损坏。而且主从同步从另外一个角度来看,也是破坏了关系型数据库关于强一致性的承诺,这就衍生出大量需要“经验”才能解决的业务逻辑设计问题。
虽然 MySQL 在互联网行业中历史久远,应用广泛,有大量的各种应用,包括网络游戏也在使用,但是关系型数据库并不是诞生于互联网的软件模型。在互联网的大量应用场景下,关系型数据库作为一个功能齐全的工具,都能很快的满足功能需求。不过,在互联网业务运营到一定程度之后,往往又变成一个技术上的瓶颈。
问题的总结
原因分析
解决方案
以 Redis/MongoDB 这类数据库的出现,能比较好的解决上述的问题。
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。