MySQL复制基础
1、Mysql的复制是异步复制(会有一定延迟)
在master中操作是可以并行进行的,并发的事物量称为TTS(每秒钟执行写操作)只有master完成写操作,才会把日志写入binarylog,是一个线性的过程,不能并发执行
造成了一种现象,在master上时并发执行的操作,在从上变成了线性操作。
实例:在做论坛过程中,数据量比较大,可以进行读写分离操作。但是会有这样一种请款,自己写的帖子,刷新一下,但是会有延迟,读不到自己写的帖子。这是我们可以做一个假延时状态,将自己的读操作和写操作放在用一个master中,其他人读的时候放在slave中。
2、MySQL的复制是基于Binlog日志
存在三种日志格式:
Statement:Binlog中存储的的是sql语句,存储日志量是最小的。
缺点:uuid等一些函数,或者update limit在没有使用orderby 的情况下可能会造成主从不一致。
row存储event数据,存储日志量大,但是不能很直接的进行读取
statement和row区别:
假如update1000行数据,statement里面存储的是一行update数据,而row则存储的是1000行数据的变更
缺点:不能很直观的进行日志的读取,存取的日志量比较大
mixed结余Row和Statement之间的,对于不确定的操作使用row记录,如果每天数据操作量很大,产生的日志比较多,可以考虑混合模式
2、MySQL的复制可是对整个实例进行复制,也可以对实例中的某个库或某个表进行复制
在Master端进行控制:
binlog-do-db(库)
binlog-ignore-db(库)
在Slave端进行控制
replicate-do-db(库)
replicate-ignore-db(库)
replicate-do-table
replicate-ignore-table
replicate-wild-do-table
replicate-wild-ignore-table
MySQL5.7复制实例
存在量中复制类型:
1、基于二进制日志的复制
(对于主从复制时,必须明确的知道当前的数据所对应的主上的日志文件和日志点,特别是一主多从的情况下,)
2.使用GTID(全局事物标识符)完成基于事物的复制:
每一个在master所提交的事物都会赋予全局唯一的标识,标识由两部分组成(主机标识符和事物ID),当我们在从上重用这些数据的时候,就可以明确知道哪些事物已经执行过,哪些事物没有执行过
MySQL支持半同步复制
当集群中存在半同步复制的主从服务器时,允许一个进程中的master提交事物后,
在一段时内,阻止进程向调用进程进行提交,并且在一段时间内,可以收到来自slave确认,只有当slave确认收到日志,并存入到磁盘之后,在master提醒事物进程,整个事物执行完成
5.6支持半同步复制
5.7半同步复制
防止了主上的复制晚上从的复制还没完成,就显示commit OK,mysql5.7进一步保证了数据的安全性和完整性
如何实现基于日志点的复制
步骤:
1、在Master端建立复制用户
2、备份Master端的数据,并在Slave端恢复
3、在slave端使用Change master命令配置复制