MySQL主从复制

一.bin log日志

 它记录数据库所有执行的DDLDML等数据库更新事件的语句,但不包含没有修改任何数据的语句(select,show等)。

 应用场景:

  • 用于数据恢复:数据库宕机,可以使用该日志进行恢复。
  • 用于数据复制:主节点发送数据到从节点。

写入机制:事务开始的时候,先把日志写到binlog cache中,事务提交,再刷新到bin log文件中。

刷盘策略:参数:sync_binlog

  • 0:默认,每次提交事务都会刷新到page cache中,什么时候刷到磁盘由操作系统决定。
  • 1:每次提交事务会同时刷到page cache和磁盘。
  • n:每次提交事务都会write,积累到n个事务之后才fsync。

 与redo log 的区别?

  • redo log是物理日志,记录数据做了什么修改。比如哪条数据改为多少了。
  • bin log是逻辑日志,记录原生的SQL语句。
  • redo log为了数据库宕机恢复数据
  • bin log是为了保持主从一致

两阶段提交

  • 引出问题:redo log如果已经完成,写bin log 的时候服务器宕机了(redo log在执行完SQL就写入,而bin log是在事务结束的时候才写入,所以就可能发生这样的问题),此时主库完成数据的更新,从库没有获得此次更新,就造成主从数据库不一致。
  • 为了解决上述问题,innodb使用两阶段提交,将redo log的写入分为2个步骤:preparecommit

 

 二.主从复制

分类:

  • 一主一从模式

  • 双主双从模式

 

mysql主从同步的原理?    主要靠3个线程,2个日志

  • 三个线程:master主节点(bin log dump thread),slave子节点(I/O thread,SQL thread)
  • 两个日志:bin logrelay log(中继日志)
  • 原理:数据发生变化,主节点bin log 就发生变化,bin log dump thread线程就会把bin log的 数据发送给从节点,从节点的i/o 线程就会读取发来的数据,并写入到relay log中,然后 sql thread线程就会执行relay log中的操作,从而保证数据的一致性。
  • 注意:采用”增量同步”。从节点会使用 bin log文件+position偏移量 来定位需要开始同步的位置

 

数据一致性问题的解决方案:

  • 引出问题:mysql的复制方法默认采用异步的,就是主节点发送了同步数据之后,就不会管从节点是否 同步成功。这样做的弊端是,如果主节点宕机了,从节点还没有同步成功,那么数据就会丢失。 (因为主节点宕机,会选择一个从节点升级未主节点,这样刚才主节点的binlog 文件就丢失了)
  • 方案一:全同步复制:只有所有的从库同步完成,才能通知主库继续下面的操作。但是这样做效率太低。
  • 方案二:半同步复制:只要有一个从库同步完成,就通知主库继续下面的操作。效率提高
  • 方案三:组复制(MGR)

 

 

 

寄语:涓滴之水终可以磨损大石,不是由于它力量强大,而是由于昼夜不舍的滴坠。

Tags: