1. 首页 > MySQL教程 > 正文

MySQL教程FG223-MySQL主从复制配置

Part01-基础概念与理论知识

1.1 主从复制配置概述

主从复制配置是实施MySQL高可用的基础,通过正确配置主从复制,可以实现数据的冗余和高可用。风哥教程参考MySQL官方文档Replication部分的相关内容。更多视频教程www.fgedu.net.cn

# 主从复制配置的定义
主从复制配置是指在主库和从库之间建立复制关系,使从库能够复制主库的数据,保持数据一致性的过程。

# 主从复制配置的目标
1. 建立主从复制关系:确保从库能够正确复制主库的数据
2. 配置复制参数:优化复制的性能和可靠性
3. 验证复制状态:确保复制正常运行
4. 监控复制健康:及时发现和处理复制问题

# 主从复制配置的组成部分
1. 主库配置:启用二进制日志,创建复制用户
2. 从库配置:配置服务器ID,启动复制线程
3. 复制连接:从库连接主库,请求二进制日志
4. 复制验证:验证复制是否正常运行

1.2 主从复制配置的重要性

主从复制配置的重要性在于确保数据的冗余和高可用,提高系统的可靠性和可用性。学习交流加群风哥微信: itpux-com

主从复制配置的重要性:1. 数据冗余:通过复制数据,实现数据的冗余存储,防止数据丢失;2. 高可用:当主库故障时,可以切换到从库,保证服务的连续性;3. 负载均衡:将读操作分发到从库,减轻主库的压力;4. 备份:使用从库进行备份,避免备份对主库的影响;5. 地理分布式部署:在不同地理位置部署从库,提高服务的可用性;6. 故障恢复:当主库故障时,可以快速切换到从库,减少停机时间;7. 数据安全:通过复制,提高数据的安全性和可靠性。

1.3 主从复制配置的类型

MySQL主从复制配置有多种类型,包括基于二进制日志的复制、基于GTID的复制、半同步复制和级联复制等。学习交流加群风哥QQ113257174

# 主从复制配置的类型
1. 基于二进制日志的复制:
– 使用二进制日志文件和位置进行复制
– 传统的复制方式,配置简单

2. 基于GTID的复制:
– 使用全局事务标识符(GTID)进行复制
– 简化复制的管理和故障切换

3. 半同步复制:
– 主库等待至少一个从库确认后再提交事务
– 提高数据一致性

4. 级联复制:
– 从库作为其他从库的主库,形成复制链
– 减轻主库的复制压力

5. 多源复制:
– 一个从库可以从多个主库复制数据
– 适用于数据聚合场景

# 复制配置类型比较
| 类型 | 优点 | 缺点 | 适用场景 |
|——|——|——|———-|
| 基于二进制日志的复制 | 配置简单,兼容性好 | 故障切换复杂 | 小型系统,配置简单的场景 |
| 基于GTID的复制 | 故障切换简单,管理方便 | 配置较复杂 | 大型系统,需要频繁故障切换的场景 |
| 半同步复制 | 数据一致性好 | 性能有所下降 | 对数据一致性要求较高的场景 |
| 级联复制 | 减轻主库压力 | 延迟较大 | 从库数量较多的场景 |
| 多源复制 | 集中数据 | 配置复杂,性能压力大 | 数据聚合场景 |

Part02-生产环境规划与建议

2.1 主从复制架构规划

主从复制架构规划是确保复制效果的关键,以下是主从复制架构规划的要点。风哥提示:生产环境中应根据业务需求、数据量和系统资源,规划合理的主从复制架构。

主从复制架构规划:1. 确定复制拓扑:根据从库数量和地理位置,选择合适的复制拓扑,如星型、链式或环形;2. 确定从库数量:根据业务需求和负载情况,确定从库的数量;3. 确定从库用途:根据从库的用途,如备份、读负载分担或灾备,规划不同的复制策略;4. 网络规划:确保主从库之间的网络连接稳定,带宽充足;5. 硬件规划:确保从库的硬件配置满足需求,如CPU、内存和存储;6. 监控规划:配置完善的监控机制,及时发现和处理复制问题。

2.2 主从复制参数规划

主从复制参数规划是确保复制性能和可靠性的关键,以下是主从复制参数规划的要点。更多学习教程公众号风哥教程itpux_com

# 主从复制参数规划
1. 主库参数规划:
– server-id:唯一的服务器ID
– log-bin:启用二进制日志
– binlog-format:二进制日志格式,建议使用ROW格式
– expire-logs-days:二进制日志过期时间
– max-binlog-size:最大二进制日志文件大小
– gtid-mode:是否启用GTID

2. 从库参数规划:
– server-id:唯一的服务器ID
– relay-log:中继日志路径
– relay-log-recovery:中继日志自动恢复
– read-only:从库只读
– slave-parallel-workers:并行复制线程数
– slave-parallel-type:并行复制类型

3. 网络参数规划:
– 网络缓冲区大小:优化网络传输
– 连接超时:设置合理的连接超时时间
– 重试次数:设置合理的重试次数

# 推荐参数配置
# 主库参数
[mysqld]
server-id = 1
log-bin = /mysql/logs/binlog
binlog-format = ROW
expire-logs-days = 7
max-binlog-size = 1G
gtid-mode = ON
enforce-gtid-consistency = ON

# 从库参数
[mysqld]
server-id = 2
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON
slave-parallel-workers = 4
slave-parallel-type = LOGICAL_CLOCK

2.3 主从复制网络规划

主从复制网络规划是确保复制稳定性的关键,以下是主从复制网络规划的要点。from MySQL:www.itpux.com

# 主从复制网络规划
1. 网络拓扑:
– 同一数据中心:主从库位于同一数据中心,网络延迟低
– 跨数据中心:主从库位于不同数据中心,提高可用性
– 混合部署:主库和部分从库位于同一数据中心,其他从库位于不同数据中心

2. 网络带宽:
– 估算复制所需带宽:根据主库的写入量,估算所需的网络带宽
– 预留带宽:预留足够的带宽,确保复制不受网络瓶颈影响

3. 网络延迟:
– 监控网络延迟:定期监控主从库之间的网络延迟
– 优化网络路径:选择最优的网络路径,减少网络延迟

4. 网络冗余:
– 多网络路径:配置多网络路径,确保网络故障时的可用性
– 网络隔离:将管理网络和业务网络分离,提高安全性

# 网络参数优化
# 系统网络参数
# vi /etc/sysctl.conf
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216

# 应用配置
sysctl -p

# MySQL网络参数
[mysqld]
max_connections = 1000
connect_timeout = 10
wait_timeout = 3600

Part03-生产环境项目实施方案

3.1 主从复制配置步骤

主从复制配置步骤是实施主从复制的基础,以下是具体的配置步骤。

# 主从复制配置步骤
# 步骤1:准备环境
# 确保主库和从库的MySQL版本相同
# 确保主库和从库的配置文件正确

# 步骤2:配置主库
# 编辑主库的my.cnf文件
# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = /mysql/logs/binlog
binlog-format = ROW
expire-logs-days = 7
max-binlog-size = 1G

# 重启主库
systemctl restart mysqld

# 创建复制用户
mysql> CREATE USER ‘repl’@’192.168.1.%’ IDENTIFIED BY ‘ReplPassword123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.1.%’;
mysql> FLUSH PRIVILEGES;

# 锁定表并获取主库状态
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+—————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————+———-+————–+——————+——————-+
| binlog.000001 | 123 | | | |
+—————+———-+————–+——————+——————-+

# 步骤3:配置从库
# 编辑从库的my.cnf文件
# vi /etc/my.cnf
[mysqld]
server-id = 2
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON

# 重启从库
systemctl restart mysqld

# 配置从库复制
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’ReplPassword123!’,
-> MASTER_LOG_FILE=’binlog.000001′,
-> MASTER_LOG_POS=123;

# 启动复制
mysql> START SLAVE;

# 步骤4:验证复制状态
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 123
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 123
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
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:
Skip_Counter: 0
Exec_Master_Log_Pos: 123
Relay_Log_Space: 123
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 12345678-1234-1234-1234-1234567890ab
Master_Info_File: /mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:

# 步骤5:解锁主库
mysql> UNLOCK TABLES;

# 步骤6:测试复制
# 在主库上创建数据库和表
mysql> CREATE DATABASE test_db;
mysql> USE test_db;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
mysql> INSERT INTO test_table (data) VALUES (‘test data’);

# 在从库上验证复制
mysql> SHOW DATABASES;
mysql> USE test_db;
mysql> SELECT * FROM test_table;
+—-+———-+
| id | data |
+—-+———-+
| 1 | test data |
+—-+———-+

3.2 主从复制参数配置

主从复制参数配置是确保复制性能和可靠性的关键,以下是具体的参数配置。

# 主从复制参数配置
# 主库参数配置
[mysqld]
# 服务器ID,必须唯一
server-id = 1

# 启用二进制日志
log-bin = /mysql/logs/binlog

# 二进制日志格式,建议使用ROW格式
binlog-format = ROW

# 二进制日志过期时间,单位天
expire-logs-days = 7

# 最大二进制日志文件大小
max-binlog-size = 1G

# 启用GTID
gtid-mode = ON
enforce-gtid-consistency = ON

# 二进制日志缓存大小
binlog_cache_size = 32M

# 同步二进制日志到磁盘的频率
sync_binlog = 1

# 从库参数配置
[mysqld]
# 服务器ID,必须唯一
server-id = 2

# 启用中继日志
relay-log = /mysql/logs/relay-bin

# 中继日志索引文件
relay-log-index = /mysql/logs/relay-bin.index

# 中继日志自动恢复
relay-log-recovery = ON

# 从库只读
read-only = ON

# 并行复制线程数
slave-parallel-workers = 4

# 并行复制类型
slave-parallel-type = LOGICAL_CLOCK

# 复制延迟
# sql_slave_skip_counter = 1

# 网络参数配置
# 系统网络参数
# vi /etc/sysctl.conf
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216

# 应用配置
sysctl -p

# MySQL网络参数
[mysqld]
max_connections = 1000
connect_timeout = 10
wait_timeout = 3600

3.3 主从复制验证方法

主从复制验证方法是确保复制正常运行的关键,以下是具体的验证方法。

# 主从复制验证方法
# 方法1:查看从库状态
mysql> SHOW SLAVE STATUS\G

# 关键状态值
# Slave_IO_Running: Yes – IO线程正常运行
# Slave_SQL_Running: Yes – SQL线程正常运行
# Seconds_Behind_Master: 0 – 复制延迟为0

# 方法2:测试数据同步
# 在主库上执行写操作
mysql> CREATE DATABASE test_replication;
mysql> USE test_replication;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
mysql> INSERT INTO test_table (data) VALUES (‘test data’);

# 在从库上验证
mysql> SHOW DATABASES;
mysql> USE test_replication;
mysql> SELECT * FROM test_table;
+—-+———-+
| id | data |
+—-+———-+
| 1 | test data |
+—-+———-+

# 方法3:检查复制延迟
mysql> SHOW SLAVE STATUS\G | grep Seconds_Behind_Master

# 方法4:检查二进制日志和中继日志
# 检查主库的二进制日志
mysql> SHOW BINARY LOGS;

# 检查从库的中继日志
ls -l /mysql/logs/relay-bin.*

# 方法5:使用MySQL工具验证
# 安装MySQL Utilities
yum install -y mysql-utilities

# 验证复制状态
mysqlreplicate –master=repl:ReplPassword123!@192.168.1.100:3306 –slave=repl:ReplPassword123!@192.168.1.101:3306

# 方法6:监控复制状态
# 使用Prometheus和Grafana监控复制状态
# 配置MySQL Exporter
# 导入MySQL监控面板

Part04-生产案例与实战讲解

4.1 基于二进制日志的主从复制配置

基于二进制日志的主从复制是最传统的复制方式,配置简单,适用于小型系统,以下是具体的配置案例。

# 基于二进制日志的主从复制配置
# 步骤1:配置主库
# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = /mysql/logs/binlog
binlog-format = ROW
expire-logs-days = 7
max-binlog-size = 1G

# 重启主库
systemctl restart mysqld

# 创建复制用户
mysql> CREATE USER ‘repl’@’192.168.1.%’ IDENTIFIED BY ‘ReplPassword123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.1.%’;
mysql> FLUSH PRIVILEGES;

# 锁定表并获取主库状态
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+—————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————+———-+————–+——————+——————-+
| binlog.000001 | 123 | | | |
+—————+———-+————–+——————+——————-+

# 步骤2:配置从库
# vi /etc/my.cnf
[mysqld]
server-id = 2
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON

# 重启从库
systemctl restart mysqld

# 配置从库复制
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’ReplPassword123!’,
-> MASTER_LOG_FILE=’binlog.000001′,
-> MASTER_LOG_POS=123;

# 启动复制
mysql> START SLAVE;

# 步骤3:验证复制状态
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 123
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 123
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
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:
Skip_Counter: 0
Exec_Master_Log_Pos: 123
Relay_Log_Space: 123
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 12345678-1234-1234-1234-1234567890ab
Master_Info_File: /mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:

# 步骤4:测试复制
# 在主库上执行写操作
mysql> CREATE DATABASE test_binlog;
mysql> USE test_binlog;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
mysql> INSERT INTO test_table (data) VALUES (‘test binlog replication’);

# 在从库上验证
mysql> SHOW DATABASES;
mysql> USE test_binlog;
mysql> SELECT * FROM test_table;
+—-+————————-+
| id | data |
+—-+————————-+
| 1 | test binlog replication |
+—-+————————-+

4.2 基于GTID的主从复制配置

基于GTID的主从复制使用全局事务标识符,简化复制的管理和故障切换,适用于大型系统,以下是具体的配置案例。

# 基于GTID的主从复制配置
# 步骤1:配置主库
# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = /mysql/logs/binlog
binlog-format = ROW
expire-logs-days = 7
max-binlog-size = 1G
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON

# 重启主库
systemctl restart mysqld

# 创建复制用户
mysql> CREATE USER ‘repl’@’192.168.1.%’ IDENTIFIED BY ‘ReplPassword123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.1.%’;
mysql> FLUSH PRIVILEGES;

# 步骤2:配置从库
# vi /etc/my.cnf
[mysqld]
server-id = 2
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON
gtid-mode = ON
enforce-gtid-consistency = ON

# 重启从库
systemctl restart mysqld

# 配置从库复制(使用GTID)
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’ReplPassword123!’,
-> MASTER_AUTO_POSITION=1;

# 启动复制
mysql> START SLAVE;

# 步骤3:验证复制状态
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000001
Read_Master_Log_Pos: 123
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 123
Relay_Master_Log_File: binlog.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
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:
Skip_Counter: 0
Exec_Master_Log_Pos: 123
Relay_Log_Space: 123
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 12345678-1234-1234-1234-1234567890ab
Master_Info_File: /mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 12345678-1234-1234-1234-1234567890ab:1-10
Executed_Gtid_Set: 12345678-1234-1234-1234-1234567890ab:1-10
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:

# 步骤4:测试复制
# 在主库上执行写操作
mysql> CREATE DATABASE test_gtid;
mysql> USE test_gtid;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
mysql> INSERT INTO test_table (data) VALUES (‘test GTID replication’);

# 在从库上验证
mysql> SHOW DATABASES;
mysql> USE test_gtid;
mysql> SELECT * FROM test_table;
+—-+————————+
| id | data |
+—-+————————+
| 1 | test GTID replication |
+—-+————————+

4.3 半同步复制配置

半同步复制可以提高数据一致性,适用于对数据一致性要求较高的场景,以下是具体的配置案例。

# 半同步复制配置
# 步骤1:安装半同步复制插件
# 在主库和从库上安装半同步复制插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

# 步骤2:配置主库
# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = /mysql/logs/binlog
binlog-format = ROW
expire-logs-days = 7
max-binlog-size = 1G

# 半同步复制配置
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 10000 # 10秒

# 重启主库
systemctl restart mysqld

# 创建复制用户
mysql> CREATE USER ‘repl’@’192.168.1.%’ IDENTIFIED BY ‘ReplPassword123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.1.%’;
mysql> FLUSH PRIVILEGES;

# 步骤3:配置从库
# vi /etc/my.cnf
[mysqld]
server-id = 2
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON

# 半同步复制配置
rpl_semi_sync_slave_enabled = 1

# 重启从库
systemctl restart mysqld

# 配置从库复制
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’ReplPassword123!’,
-> MASTER_LOG_FILE=’binlog.000001′,
-> MASTER_LOG_POS=123;

# 启动复制
mysql> START SLAVE;

# 步骤4:验证半同步复制状态
# 在主库上查看半同步复制状态
mysql> SHOW GLOBAL STATUS LIKE ‘Rpl_semi_sync_master%’;
+—————————————+——-+
| Variable_name | Value |
+—————————————+——-+
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+—————————————+——-+

# 在从库上查看半同步复制状态
mysql> SHOW GLOBAL STATUS LIKE ‘Rpl_semi_sync_slave%’;
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| Rpl_semi_sync_slave_status | ON |
+—————————-+——-+

# 步骤5:测试半同步复制
# 在主库上执行写操作
mysql> CREATE DATABASE test_semisync;
mysql> USE test_semisync;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
mysql> INSERT INTO test_table (data) VALUES (‘test semi-sync replication’);

# 在从库上验证
mysql> SHOW DATABASES;
mysql> USE test_semisync;
mysql> SELECT * FROM test_table;
+—-+——————————+
| id | data |
+—-+——————————+
| 1 | test semi-sync replication |
+—-+——————————+

4.4 级联复制配置

级联复制可以减轻主库的复制压力,适用于从库数量较多的场景,以下是具体的配置案例。

# 级联复制配置
# 架构:主库 -> 从库1 -> 从库2

# 步骤1:配置主库
# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = /mysql/logs/binlog
binlog-format = ROW
expire-logs-days = 7
max-binlog-size = 1G

# 重启主库
systemctl restart mysqld

# 创建复制用户
mysql> CREATE USER ‘repl’@’192.168.1.%’ IDENTIFIED BY ‘ReplPassword123!’;
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.1.%’;
mysql> FLUSH PRIVILEGES;

# 步骤2:配置从库1(作为中间节点)
# vi /etc/my.cnf
[mysqld]
server-id = 2
log-bin = /mysql/logs/binlog # 启用二进制日志,作为其他从库的主库
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON
log-slave-updates = ON # 允许从库将复制的事务记录到二进制日志

# 重启从库1
systemctl restart mysqld

# 配置从库1复制主库
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.100′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’ReplPassword123!’,
-> MASTER_LOG_FILE=’binlog.000001′,
-> MASTER_LOG_POS=123;

# 启动复制
mysql> START SLAVE;

# 步骤3:配置从库2
# vi /etc/my.cnf
[mysqld]
server-id = 3
relay-log = /mysql/logs/relay-bin
relay-log-recovery = ON
read-only = ON

# 重启从库2
systemctl restart mysqld

# 获取从库1的二进制日志状态
mysql> SHOW MASTER STATUS;
+—————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————+———-+————–+——————+——————-+
| binlog.000001 | 456 | | | |
+—————+———-+————–+——————+——————-+

# 配置从库2复制从库1
mysql> CHANGE MASTER TO
-> MASTER_HOST=’192.168.1.101′,
-> MASTER_USER=’repl’,
-> MASTER_PASSWORD=’ReplPassword123!’,
-> MASTER_LOG_FILE=’binlog.000001′,
-> MASTER_LOG_POS=456;

# 启动复制
mysql> START SLAVE;

# 步骤4:验证级联复制状态
# 查看从库1的复制状态
mysql> SHOW SLAVE STATUS\G

# 查看从库2的复制状态
mysql> SHOW SLAVE STATUS\G

# 步骤5:测试级联复制
# 在主库上执行写操作
mysql> CREATE DATABASE test_cascade;
mysql> USE test_cascade;
mysql> CREATE TABLE test_table (id INT PRIMARY KEY AUTO_INCREMENT, data VARCHAR(100));
mysql> INSERT INTO test_table (data) VALUES (‘test cascade replication’);

# 在从库1上验证
mysql> SHOW DATABASES;
mysql> USE test_cascade;
mysql> SELECT * FROM test_table;
+—-+—————————–+
| id | data |
+—-+—————————–+
| 1 | test cascade replication |
+—-+—————————–+

# 在从库2上验证
mysql> SHOW DATABASES;
mysql> USE test_cascade;
mysql> SELECT * FROM test_table;
+—-+—————————–+
| id | data |
+—-+—————————–+
| 1 | test cascade replication |
+—-+—————————–+

Part05-风哥经验总结与分享

通过多年的MySQL数据库管理经验,我总结了以下关于MySQL主从复制配置的关键点:

风哥提示:MySQL主从复制配置是实现高可用和负载均衡的基础,需要正确配置和定期维护。

1. 配置前准备:确保主库和从库的MySQL版本相同,配置文件正确,网络连接稳定。

2. 参数配置:合理配置主从复制的参数,如二进制日志格式、并行复制线程数等,提高复制的性能和可靠性。

3. 复制类型选择:根据业务需求和数据一致性要求,选择合适的复制类型,如基于二进制日志的复制、基于GTID的复制或半同步复制。

4. 验证与监控:配置完善的验证和监控机制,及时发现和处理复制问题,确保复制的正常运行。

5. 故障处理:熟悉常见的复制故障及处理方法,能够快速恢复复制,确保数据的一致性。

6. 性能优化:通过网络优化、硬件优化和参数优化,提高复制的性能和可靠性。

7. 定期维护:定期检查复制状态,清理过期的二进制日志,确保复制的健康运行。

生产环境最佳实践:1. 确保主库和从库的MySQL版本相同,避免版本兼容性问题;2. 合理配置主从复制的参数,提高复制的性能和可靠性;3. 根据业务需求和数据一致性要求,选择合适的复制类型;4. 配置完善的验证和监控机制,及时发现和处理复制问题;5. 熟悉常见的复制故障及处理方法,能够快速恢复复制;6. 通过网络优化、硬件优化和参数优化,提高复制的性能;7. 定期检查复制状态,清理过期的二进制日志;8. 建立复制配置文档,确保相关人员熟悉配置步骤和参数;9. 培训相关人员,提高复制管理的技能;10. 持续改进复制配置,适应业务发展和技术变化。

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息