主从复制中的三个线程:
Binlog Dump线程:此线程运行在主库,当主从都配置好后,从库运行START SLAVE启动复制后,会在主库上生成一个BinlogDump线程,该线程的主要作用就是读取主库Binlog事件,然后发送到从库(从库的I/O线程)。
I/O线程:此线程运行在从库,作用是向主数据库要数据,并且将主库发送过来的变更事件写入到从库的中继日志中。
SQL线程:此线程运行在从库,主要作用是读取中继日志中的变更事件并更新从库。
2. 主从复制流程大致流程:主库在事务提交时会把变更作为事件记录(Events)到二进制文件(binlog)当中,从库的IO线程从主库获取二进制日志(binlog),并在本地保存为中继日志(relay-log),然后通过SQL线程来在从库上执行中继日志中的内容,使从库和主库保持一致。
详细流程如下:
主库验证从库发起的连接;
主库为从库开启一个线程;
从库将主库日志的偏移位告诉主库;
主库检查该值是否小于当前二进制日志偏移位。
如果小于,则通知从库可以取数据。
从库持续从主库取数据,直至取完,这时,从库线程进入睡眠,主库线程同时进入睡眠。
当主库有更新时,主库线程被激活,并将二进制日志推送给从库,并通知从库线程进入工作状态。
从库SQL线程执行二进制日志,随后进入睡眠状态。
二.验证环境 1. 操作系统CentOS-6.7-x86_64
2. MySQL版本MySQL版本是5.6.36: https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.36.tar.gz
3. 拓扑图
采用VMware ESXi虚拟出的2台服务器master/slave,地址10.11.4.196/198;
三.主库配置 1. my.cnf配置
[root@master ~]# vim /etc/my.cnf [mysqld] # ID值唯一的标识了群集中的主从服务器,master_id必须为1到232–1之间的一个正整数值,slave_id值必须为2到232–1之间的一个正整数值. server_id = 196 # 启用binlog,启用后才可通过I/O写到Slave的relay-log,是进行replication的前提. log_bin = /mysql/mysql-bin # 设置binlog文件的最大值,当达到这个值会自动生成一个新的binlog文件. max_binlog_size = 1G # binlog会占据大量磁盘空间,可以设置binlog文件过期时间,以天为单位. # expire-logs-days = # 配置每次事务提交时是否都需要刷新binlog到磁盘,默认配置0,是由文件系统自己控制;如果设置为1,默认每次事务提交都会刷新binlog到磁盘. # 因为binlog也有缓存,事务提交时先写缓存,如果系统突然宕机,可能会丢失缓存中的记录;但每次事务提交都写磁盘会对性能造成影响. # 通过半同步复制可以解决因系统突然宕机而导致binlog缓存数据丢失的问题. sync_binlog = 0 # 二进制日志记录有三种方式:row, STATEMENT and mixed # row,基于行的复制,记录每一行的变更操作,优点:对复制的兼容性高,缺点:日志记录量大,对IO的影响也很大,不容易用来做分析; # STATEMENT,基于语句的复制,记录操作的sql语句,是默认的格式,优点:日志量小,便于用来做分析,IO影响小,缺点:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户; # mixed, 混合模式,默认采用STATEMENT记录,当出现不确定函数时就采取row记录. binlog-format = mixed # 只将指定数据库的变动写入二进制文件binlog,如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项; # 在databases中无相应数据库时,开启binlog-do-db会导致mysql无法启动. # binglog-do-db = # 对指定数据库的变动不写入二进制文件binlog,如果有多个数据库可用逗号分隔,或者使用多个binlog-ignore-db选项. binlog-ignore-db = information_schema,mysql,performance_schema,test # 指定需要复制同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项 # replicate-do-db = # 指定不需要复制同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项. # replicate-ignore-db = #配置文件在重启后生效 [root@master ~]# service mysqld restart
2. 创建复制用户