【数据库管理】MySQL主从复制详解
1. 数据库主从复制
1.1 主从复制概念
数据库主从复制 是一种数据复制技术,它将一个数据库服务器(主库,Master)的数据自动同步到一个或多个其他数据库服务器(从库,Slave/Replica)。
- 主库:负责处理所有写操作(
INSERT,UPDATE,DELETE)。它是数据的唯一权威来源。 - 从库:通常负责处理读操作(
SELECT)。它通过复制机制从主库获取数据,保持与主库一致。
核心目标:通过数据冗余,实现读写分离,从而提升系统的性能、可用性和可靠性。
- 主库记录二进制日志:主库在执行完写操作后,会将数据的变更事件(而非数据页本身)记录到其二进制日志 中。
- 从库拉取中继日志:从库的 I/O线程 会与主库建立连接,并读取主库的二进制日志,然后将这些日志事件写入到从库本地的中继日志 中。
- 从库重放中继日志:从库的 SQL线程 会读取中继日志中的事件,并在从库上重新执行这些SQL语句,从而使从库的数据与主库保持一致。
1.2 功能
- 读写分离
- 场景:绝大多数应用都是“读多写少”。
- 好处:将大量的读请求分流到多个从库上,极大地减轻了主库的负载,提升了整个系统的查询吞吐量和并发处理能力。
- 数据备份与灾难恢复
- 场景:需要数据容灾备份。
- 好处:从库就是一个实时、在线的逻辑备份。当主库发生故障(如硬盘损坏)时,可以快速将一个从库提升为新的主库,实现快速故障恢复,保证服务高可用。
- 数据分析与报表
- 场景:需要运行复杂的统计报表或大数据分析任务。
- 好处:这些任务通常非常消耗资源。可以在一个专用的从库上执行,避免对线上主库的业务造成性能冲击。
1.3 主从服务器配置
1.3.1 master服务器配置
环境准备:
虚拟机服务环境
Master服务器:192.168.65.131 mysql5.7
slave1服务器:192.168.65.128 mysql5.7
Slave2服务器:192.168.65.133 mysql5.7
① 安装ntp、修改配置文件
# 安装ntp软件
yum -y install ntpdate ntp
# 时间同步
ntpdate ntp.aliyun.com
② 开启NTP服务、关闭防火墙和增强性安全功能
systemctl start ntpd
systemctl stop firewalld.service
setenforce 0
1.3.2 两台SLAVE服务器配置
① 安装ntp、ntpdate服务
yum install -y ntp ntpdate
ntpdate ntp.aliyun.com
1.3.3 配置主从同步
① master服务器修改配置文件
vi /etc/my.cnf
# 在mysqld模块下修改一下内容
# 开启二进制日志文件(之后生成的日志名为master-bin)
log_bin=master-bin
# 开启从服务器日志同步
log_slave-updates=true
# 主服务器id为1(不可重复)
server_id = 1# 重启服务
systemctl restart mysqld# 配置规则
mysql -uroot -pmysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.65.%' IDENTIFIED BY '123456';# 刷新权限表
mysql> flush privileges;# 规则解析:GRANT REPLICATION SLAVE ON *.* TO ‘myslave’@‘192.168.65.%’ IDENTIFIED BY ‘123456’;
# 给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456# 查看master数据库状态
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 412 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)mysql>
#以上可见产生了master-bin.000001日志文件,定位为412
#从服务器需要定位到此处进行复制
② 从服务器配置 192.168.65.133 192.168.65.128 设置都是一样的
vi /etc/my.cnf
#开启二进制日志文件
log-bin=master-bin
#设置server id为22,slave2 为23
server_id = 22
#从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin
#定义relay-log的位置和名称(index索引)
relay-log-index=slave-relay-bin.index# 开启从服务器功能
mysql -uroot -p
# slave01
mysql> change master to master_host='192.168.10.16',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=412;# slave02
change master to master_host='192.168.10.16',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=603;mysql> start slave;
Query OK, 0 rows affected (0.01 sec)# 查看从服务器状态
mysql> show slave status\G;
1.3.4 测试数据同步
① 在主服务器上创建一个数据库
mysql> create database work;
mysql> show databases;
②在两台从服务器上直接查看数据库列表
mysql> show databases;


