引言
本篇数据库专栏内容,主要会讲解不同高并发场景下的MySQL架构设计方案,也包括对于各类大流量/大数据该如何优雅的处理,也包括架构调整后带来的后患又该如何解决?其中内容会涵盖库内分表、主从复制、读写分离、双主热备、垂直分库、水平集群、分库分表实践、分布式事务、分布式ID、数据一致性探讨......等内容。
话归正题,分库分表这个概念基本上碰过数据库的小伙伴都有听说过,但很多小伙伴对这块具体该如何落地并不清楚,因此接下来这篇会先阐述MySQL分库分表的方法论,以及详细讲解分库分表后产生的后患问题,但在此之前先送上一句话,请牢记:
不要为了分库分表而分库分表!!引入SOA架构中的一句话:架构不是一蹶而起的,而是慢慢演进的。只有真正需要分库分表来解决问题时,才去真正的做拆分,否则会导致很多不必要的麻烦产生,这点在《阿里Java开发规范手册》中有明确的写出:
一、为什么需要分库分表?
在讲为什么需要分库分表之前,咱们先来讲一个故事:在很久很久之前有一位名唤风的美男子,最初由于年幼并未娶妻生子,因此出行时都只需要一匹马来拉车,但随着年龄渐长,慢慢的开始娶妻纳妾,每次出行时的人数也会直线增长,而之前负责拉车的那匹老马却苦不堪言,因为随着日子一天一天的过,自身的压力也随之增加,终于有一天,老马扛不住了,累到在了大街上。
随即风也慢慢发现了这个问题,由于每次出行的人口越来越多,因此老马的能力无法满足出行需求,这时风为了解决出行问题,所以花费重金托人从西域购入了一匹身强体壮的汗血宝马,以此来寻求解决所遇到的困扰。
当商人将名贵的汗血宝马交给风时,这匹马的确比之前的老马能力强太多太多了,拖动一辆承载几人的马车完全不在话下,同时风有了之前的前车之鉴,因此对其也格外看重,每天都吩咐人给宝马喂好料、做保养......,但好景不长,随着时间推移,男人三妻四妾放在当时也并非罕事,所以这时这匹来自西域的汗血宝马也对此无能为力,慢慢的出现乏力的情况。
此时风也再次察觉到了这个情况,于是再次找到当初帮忙购置汗血宝马的商人,想要再花重金买入一匹能力更强、体力更盛的千里马!但商人却道:“目前你手中的汗血宝马已属世间极品,想要找到比它更强且能代替它的少之又少,贵客您这需求恐怕老夫是难以完成咯”!
这时问题似乎陷入僵局,但随之大行商便道:“虽然我无法替您寻找到更为优良的马匹,但我有一个万全之策能解你燃眉之急”!那这个完全之策到底是什么呢?此时商人口中缓缓道出:“当一匹马无法解决你的出行问题时,与其寻找更好的马匹,为何不选择用更多的马匹来拉车呢”?
此时风一拍大腿,立马称赞道:所言极是,言之有理,于是大手一挥立马又购置了六匹良马,与之前的两匹旧马,组成了八匹马拉车的马队,自从之后,风再也没有遇到过出行问题。
在上面这个故事中,大家应该能够感受出来,当单匹马无法拉动马车时,不要试图找到一匹更好的马来代替,而是应该选择使用多匹马来拉车!这个故事的内在意义放在编程中同样如此,对一个节点做性能优化、升级硬件配置就是再试图寻找一匹更强壮的马,但一匹马的力量再强也是有限的,所以这时选择使用更多的马匹(服务器/节点)来解决问题才是王道!
编程里面有句话叫做:加一台服务器的收益胜过千万次调优,毕竟机器数量才是真理!
那么接着咱们也回到问题本身,来一起聊一聊MySQL为什么需要分库分表?
1.1、请求数太高
在高并发情况下,大量读写请求落入数据库处理,最终会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service层来看就是,可用数据库连接锐减甚至无连接可用,接下来面临的就是并发量急剧增加、吞吐量严重下降、连接出现异常、数据库时常宕机、系统经常崩溃一系列后患问题。
1.2、数据查询慢
-
一、单表或单库数据量过大,导致数据检索的效率直线降低。
-
二、单库整体并发连接数接近系统阈值,从而导致此请求获取不到连接数,一直处于等待获取连接的状态。
-
三、已经获取但由于并发过高导致CPU被打满,就算SQL所查询的表数据行很少,也同样因为没有CPU资源无法执行,所以一直处于阻塞状态,最终出现查询过慢的现象。
1.3、数据量太大
-
①当一个库的数据存储量太大时,就算每张表的并发数不多,但是因为是海量数据,单库中存在大量的数据表,每张表都有一部分并发请求,导致最终单库的连接数阈值成为数据库的瓶颈。
-
②当一张表数据太多时,导致单表查询速度严重下降,虽然InnoDB存储引擎的表允许的最大行数为10亿,但是如果一张表的数据行记录达到上亿级别,那就算通过索引去查询一条数据,它也需要至少经过上十次到几十次磁盘IO,从而导致单表查询速度直线下降;一般一张表的数据行数在800~1200W左右最合适。
1.4、单体架构的通病
单库中某张表遇到问题需要修复时,会影响了整个库中所有数据,因为有些严重的情况下需要停机优化后重新上线,这时其它一些没有出现问题的表,也会因此受到影响。
这就好比团队中一个人没完成好工作,所以导致整个团队一起陪同加班,这无疑很令人糟心。
1.5、MySQL数据库瓶颈
上面聊到的各类问题,本质上都是一些数据库瓶颈,一般程序的性能瓶颈都源自于硬件问题,而问题归根到底都属于IO、CPU瓶颈,接下来聊一聊IO、CPU瓶颈可以细分成哪些呢?
2.1、IO瓶颈
IO瓶颈主要分为两方面,一方面是磁盘IO瓶颈,