分库分表
分库分表场景之IO瓶颈
- 由于磁盘读IO非常慢,而且热点数据多,缓存内存放不下这么多数据,那么就会导致产生对同一个文件产生多次IO读取。解决方案 => 分库和垂直分表
- 网络IO瓶颈,请求的数据太多,网络带宽不够 => 分库
分库分表场景之CPU瓶颈
- 单表数据量太大,导致查询行数过多,SQL效率低下 => 水平分表
水平分表与分库(拆分行数)
以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中(将一个表中的数据拆分到多个库中)。
比如user_id / 20(分表数) %12(总库数求余) = 1则放第一个库,且user_id % 20(分表数)=3 表示数据应该放在第一个库且第4(3 + 1)个表;这是数据比较均衡的处理办法
垂直(拆分字段)
以表为依据,按照业务归属不同,将不同的表拆分到不同的库中
分区
mysql自带的,把数据文件分为多个文件以减少对同一个文件磁盘IO阻塞,减少一个文件的大小
分库分表的问题产生
- join问题:代码层面进行优化
- 查询字段非分表字段(例如按照user_id分表,但查询字段是order_id):使用中间表,中间表加入索引,并加缓存,一定要注意击穿问题
- 分布式事务问题:使用外部XA事务进行处理,MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:网易的DDB,淘宝的TDDL等等。
读写分离
表建立主从复制(mysql自带工具即可),实现主写,从读的模式。
主服务器会开启多个线程用于同步binlog,子服务器会开启一个IO线程和一个sql线程,IO线程会主动找到主服务器的服务线程进行请求返回最新的binlog日志信息,然后子服务器再进行更新数据库信息放入relay log(中继日志),子服务器的sql线程会定时读取中继日志数据更新数据。
Mysql的高可用高并发架构
![](https://img.haomeiwen.com/i15943242/a27200512c299b62.png)
MHA:Master HA 一个保证mysql高可用的架构软件,保证在master宕机时能主动切换到slave。
网友评论