mysql 主从复制之原理
1.主从复制模式
一主一从
主主复制
一主多从---扩展系统读取的性能,因为读是在从库读取的;
多主一从---5.7开始支持
联级复制--
图示
2.主从复制的优势
实时灾备,用于故障切换
读写分离,提供查询服务
备份,避免影响业务
3.主从复制的必要条件
主库开启binlog日志(设置log-bin参数)
主从server-id不同
从库服务器能连通主库
4.主从复制原理
4.1.简述原理流程
1.主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
2.从库生成两个线程,一个I/O线程,一个SQL线程;
2.1.从库i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
2.2.从库SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
4.2.详细原理流程
1.主从复制的基础是主库记录数据库的所有变更记录到binlog。
2.binlog: binary log,主库中保存更新事件日志的二进制文件。
3.binlog 是数据库中保存配置中过期时间内所有修改数据库结构或内容的一个文件。
如果过期时间是10d的话,那么就是最近10d的数据库修改记录。
4.mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,
并执行更新记录,使得从库的内容与主库保持一致。
5.在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,是之后从库连接到
主库时,从主库拉取过来进行复制操作的数据源。
6.主库binlog输出线程。每当有从库连接到主库的时候,主库都会创建一个线程然后发送
binlog内容到从库。
7.对于主库每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。
一旦主库的该事件被线程读取完之后,该锁会被释放,即使在主库的该事件完全发送到
从库的时候,该锁也会被释放。
8.在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
8.1.从库I/O线程。
当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,
该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,
其中包括relay log文件。
8.2.从库的SQL线程。
从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
9.概述
9.1.可以知道,对于每一个主从复制的连接,都有三个线程。
9.2.拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,
9.3.每一个从库都有它自己的I/O线程和SQL线程。从库通过创建两个独立的线程,
使得在进行复制时,从库的读(I/O线程)和写(SQL线程)进行了分离。
9.3.1.因此,即使负责执行的线程(SQL线程)运行较慢,负责读取更新语句的线程并不会因此变得缓慢。
9.3.2.比如说,如果从库有一段时间没运行了,当它在此启动的时候,
尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。
这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,
I/O线程也至少完全读取了所有的内容,
并将其安全地备份在从库本地的relay log,
随时准备在从库下一次启动的时候执行语句。