mysql主从复制GTID模式
版本8.0.36
主从复制的定义
是指把数据从一个Mysql服务器(主节点)复制到一个或多个Mysql服务器(从节点)中,会把主节点服务器中的所有数据库实例、特定数据库实例或特定表等,全部复制到从节点服务器中。
主从复制的原理
是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时,会将这些变更写入二进制日志(Binary Log)中。
从服务器通过连接到主服务器,请求从主服务器获取二进制日志,并将这些日志应用到自己的数据库中。
主从复制的优势
- 提高读性能:通过设置从服务器(Slave),读操作可以被分摊到主服务器(Master)和从服务器上,从而提高整体的读取性能。主服务器负责处理写操作,从服务器负责处理读操作,从而降低主服务器的负载,提升整个系统的吞吐量。
- 数据冗余和备份:通过主从复制,从服务器上的数据是主服务器的冗余副本。在主服务器发生故障时,从服务器仍然可以提供服务,并且可以通过将某个从服务器提升为新的主服务器来快速恢复服务。此外,从服务器也可以用于定期的备份操作,以确保数据的安全性和可恢复性。
- 高可用性:通过主从复制,可以实现数据库的故障转移和高可用性。当主服务器发生故障时,可以手动或自动将某个从服务器提升为新的主服务器,继续提供数据库服务,从而实现快速的故障恢复。
- 数据分析和报表生成:由于从服务器可以处理读操作,可以将其用于数据库的数据分析和报表生成等工作。这样可以避免对主服务器造成额外的负载,同时提供实时的数据分析和报表服务。
- 数据分发和跨地域部署:主从复制可以用于将数据分发到不同的地理位置的从服务器上,从而实现跨地域的数据访问和部署。这对于全球化的应用程序和多地域灾备是非常有用的。
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
主从复制的形式
- 一主一从;
- 一主多从;
- 多主一从;
- 双主复制;
- 级联复制。
主从复制的模式
- 异步模式(默认);
- 半同步模式;
- 全同步模式。
主从复制的类型
基于二进制日志复制(有三种形式)
- 基于SQL语句的复制;
- 基于行的复制;
- 混合模式复制。
基于GTID复制(Mysql版本 >= 5.7及以上推荐使用)
GTID模式
GTID的概念
- GTID即全局事务ID:global transaction identifier;
- GTID是一个事务一一对应,并且全局唯一ID;
- 一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致;
- GTID用来代替传统复制方法,不再使用MASTER_LOG_FILE+MASTER_LOG_POS开启复制。 而是使用MASTER_AUTO_POSTION=1的方式开始复制;
- MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善;
- 在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
GTID的优势
- 更简单的实现failover,不用以前那样在需要找log_file和log_pos;
- 更简单的搭建主从复制;
- 比传统的复制更加安全;
- GTID是连续的没有空洞的,保证数据的一致性,零丢失。
GTID的原理
- 当一个事务在主库端执行并提交时,产生GTID,一同记录到binlog日志中;
- binlog传输到slave,并存储到slave的relaylog后,读取这个GTID的这个值设置gtid_next变量,即告诉Slave,下一个要执行的GTID值;
- sql线程从relay log中获取GTID,然后对比slave端的binlog是否有该GTID;
- 如果有记录,说明该GTID的事务已经执行,slave会忽略;
- 如果没有记录,slave就会执行该GTID事务,并记录该GTID到自身的binlog,在读取执行事务前会先检查其他session持有该GTID,确保不被重复执行;
- 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
GTID的配置
Mysql主服务器
1、在Mysql的my.ini配置文件中添加以下参数:
gtid_mode=ON
enforce_gtid_consistency=true
server-id=46
log-bin=mysql-bin
binlog_format=row
log-slave-updates=1
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db: 忽略同步的数据库
server-id: 唯一标识,同一网段一般以最后一个ip段命名
2、重启Mysql和创建复制用户
使用管理员打开cmd命令窗口,按照以下命令步骤分别执行:
#暂停服务; net stop mysql #开启服务; net start mysql #连接数据库,Password替换为自己数据库密码; mysql -u root -pPassword #创建一个用于复制的用户,userName和Password自行设置; CREATE USER 'repl'@'%' IDENTIFIED BY 'Password'; #授予复制权限,repl即上步创建的用户名; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; #获取状态,记住File和Position两项参数,后面需要用到;
SHOW MASTER STATUS;
Mysql从服务器
1、在Mysql的my.ini配置文件中添加以下参数:
gtid_mode=ON enforce_gtid_consistency=true server_id=22 log-bin=mysql-bin binlog_format=row log-slave-updates=1
2、重启Mysql和创建复制用户
使用管理员打开cmd命令窗口,按照以下命令步骤分别执行:
#暂停服务; net stop mysql #开启服务; net start mysql #连接数据库,Password替换为自己数据库密码; mysql -u root -pPassword #配置复制,serverIP是主服务器IP地址,repl和password是刚在主服务器创建的用户,file和position是刚查看主服务器状态返回的参数; CHANGE MASTER TO MASTER_HOST='12.11.21.46',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1; #启动复制; START SLAVE; #查看复制状态,输出中的Slave_IO_Running和Slave_SQL_Running的值为Yes,表示复制正在正常运行; SHOW SLAVE STATUS\G;
SHOW SLAVE STATUS\G;
检查输出中的以下关键字段:
- Slave_IO_Running: 是否为 "Yes"。
- Slave_SQL_Running: 是否为 "Yes"。
- Last_IO_Error: 是否为空,或是否有任何错误信息。
- Last_SQL_Error: 是否为空,或是否有任何错误信息。
但是如果主服务器已经存在数据,需要先在从服务器还原数据
通过上述步骤,你可以排查和解决主从服务器之间的数据不同步问题。以下是总结的步骤:
- 检查从服务器的复制状态。
- 确保复制线程已启动。
- 检查主从服务器的连接。
- 检查复制配置。
- 检查二进制日志。
- 重新配置复制。
- 强制同步表结构(如果需要)。
这样可以确保主从服务器之间的数据同步正常。
步骤:
1. 停止从服务器上的复制
在从服务器上运行以下命令停止复制:
STOP SLAVE;
2. 重置从服务器的 GTID 设置
重置从服务器上的 GTID 设置和复制状态:
RESET SLAVE; RESET SLAVE ALL;
确保从服务器上的所有 GTID 都被清除:
RESET MASTER;
3. 确保主服务器和从服务器的一致性
也可以在从服务器执行设置 SET @@GLOBAL.GTID_PURGED='c9fba9e2-db3b-11eb-81d4-000c298d8da1:1-228'; // 其中 c9fba9e2-db3b-11eb-81d4-000c298d8da1:1-228 为主服务器的
从主服务器生成新的备份,确保包含 GTID 信息:
mysqldump --all-databases --source-data=2 --single-transaction --flush-logs --hex-blob -u root -p > full_backup.sql
4. 将备份文件传输到从服务器并恢复
传输备份文件到从服务器:
scp full_backup.sql user@slave_ip:/path/to/destination
在从服务器上恢复备份:
处理大型 SQL 文件时,可以采用以下几种方法来提高导入速度:
1. 使用 myloader
和 mydumper
mydumper
和 myloader
是一对高性能的数据导出和导入工具,特别适合处理大数据量。
mysql -u root -p < /path/to/destination/full_backup.sql
5. 在从服务器上重新配置复制
配置从服务器以使用 GTID 模式并重新配置复制:
CHANGE MASTER TO MASTER_HOST='主服务器IP', MASTER_USER='复制用户', MASTER_PASSWORD='复制用户密码', MASTER_PORT=3306, MASTER_AUTO_POSITION=1;
6. 启动从服务器的复制
START SLAVE;
7. 检查复制状态
使用以下命令检查复制状态,确保一切正常:
SHOW SLAVE STATUS\G;