MySQL读写分离

MySQL读写分离

1,为啥要读写分离?

系统到了高并发阶段,数据库一定要做的读写分离了,因为大部分的项目都是读多写少。所以针对这个情况,把写操作放一个主库,主库下挂多个从库处理读操作,这样就可以支撑更高的读并发压力!

2,MySQL如何实现读写分离?

很简单,就是基于主从复制架构,简单的说就是一个主库下挂多个从库,写主库,读从库,主库把数据同步到从库。

3,MySQL主从复制的原理是啥?

主库将变更写入binlog日志,从库连接上主库,从库有一个IO线程把主库的binlog日志拷贝到自己本地,写入一个relay中继日志中。接着从库中有一个SQL线程会从中继日志中读binlog,然后执行binlog日志的内容,也就是自己本地再执行一遍SQL,这样就保证了跟主库数据一致。

4,为啥有主从数据延时的情况?

并发情况下主库是并行操作的,而从库从主库同步数据的过程是串行化的,即串行执行binlog日志中的SQL,那么在高并发场景下,从库的数据会比主库慢(延时),所以可能写入主库的数据在从库里短暂查不到,要过几十毫秒或几百毫秒才能查到。

5,如何解决主从数据同步延迟导致的数据不一致 和 主库宕机问题?

MySQL实际上在这一块有两个机制,一个是半同步复制,用来解决主库数据丢失问题;一个是并行复制,用来解决主从同步延时问题。

异步复制(Asynchronous replication)MySQL默认是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库突然挂掉了,此时主库上已经提交的事务可能并没有传到从库上,如果此时,强行将从库提升为主库,可能导致新主库上的数据不完整。

全同步复制(Fully synchronous replication)指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

半同步复制(Semisynchronous replication)主库写入 binlog 日志之后不立刻返回给客户端,而是强制立即将数据同步到从库,从库将日志写入自己本地的 relay log 之后会返回一个 ack 给主库,主库接收到至少一个从库的 ack 之后才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

所谓并行复制,指的是从库开启多个线程,并行读取 relay log 中不同库的日志,然后并行执行不同库的日志,这是库级别的并行。

一般来说,如果主从延迟较为严重,有以下解决方案:

  • 分库,将一个主库拆分为多个主库,每个主库的写并发就减少了几倍,此时主从延迟可以忽略不计。
  • 打开 MySQL 支持的并行复制,多个库并行复制。如果说某个库的写入并发就是特别高,单库写并发达到了 2000/s,并行复制还是没意义。
  • 重写代码,写代码的同学,要慎重,插入数据时立马查询可能查不到。

MySQL主从复制配置

参考

posted @ 2020-04-16 17:04  961897  阅读(214)  评论(0编辑  收藏  举报