MySQL的主从复制功能可以帮助我们实现负载均衡和读写分离。
对于主服务器来说,主要负责写,从服务器主要负责读,这样的话,就会大大减轻压力,从而提高效率。
主从复制可以分为:
主从架构有以下几种形式:
MySQL主从复制是基于主服务器在二进制日志跟踪所有对数据库的更改。因此,要进行复制,必须在主服务器上启用二进制日志。
MySQL的主从复制工作过程大致如下:
MySQL主从复制支持语句复制和行数据复制两种不同的日志格式,这两种日志格式也对应了各自的复制方式。当然也有二者相结合的混合类型复制。
基于语句的复制相当于逻辑复制,即二进制日志中记录了操作的语句,通过这些语句在从数据库中重放来实现复制。
这种方式简单,二进制文件小,传输带宽占用小。但是基于语句更新依赖于其他因素,比如插入数据时利用了时间戳。
因此在开发当中,我们应该尽量将业务逻辑放在代码层,而不应该放在MySQL中,不易扩展。
特点:
基于行的复制相当于物理复制,即二进制日志中记录的实际更新数据的每一行。
这样导致复制的压力比较大,日志占用的空间大,传输带宽占用大。但是这种方式比基于语句的复制要更加精确。
特点:
一般情况下,默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
# 如果在双主复制结构中没有设置ID的话就会导致循环同步问题
server_id=1
# 即日志中记录的是语句还是行更新或者是混合
binlog_format=mixed
# 在进行n次事务提交以后,Mysql将执行一次fsync的磁盘同步指令。将缓冲区数据刷新到磁盘。
# 为0的话由Mysql自己控制频率。
sync_binlog=n
# 为0的话,log buffer将每秒一次地写入log file中并且刷新到磁盘。
# mysqld进程崩溃会丢失一秒内的所有事务。
# 为1的话,每次事务log buffer会写入log file并刷新到磁盘。(较为安全)
# 在崩溃的时候,仅会丢失一个事务。
# 为2的话,每次事务log buffer会写入log file,但一秒一次刷新到磁盘
innodb_flush_logs_at_trx_commit=0
# 阻止从库崩溃后自动启动复制,给一些时间来修复可能的问题,
# 崩溃后再自动复制可能会导致更多的问题。并且本身就是不一致的
skip_slave_start=1
# 是否将从库同步的事件也记录到从库自身的bin-log中
# 允许备库将重放的事件也记录到自身的二进制日志中去,可以将备库当做另外一台主库的从库
log_slave_update
# 日志过期删除时间,延迟严重的话会导致日志文件占用磁盘
expire_logs_days=7
解决方法:
并行复制
在MySQL5.6版本前,从库复制主库时,sql线程是单线程的,MySQL5.6版本后引入并行复制,并行复制就是在中间加了一个分发任务的环节,也就是说原来的SQL Thread变成了现在的Coordinator组件,当日志来了之后,Coordinator负责读取日志信息以及分发事务,真正的日志执行的过程是放在了worker线程上,由多个线程并发的去执行。并发复制可以一定程度上解决主从延时的问题。
当主机宕机后,数据可能丢失。
解决方法:
使用半同步复制,可以解决数据丢失的问题。
主从复制带来了很多好处,当我们的主服务器出现问题,可以切换到从服务器;可以进行数据库层面的读写分离;可以在从数据库进行日常的备份。还可以保证: