主从复制是MySQL本身自带的一个功能,不需要额外的第三方软件就可以实现。

一、主从复制的好处:

  1. 数据更安全:做了数据冗余,不会因为单台服务器的宕机而丢失数据
  2. 性能大大提升:一主多从,不同用户从不同数据库读取,性能提升
  3. 扩展性更优:流量增大时,可以方便的增加从服务器,不影响系统使用
  4. 负载均衡:一主多从相当于分担了主机任务,做了负载均衡。

二、MySQL主从方案主要作用:

1、读写分离,使数据库能支撑更大的并发

        在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

2、发扬不同表引擎的优点

        目前Myisam表的查询速度比innodb略快,而写入并发innodb比myIsam要好。那么,我们可以使用innodb作为master,处理高并发写入,使用master作为slave,接受查询。或在myisam slave中建立全文索引,解决innodb无全文索引的弱点。

3、热备

        slave和master的数据“准实时”同步。

三、MySQL主从同步复制原理

MySQL主从复制的基本交互过程,如下:

e1cea5e3c937fc2b80c4591f2abc58cb.gif

  1. slave端的IO线程连接上master端,并请求从指定binlog日志文件的指定pos节点位置(或者从最开始的日志)开始复制之后的日志内容
  2. master端在接收到来自slave端的IO线程请求后,通知负责复制进程的IO线程,根据slave端IO线程的请求信息,读取指定 binlog日志指定pos节点位置之后的日志信息,然后返回给slave端的IO线程。该返回信息中除了binlog日志所包含的信息之外,还包括本次返回的信息在master端的binlog文件名以及在该binlog日志中的pos节点位置。
  3. slave端的IO线程在接收到master端IO返回的信息后,将接收到的binlog日志内容依次写入到slave端的relaylog文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的master端的binlog文件名和pos节点位置记录到master- info(该文件存在slave端)文件中,以便在下一次读取的时候能够清楚的告诉master,我需要从哪个binlog文件的哪个pos节点位置开 始,请把此节点以后的日志内容发给我。
  4. slave端的SQL线程在检测到relaylog文件中新增内容后,会马上解析该log文件中的内容。然后还原成在master端真实执行的那些SQL语句,并在自身按顺序依次执行这些SQL语句。这样,实际上就是在master端和slave端执行了同样的SQL语句,所以master端和 slave端的数据是完全一样的。

以上mysql主从复制交互过程比较拗口,理解起来也比较麻烦,我简化了该交互过程。如下:

  1. master在执行sql之后,记录二进制log文件(bin-log)。
  2. slave连接master,并从master获取binlog,存于本地relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。

注意:

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

四、MySQL主从同步复制的缺点

从以上mysql的Replication原理可以看出:

  1. 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间主从数据不一致的情况。
  2. 如果主从的网络断开,则从库会在网络恢复正常后,批量进行同步。
  3. 如果对从库进行修改数据,那么如果此时从库正在在执行主库的bin-log时,则会出现错误而停止同步,这个是很危险的操作。所以一般情况下,我们要非常小心的修改从库上的数据。

注意:

  1. 一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐