Mysql 主从复制是开发或运维需要了解的一项技术,也是Mysql面试知识点之一。

通过复制可以实现Mysql的读写分离,也可以实现数据的实时备份。

复制流程

Mysql 主从复制

从上图中,可以看出Mysql的主从复制流程如下:

  1. 主库binglog dump线程将修改的sql写入二进制文件binlog。
  2. 从库io线程读取主库binlog文件,并写入relay log文件中
  3. 从库sql线程读取relay log 并写入数据库中。
  4. 从库通知主库完成,主库确认commit。
其中,3个线程是记住复制流程的关键
  • 主库binglog dump线程
  • 从库io同步线程   (Slave_IO_Running)
  • 从库sql线程   (Slave_SQL_Running)

复制策略

Mysql中主从复制有3种同步策略。

异步复制

异步复制是主库生成binglog后,直接commit事务,不管你从库是否确认收到没有。这样可能造成从库数据的丢失,但速度上是最快的。

全同步复制

全同步复制是主库生成binlog后,要等待所有的从库确认收到了该binlog日志后才commit事务。这样主从的数据是完整的,但性能上会受到较大的影响。

半同步复制

半同步复制是主库生成binlog后,要等待至少一个从库确认收到了binlog日志后才commit事务。这样相对于异步复制提高了数据的完整性,相对于全同步复制提高了性能,是一种折中的方式。

半同步复制需要安装Mysql 半同步复制插件。考虑到主从库的切换,需要在主库和从库上都安装,如下:

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

主从数据不同步解决

在Mysql主从同步过程中,可能由于以下这些原因造成数据不同步。

  1. 网络延迟
  2. 机器故障
  3. 自增长id不一致
  4. 刷盘参数设置问题
  5. 数据库版本不一致

一般情况下,我们在做主从同步的过程中,都会用相同的数据库版本和数据库,在刷盘参数可以设置innodb_flush_log_at_trx_commit = 1或者2尽量保证数据的完整性,至于网络和机器故障可以适当提升带宽,和机器配置。

如果是真的出现故障可以用如下两种方式解决:

  1. 忽略错误后,继续同步。 适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况。
  2. 重新做主从,完全同步。适用于主从库数据相差较大,或者要求数据完全统一的情况。

状态监控

通过命令

show slave status

查看主从状态是否正常。

一般通过如下参数判断是否正常

  • Slave_IO_Running       slave io 线程
  • Slave_SQL_Running   slave sql 线程

两个值都为yes,则代表主从服务器的工作正常。

我们可以写一个shell脚本判断salve 是否在运行。