1、深入剖析主从复制的底层原理
1-什么是MySQL主从复制? 是指将一个MySQL数据库A的数据变更复制到另外一个MySQL实例B这个A就可以称为主库,B称为从库
2-主从复制的作用: 数据备份和恢复 可以将主库上的数据复制到一个或多个从库上。这个时候,从库可以充当一个灾备的副本。当主库宕机时,可以在从库恢复数据。 高可用 当主库发生故障时,提升一个从库为新的主,保证业务可用。 目前很多高可用架构,就是基于主从来实现的,比如双主+keepalived、MHA、Orchestrator。 负载均衡 可以将读操作在从库执行,从而减轻主库的压力。
3-MySQL主从复制的原理 主库必须开启二进制日志 当主库有写操作时(比insert、update,delete), 会记录到主库的Binlog中 从库通过IO线程读取主库的Binlog里面的内容,传给从库的RelayLog(中继日志) 从库的sql线程负责读取它的relaylog里的信息并应用到数据库中
4-两种复制方法 基于位点的复制
从库根据主库的位点信息进行执行回放。 这些位点信息包括二进制日志文件名(File Name)和事件位置(Position)。 比如我们执行
show master status\G
File就是当前实例最后一个事务写的Binlog文件 Position 就是最后一个事务在Binlog中的位点 Binlog Do DB 表示需要记录Binlog的数据库,可以通过参数配置 Binlog lgnore DB 表示不会记录Binlog的数据库 Executed Gtid Set 表示执行过的GTID(全局事务标识符)集台 基于GTID的复制 GTID是MySQL5.6引入的一种全局事务标识 在基于 GTID 的复制中,主库上,每个事务都会被分配一个唯一的GTID,从库使用这些 GTID 来同步主库的事务。
2、快速搭建主从复制
1、确保binlog开启 show global variables like "log_bin"; 查看配置文件中,binlog是否开启,防止重启后未开未开启的情况 vim /data/mysql/conf/my.cnf 搜索 log-bin 修改server_id 或 select @@global.server_id; 关闭GTID gtid_mode=off #enforce_gtid_consistency=on 创建复制用户 CREATE USER 'repl'@'%' identified WITH mysql_native_password BY 'Uid_dQc63'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 主库导出数据 cd /data/backup/ mysqldump -uroot -p --single-transaction --all-databases --master_data=2 --set-gtid-purged=OFF >alldb_bak.sql --single-transaction,开启一个事务进行备份,会把隔离级别设置为RR,在备份时不阻塞应用的情况下也可以保证数据一致性。 --all-databases,备份所有库 --master_data,记录备份的位点 传输到从库机器 scp alldb_bak.sql 192.168.152.30:/data/backup 从库导入数据 cd /data/backup mysql -uroot -p <alldb_bak.sql 确定备份是的位点 head -n 30 alldb_bak.sql 在从库上配置主库信息 CHANGE MASTER TO MASTER_HOST='192.168.152.70', MASTER_USER='repl', MASTER_PASSWORD='Uid_dQc63', MASTER_LOG_FILE='mysql-bin.000020', MASTER_LOG_POS=490037; start slave; 查看复制状态 SHOW SLAVE STATUS\G
复制状态解析
如果Slave_IO_Running和Slave_SQL_Running都是yes,就表示复制已经建立。
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event //从库IO线程的状态,这个状态表示正在等待主库发送事件 Master_Host: 192.168.152.70 //主库的IP地址或主机名 Master_User: repl //用于从库连接到主库的用户名 Master_Port: 3306 //主库的端口 Connect_Retry: 60 //如果从库与主库之间的连接中断,从库尝试重新连接的时间间隔 Master_Log_File: mysql-bin.000025 //主库当前正在写入的二进制日志文件的名称 Read_Master_Log_Pos: 534 //从库复制的主库二进制日志文件的位置 Relay_Log_File: mysql-relay-bin.000002 //从库正在写入的中继日志文件的名称 Relay_Log_Pos: 662 //从库正在写入中继日志文件的位置 Relay_Master_Log_File: mysql-bin.000025 //从库复制的主库二进制日志文件的名称 Slave_IO_Running: Yes //从库的I/O线程是否正在运行 Slave_SQL_Running: Yes //从库的SQL线程是否正在运行 Replicate_Do_DB: //需要复制的数据库 Replicate_Ignore_DB: //不需要复制的数据库 Replicate_Do_Table: //需要复制的表 Replicate_Ignore_Table: //不需要复制的表 Replicate_Wild_Do_Table: //需要复制的通配符表名称 Replicate_Wild_Ignore_Table: //需要复制的通配符表名称 Last_Errno: 0 //上一条错误的错误码 Last_Error: //上一条错误信息 &