茂展的分享博客

MySQL深入学习 —— 主从分离

MySQL深入学习 —— 主从分离

如何实现MySQL的读写分离

基于主从复制架构,有一个主库,挂多个从库,然后我们写在主库,读在从库

MySQL主从复制原理

主库将变更写入binlog日志中,然后从库连接主库之后,从库有一个IO线程,将主库的binlog日志拷贝到自己本地,然后写入一个叫做relay中继日志中,接着从库有一个SQL线程从中继日志中取出binlog日志内容,然后执行,相当于执行了一遍sql语句,这样就保证了自己和主库的数据是一致的。

注:主库是并行执行的,但是从库是串行化执行的,所以在高并发下,从库数据与主库数据同步会有延迟

然后会衍生出来一个问题,如果主库执行后还没有来得及给从库,就发生宕机了,那么从库数据就得不到同步。
所以有两种比较不错的解决方案
1. 半同步复制
即 一旦主库变更写入binlog日志中,就会强制此时立即将数据同步到从库,从库日志写入自己的relay中继日志中之后,接着会返回主库一个ack表示,主库收到至少一个ack标识,就认为写操作完成了。
2. 并行复制
从库开启多个线程,并行读取relay log中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。

延迟比较严重,有以下解决方案

  • 分库: 将一个主库拆分为多个主库,然后这样就可以减少一个主库的并发,从而缓轻从库的主从复制压力
  • 重写代码: 在执行写之后一段时间内,不进行读操作
  • 并行: 打开从库的并行复制
  • 设置直连主库 ,这样分离没有意义

说到这儿了,还没有说为什么要读写分离(主从复制),接下来说说

什么时候使用读写分离

其实就是将数据库分为主库和从库,主库用来读,从库用来读,然后主从进行数据同步。
由于互联网的应用大部分都是读多写少,所以我们可以使用读写分离方式来解决数据库的写瓶颈。但是选择读写分离要面对一下几个问题

  1. 数据库连接池要进行区分,哪些是读连接池,哪些是写连接池,研发难度很大
  2. 要保持主从一致性
  3. 为了保证高可用,读连接池要能使用故障自动迁移。

所以我们完全可以使用缓存来解决这些问题的,但是必须实现高可用,否则集群挂掉,所有的访问压力全部集中于数据库,数据库会瘫痪。

数据库的瓶颈以及解决办法

数据容量是瓶颈,例如订单表,数据量只增不减,历史数据又必须要留存,非常容易成为性能的瓶颈,而要解决这样的数据库瓶颈问题,“读写分离”和缓存往往都不合适,最适合的是什么呢?答案是数据切分

数据切分

切分的目的在于减少数据库的负担,缩短查询时间!
数据库分布式的核心就是数据切分,以及切分后对数据的定位、整合
数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分
详细学习,比较难理解,后续继续学习!

------本文结束感谢阅读------
🐶 您的支持将鼓励我继续创作 🐶