MySQL的主从复制
目录
一. 主从复制
1.1 什么是主从复制
1.2 工作原理
1.3 主从复制的模式
1.4 主从复制的配置实例
1.5 半同步复制的配置实例
面试题
造成主从不一致的原因
主从不一致修复方法
一. 主从复制
1.1 什么是主从复制
主从复制是一种数据复制技术,主要用于提高数据库的可用性和读取性能。
- 主服务器:负责处理写操作,并将数据变更记录到二进制日志中。
- 从服务器:从主服务器获取二进制日志,并在本地重放这些日志,以保持与主服务器的数据同步。
1.2 工作原理
-
主服务器数据变更:当主服务器发生数据更新时,这些变更会被记录到二进制日志中。
-
从服务器探测变更:从服务器(Slave)通过I/O线程实时监测主服务器的二进制日志,一旦发现日志有更新,立即向主服务器请求最新的二进制日志事件。
-
主服务器发送日志:主服务器为每个从服务器的I/O线程创建一个dump线程,用于将二进制日志事件发送给从服务器。
-
从服务器保存日志:从服务器的I/O线程接收到二进制日志事件后,将其保存到本地的中继日志(Relay Log)中。
-
从服务器重放日志:从服务器启动SQL线程,从中继日志中读取二进制日志事件,并将其解析为SQL语句逐一执行,确保从服务器的数据与主服务器保持一致。
-
线程休眠:完成数据同步后,I/O线程和SQL线程进入休眠状态,等待下一次数据变更的唤醒。
1.3 主从复制的模式
-
异步复制
- 特点:主服务器(Master)在写入数据后,不会等待从服务器(Slave)确认,直接返回成功。
- 优点:性能高,主服务器的写入操作不受从服务器的影响。
- 缺点:数据一致性较弱,可能存在数据延迟或丢失的风险。
-
半同步复制
- 特点:主服务器在写入数据后,会等待至少一个从服务器确认收到数据,然后才返回成功。
- 优点:数据一致性较强,减少了数据丢失的风险。
- 缺点:性能略低于异步复制,因为需要等待从服务器的确认。
-
全同步复制
- 特点:主服务器在写入数据后,会等待所有从服务器确认收到数据,然后才返回成功。
- 优点:数据一致性最强,几乎不存在数据丢失的风险。
- 缺点:性能较低,因为需要等待所有从服务器的确认。
1.4 主从复制的配置实例
实验准备
Ubuntu(192.168.52.105)为主服务器
Ubuntu1(192.168.52.31)和Ubuntu2(192.168.52.107)为备服务器
#在主服务器和备服务器上,确保安装相同版本的MySQL数据库
apt search mysql
apt-get update
apt install mysql-server-8.0 -y#在主服务器上操作
#下载hellodb,模拟主服务器运行了一段时间, 有一定的数据
mysql -u root < hellodb_innodb.sql#完全备份,并发送到备服务器
mysqldump -uroot -A -F --single-transaction --source-data > /opt/all.sql
scp /opt/all.sql 192.168.52.31:/opt
scp /opt/all.sql 192.168.52.107:/opt#备服务器接收
mysql -uroot < /opt/all.sql
Ubuntu1和Ubuntu2同理,这里只展示Ubuntu1接收
#在主服务器上
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=31
systemctl restart mysql#登录mysql,新建用户+授权
mysql
create user test@'192.168.52.%' identified by "abc123";
grant replication slave on *.* to test@'192.168.52.%';#更改认证插件
ALTER USER 'test'@'192.168.52.%' IDENTIFIED WITH mysql_native_password BY 'abc123';#看节点
show master status;#可以看到mysqldump线程
show processlist;
#从服务器操作
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=32
systemctl restart mysql#另一个从服务器
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=33
systemctl restart mysql#登录msyql
CHANGE MASTER TO
MASTER_HOST = '192.168.52.105',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT = 3306,
#以下两项由主服务器的show master status而来,不要一味复制
MASTER_LOG_FILE = 'binlog.000005',
MASTER_LOG_POS = 1005;#启动主从复制
start slave;#查看主从复制的状态
show slave status\G; #如果发送错误
stop slave; #关闭线程
reset slave all; #清空配置
#重做“#登录mysql”那一步
两个备服务器操作完全一样,以下只展示Ubuntu1的操作
#进行实验结果认证
#在主服务器创建一个数据库,看备服务器是否有反映
create database dhf;
1.5 半同步复制的配置实例
实验准备
Ubuntu(192.168.52.105)为主服务器
Ubuntu1(192.168.52.31)和Ubuntu2(192.168.52.107)为备服务器
#在主服务器上
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=31
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=3000
systemctl restart mysql#登录mysql,安装半同步复制的主服务器插件,新建用户+授权
mysql
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'
create user test@'192.168.52.%' identified by "abc123";
grant replication slave on *.* to test@'192.168.52.%';#更改认证插件
ALTER USER 'test'@'192.168.52.%' IDENTIFIED WITH mysql_native_password BY 'abc123';#看节点
show master status;#可以看到mysqldump线程
show processlist;
#从服务器操作
vim /etc/mysql/mysql.conf.d/mysqld.cnf
#配置用于在MySQL中启用从服务器的半同步复制功能。
rpl_semi_sync_slave_enabled=ON
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=32
systemctl restart mysql#另一个从服务器
vim /etc/mysql/mysql.conf.d/mysqld.cnf
rpl_semi_sync_slave_enabled=ON
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
server-id=33
systemctl restart mysql#登录msyql
#配置用于在MySQL中启用从服务器的半同步复制功能。
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
CHANGE MASTER TO
MASTER_HOST = '192.168.52.105',
MASTER_USER = 'test',
MASTER_PASSWORD = 'abc123',
MASTER_PORT = 3306,
#以下两项由主服务器的show master status而来
MASTER_LOG_FILE = 'binlog.000004',
MASTER_LOG_POS = 1004;#启动主从复制
start slave;#查看主从复制的状态
show slave status\G; #如果发送错误
stop slave; #关闭线程
reset slave all; #清空配置
#重做“#登录mysql”那一步
#进行实验结果认证
#在主服务器查看半同步状态
SHOW GLOBAL VARIABLES LIKE '%semi%';#在从服务器上
stop slave;#在主服务器创建数据库,查看确认时间
create database dhf;
面试题
造成主从不一致的原因
-
主库binlog格式为 Statement ,同步到从库执行后可能造成主从不一致。
-
主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。
-
从节点未设置只读,误操作写入数据
-
主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致
-
主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数
-
据库上面可能不支持该功能
-
MySQL自身bug导致
主从不一致修复方法
-
将从库重新实现
虽然这也是一种解决方法,但是这个方案恢复时间比较慢,而且有时候从库也是承担一部分的查询操作的,不能贸然重建。
-
使用percona-toolkit工具辅助
PT工具包中包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,需要时间去学习,去测试,特别是在生产环境,还是要小心使用关于使用方法,可以参考下面链接:mysql主从一致性校验工具-pt - know_fly - 博客园
-
手动重建不一致的表
在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致这种方案缺点是在执行导入期间需要暂时停止从库复制,不过也是可以接受的