我们先从什么是主从复制说起。
什么是主从复制
简单来说,就是创建一个和主数据库一样的数据库,称为从数据库,从数据库同步主数据库中的数据,两者完整且独立。
为什么要主从复制
在业务比较简单的系统中,一台服务器基本能完成日常需求。但很多时候,系统和用户的规模都比较大,大量请求如果都集中在一台MySQL服务器上,磁盘I/O的频率较高,导致系统的性能急剧下降。
使用主从复制,让主(master)数据库写,从(slave)数据库读,即读写分离,这样slave可以分担master的压力,降低单台机器的I/O频率,提升系统的性能。
另外,slave同步master的数据,一旦master因故障宕机,slave可以临时替代master的位置,降低系统瘫痪的风险。
怎样进行主从复制
在介绍主从复制原理之前,先了解一下MySQL的binlog文件。
binlog是MySQL中一个二进制日志文件,专门用于记录除了select和show之外的任何使数据发生变化的sql语句,如create、alter、insert、delete等。一旦服务器启动,binlog文件就会进行记录。
主从复制分以下几个步骤:
①主库的更新操作被记录到binlog文件中;
②从库连接主库;
③主库开启binlog dump线程,将binlog文件内容传输到从库;
④从库创建I/O线程,将主库的binlog内容存进relay log文件中;
⑤从库同时又创建一个SQL进程,读取并执行relay log文件中的更新操作,并将更新内容写入从库。
可以看到,在主从复制的整个流程中,主库开启了一个线程,从库开启了两个线程。
下面是主从复制的原理图:
MySQL主从复制确实能带来很多好处,但是也伴随着一个常见问题:从库读延迟怎么办?
可能有读者不太理解这个问题是什么意思,我们详细说下。
slave开启SQL线程执行binlog中的更新操作(DDL和DML)时,DDL和DML的执行是随机的,且是单线程的(master可以并发),那么就有可能在与其它查询语句争夺时“卡住”,后面的语句就需要等它执行完才能执行,这样就造成延迟,降低了主从库的数据一致性和实时性。
相应地也有一些解决办法,如关闭从库的binlog,更换更好的从库硬件设备等,具体问题具体对待,且笔者在此方面并无经验,就不展开了。以上是对MySQL主从复制做的一个浅析,其实还有很多问题等待解决,欢迎各位深入学习。
———— / END / ————
网友评论