- mysql主从复制
- 安装mysql-5.7.33-1.el7.x86_64.rpm-bundle.tar
- mysql安全初始化
- 实现一主一从复制
- 实现一主多从复制(gtid模式)
- server2与server3的一主一从复制
- 加入新的slave server4节点
- 实现一主多从复制
- AFTER_SYNC模式
- 配置after_sync模式
- master超时时间
- slave设置延迟
mysql主从复制
之前都是通过编译安装,下面用rpm包,再yum install。
server2(172.20.10.6)和server3(172.20.10.8)做主从复制。server2为主,当server2中的数据变更以后,server3会随着server2自动更新。
主从复制保证server2和server3上的数据是一致的,主和从所执行的操作也是一致的。即从将主执行的SQL语句复制,自己再运行一次。
配置server2和server3,server2(172.20.10.6)为master,server3(172.20.10.8)为slave。
server2 ---- 172.20.10.6 — master
server3 ---- 172.20.10.8 ---- slave
server4 ---- 172.20.10.10 ---- slave
一主多从,
A(master)->B(slave); A(master)->C(slave)。B与C上的配置是一样的.
所有的slave都要通过认证,即用户名和密码认证连接到master。master上每当有数据更改都会写到二进制日志文件binlog dump ,如果写入到磁盘GTID,则会持久化保存。一旦变更以后,master就会把增量部分发送到slave。slave的io线程接收,并且把二进制日志写入中继日志relaylog中,并写入磁盘disk。然后SQL线程开始回放,更新日志。。。默认master与slave是异步的。有个问题,如果master与salve之间网络断开,那么salve端就会收不到信息。那么master与slave之间就会数据不一致。如何解决数据丢失的问题?
AFTER_SYNC模式线性结构,A(master)->B (slave1)->C (slave2)
还有一种情况:master发送变更给slave1,slave1再将变更发送给slave2,则需要在slave1的/etc/my.cnf上添加log-slave-updates=ON, (表示当受到master的中继日志,回放之后会把回放的信息写入自己的二二进制日志,以便后续slave复制)并且打开二进制日志log-bin=mysql-bin=ON,这样slave2就能复制二进制日志,而不是中继日志。
MySQL5.7之前都是用after_commit的方式提交的,是半同步的方式。在master端用户做数据提交,比如insert into或者其他的SQL语句。用户线程写入二进制日志,dump线程会将增量push到slave端。slave端的io线程开始接收,并且持久化到relay log,之后会有一个ack响应给master端,也就是说master会一直等待slave接收并返回确认ack,之后给用户线程提交OK。注意在master端向提交数据的用户返回ack之前,会有引擎提交的过程。一旦引擎提交之后,其实连接master端的其他用户已经可以看到master提交的数据了。但是master还没有收到ack,可能slave端并没有收到增量数据。。。
after_sync模式就很好的解决了上述的问题。将引擎提交放在master收到slave的ack之后进行。如果没有收到slave的ack确认,那么master就不做引擎提交。如果master没有做引擎提交,那么其他用户也不会查看到数据。但是用户提交的数据,master是持久化到自己的二进制日志的。以便于通过日志恢复数据。
配置after_sync模式
可以通过延迟来模拟实际延迟的效果,研究延迟的时间对实际应用的影响。另一方面,如果在master端做了一个误操作,slave端设置了延迟同步数据,在延迟时间之内,slave的数据是完好的。只要在slave端把delay事件终止,将数据备份恢复到master端即可。



