为什么要对MySQL做主从同步复制
一.MySQL主从方案主要作用
1.读写分离,使数据库能支撑更大的并发
在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
2.发扬不同表引擎的优点
目前Myisam表的查询速度比innodb略快,而写入并发innodb比myIsam要好。那么,我们可以使用innodb作为master,处理高并发写入,使用master作为slave,接受查询。或在myisam slave中建立全文索引,解决innodb无全文索引的弱点。
3.热备
slave和master的数据“准实时”同步。
二.复制技术能够解决的问题
MySQL复制技术有以下一些特点:
1.数据分布 (Data distribution )
2.负载平衡(load balancing)
3.备份(Backups)
4.高可用性和容错行 High availability and failover
三.MySQL主从同步复制原理
MySQL主从复制的基本交互过程,如下:
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端的relay log文件(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.一个衍生的配置是双主、互为主从配置,只要双方的修改不冲突,则可以工作良好。
2.如果需要多主库的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。
五.如何实现MySQL主从复制
要实现MySQL的Replication,首先必须打开master端的binlog (mysql-bin.xxxxxx)日志功能,否则无法实现mysql的主从复制。因为mysql的整个主从复制过程实际上就是:slave端从 master端获取binlog日志,然后再在自己身上完全顺序的执行该日志中所记录的各种SQL操作。
参考博客:
转载于:https://blog.51cto.com/zkhylt/1773679