mysql复制基础

mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
一、复制步骤
1)master再事务完成,将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events),在事件写入二进制日志完成后,master通知存储引擎提交事务。
(2)slave 开启一个I/O线程将master的binary log events拷贝到它的中继日志(relay log);

(3)slave 通过SQL线程重做中继日志中的事件,将改变反映它自己的数据。


注:在做主从复制时,最好确保主从服务器的版本兼容。从服务器至少与主服务器版本相同或更高。
二、复制基础知识
1.mysql复制是异步复制,主从数据有延时,取决于主服务器的数据更新频率。
避免延时方案:
1)使用pxc方案,基于percona Server,同步写多个mysql,同时提交。
2)根据业务让写的用户读取主mysql,其他用户读取从数据库,如论坛、微博等其他用户延时读,并无影响。
2.mysql复制是基于binlog日志,也就是说主服务器必须开启binlog日志
目前存在三种日志格式:
1)Statement 基于语句的复制, 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。存储日志量是最小的。如使用uuid等函数,由于在主从上执行会造成数据的不一致,一般不建议这种方式。
2)Row 基于行的复制,把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持。存储event数据,存储日志量大,但是不能很直接的进行读取。
3)Mixed 混合类型的复制,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。一般考虑这种方式。
3.mysql复制可以对整个实例进行复制,也可以对实例中某个库或者某个表进行复制
1)master端控制,记录那些库或忽略那些库记录binlog日志
--binlog-do-db
--binlog-ignore-db
2)slave端
--replicate-do-db
--replicate-ignore-db
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
建议在slave控制。
4.mysql复制类型
1)基于二进制日志的复制类型
mysql5.5之前唯一的复制类型,需要明确知道,当前slave上的数据所对应master的日志文件和日志点
2)使用GTID完成基于事务的复制
mysql5.6之后,使用基于事务的复制,使用的是全局事务标识符(GTID)。每一个在master提交的事务都会赋予一个全局的事务标识符。提高数据的完整性,便于切换。
5.mysql支持半同步复制
mysql5.6半同步复制流程,等待slave dump完成才返回客户端。如果在slave dump过程中,master挂了,由于主已经写完成了,会照成主从的数据不一致。

mysql5.7半同步复制流程,将slave dump移到master commit之前。避免master宕机,造成数据不一致。


Mysql 5.5.8(GA)半同步配置指南:http://blog.csdn.net/changerlove/article/details/6167255

发布了404 篇原创文章 · 获赞 205 · 访问量 227万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章