目录
异步复制(Asynchronous replication)
全同步复制(Fully synchronous replication)
半同步复制(Semisynchronous replication)
MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。
在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户。
把改变的内容复制过去, 而不是把命令在从服务器上执行一遍。
存在的问题:把主服务器上面改编后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的
默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
在MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行。主从复制架构虽然给读操作提供了扩展,可如果写操作也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。
记住两个日志和三个线程:
两个日志:二进制日志(bin log) 、中继日志(Relay log)
三个线程:I/O线程、dump线程、SQL线程
注意:中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行 更新操作不能在 Slave上并行操作。
半同步复制,会多一个ack确认线程(ack collector thread),专门用于接收slave 的反馈 信息(收集slave节点返回的ack信息)。
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
Master 服务器:192.168.10.22,mysql5.7
Slave1 服务器:192.168.10.33,mysql5.7
Slave2 服务器:192.168.10.44,mysql5.7
主创数据库
从1从2都有
一般 "Slave_IO_Running: No" 的可能原因:网络不通、my.cnf配置有问题(server-id重复)、密码、file文件名、pos偏移量不对、防火墙没有关闭
mysql从服务器挂了 恢复后怎么保证数据同步:物理方法: rsync 磁盘文件同步。 使用文件恢复,主节点需要停服务。主从复制: 将从节点原有库删除,通过偏移量,重新做一次主从复制。
数据库主从数据不一致解决方案
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况。
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况。
每个master可以有多个slave。
每个slave只能有一个master。
每个slave只能有一个唯一的服务器ID(server-id)。
master一定要开启binlog二进制日志功能;通常为了数据安全,slave也开启binlog功能。