当前位置: > 数据库 > MySQL >

mysql同步

时间:2019-11-28 19:18来源:linux.it.net.cn 作者:IT
一、概念介绍:
 
binlog: binary log,主库中保存更新事件sql日志的二进制文件,所有对数据库有影响的操作的sql语句都会按照发生顺序保存到binlog中(例如,create table,update,insert,delete等),binlog可设置过期时间,其中保存的sql是在过期时间内的语句,binlog是从库拉去执行sql的数据源。
 
binlog输出线程: 当有从库连接到主库时,主库就会创建一个binlog输出线程用于发送binlog的内容到从库中。
 
从库会生成两个线程用于处理主库的更新时间,一个i/o线程,一个sql执行线程:
 
从库I/O线程:当从库执行START SLAVE语句之后,就会创建一个I/O线程用于连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件relay log文件。
 
从库的SQL线程:从库创建的一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
 
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。
 
从库通过创建两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。
 
 
 
二、同步方式
 
 
1.主从同步
 
执行步骤:
 
步骤一:主库db的更新事件(update、insert、delete)被写到binlog。
 
步骤三:主库的binlog输出线程通知从库有更新,并把binlog的更新内容发送给从库的I/O线程。
 
步骤四:从库的I/O线程,读取主库传过来的binlog内容并写入到relay log中。
 
步骤五:从库的SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db。
 
存在的问题:
 
如果主库宕机,则数据丢失。
从库存在复制延迟,造成数据不一致。
解决方法:
 
数据丢失的问题---半同步复制
从库复制延迟的问题---并行复制


 
2.半同步复制
 
半同步复制可解决数据丢失问题,需要安装插件。
 
执行过程:过程大概类似主从同步,区别在于:主库有更新事件sql执行完成后主库数据库不直接返回,而是先要阻塞确保当前更新事件至少写入了一个从库的elay log文件中(只要写入文件就可以,不需要保证执行),然后从库再返回主库已成功写入的状态,主库确认状态后再返回,阻塞等待可设置等待从库返回的超时时间。
 
存在的问题:
 
降低主库性能,因为需要等待从库的返回或超时。
 
 
 



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容