Mysql主从复制
主从复制的形式:
l 一主一从
l 主主复制(互为主从)
l 一主多从---扩展系统读取的性能,因为读是在从库读取的;
l 多主一从---从5.7开始支持
使用环境、用途、优点、缺点:
l 实时灾备,用于故障切换
l 热备份,避免影响业务
l mysql主从复制是mysql高可用性,高性能(负载均衡)的基础
l 简单,灵活,部署方式多样,可以根据不同业务场景部署不同结构
l 在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
l 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
l 复制过程中应该时刻监控复制状态,复制出错或延时可能给系统造成影响
l 如果单做主从复制,可能造成一定的资源浪费
l 主从复制并不是完美的架构,根据业务量或者其他因素的不同,可能会有各种误差出现
主从原理:
主从复制的基础是主库记录数据库的所有变更记录到binlog。binlog是数据库中保存配置中过期时间内所有修改数据库结构或内容的一个文件。如果过期时间是10d的话,那么就是最近10d的数据库修改记录。
mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,是之后从库连接到主库时,从主库拉取过来进行复制操作的数据源。
binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。
从库生成两个线程,一个I/O线程,一个SQL线程;
I/O线程:去请求主库 的binlog(二进制日志),并将得到的binlog日志写到relay log(中继日志) 文件中;主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程:会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
大概步骤:
l 步骤一:主库db的更新事件(update、insert、delete)被写到binlog
l 步骤二:从库发起连接,连接到主库
l 步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库
l 步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
l 步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db