Mysql AB复制(主从复制)理论
MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。即从Master复制到一个或多个Slave上。
实现整个主从复制需要由Master上的IO进程,和Slave上的sql进程和IO进程共同完成。首先打开Master上的 binary log (bin-log)功能(修改配置文件),因为整个复制实际就是slave从master端获取相应的二进制日志,然后在slave端按顺序执行日志中的各种操作。(二进制日志几乎记录了除select外所有的sql语句的操作)
基本过程:
(1)Slave端的IO进程连接到master,向master请求指定日志文件的指定位置之后的日志内容
(2)Master接收到Slave的IO进程请求后,根据请求信息,读取相应位置的二进制日志的内容,返回给Slave的IO进程。并将本次请求读取的二进制日志文件名及位置一起返回给Slave
(3)Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件中,并将读取到的Master的bin-log文件名和位置记录在master-info文件中,方便下次读取的时候能够清楚的告诉master从哪个位置往后的日志内容发给我
(4)Slave 的sql进程检测到relay-log中新增加了内容后,会马上解析其中的内容,转变为执行的sql语句,并在slave端执行。
注意:当你进行复制时,所有对复制中的表的更新必须在主服务器上进行(读写分离)。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到
从服务器作为份。
· 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的
客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负
荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同
步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务
器。在备份过程中主服务器可以继续处理更新。
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助
注意:在同步之前确保 master 与 slave 上的数据一致性。因为在数据同步过程中,是命令同步,即sql语句同步
相关文件作用:
1. mysql-bin.index:服务器一旦开启二进制日志,会产生一个与二日志文件同名,但是以.index 结尾的文件。它用于跟踪磁盘上存在哪些二进制日志文件。MySQL 用它来定位二进制日志文件。
2. mysqld-relay-bin.index:该文件的功能与 mysql-bin.index 类似,但是它是针对中继日志,而不是二进制日志。
3. master.info:保存 master 的相关信息。不要删除它,否则,slave 重启后不能连接 master。
4. relay-log.info:包含 slave 中当前二进制日志和中继日志的信息。
如果写操作较少,而读操作很多时,可以采取上图这种结构。你可以将读操作分布到其它的 slave,从而减小master 的压力。但是,当 slave 增加到一定数量时,slave 对 master 的负载以及网络带宽都会成为一个严重的问题。这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。当设置 log_slave_updates 时,你可以让 slave 扮演其它 slave 的 master。此时,slave 把 SQL 线程执行的事件写进行自己的二进制日志(binary log),然后,其它的 slave 可以获取这些事件并执行它,从而有效缓解master 的压力。如下:
Mysql5.6以后版本
GTID (global transaction ID)是一个已提交事务的编号,且是全局唯一编号
GTID实际是UUID+TID组成的。其中UUID是一个mysql实例的唯一标识。TID代表了该实例上已提交的事务数量,并且随着事务提交单调递增。
GTID功能:(1)可以知道事务最初是从哪个实例上提交的
(2)方便了Replication的Failover
Replication failover的操作过程
A————>B ----------->C
|_____________________|
若A 的服务器宕机了,需要将业务切换到B 上,同时又需要将C的复制源改为B ,修改复制源很简单,(CHANGE MASTER TO MASTER_HOST=XXX,MASTER_LOG_FILE=XXX,MASTER_LOG_POS=XXX)难点在于,由于同一个事务在每台机器上的binlog名字和位置都不一样,那么怎么找到C当前同步的停止点所对应B的master_log_file和master_log_pos是什么时候
由于同一事务的GTID在所有节点上的一致性,根据C当前停止的GTID就能唯一定位到B上的GTID。只需要知道IP,密码,端口就可以了,mysql会从内部的GTID自动找到同步点
多线程:支持多线程的复制,采用多个线程,每个线程处理不同的database,提高了并发性能,在一定程度上解决了slave延迟master并很难追上的问题
(延迟问题是当master宕机时,backup可能还未启动?)
slave-parallel-workers=16最多为16,=0则表示不开启多线程,=1则效率最低
备份:5.7新增加的数据库导出方法,用mysqlpump代替mysqldump,而mysqldump是单线程的,导出很慢;mysqlpump是多线程的,在社区版中mydumper是多线程的,支持并行操作