- 作者:老汪软件技巧
- 发表时间:2024-10-13 04:01
- 浏览量:
引言
在现代数据库管理中,数据的高可用性和负载均衡是至关重要的。MySQL 的主从复制功能提供了一种有效的解决方案,可以通过将数据从一个主服务器复制到一个或多个从服务器,来实现数据的备份、读取负载分担和高可用性。本篇文章将深入探讨 MySQL 主从复制的原理、配置步骤以及实际应用场景。
一、主从复制原理
MySQL 的主从复制是基于事件的复制机制,主要包含以下几个关键概念:
主服务器(Master) :
从服务器(Slave) :
二进制日志(binlog) :
复制线程:
主实例搭建
使用以下命令启动 MySQL 主实例:
docker run -p 3307:3306 --name mysql-master \
-v /docker/mysql-master/log:/var/log/mysql \
-v /docker/mysql-master/data:/var/lib/mysql \
-v /docker/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
参数说明:
创建配置文件 f
在 /docker/mysql-master/conf/ 目录下创建 f 文件,并添加以下配置内容:
[mysqld]
## 设置 server_id,同一局域网中需要唯一
server_id = 1
## 指定不需要同步的数据库名称
binlog-ignore-db = mysql
## 开启二进制日志功能
log_bin = /var/log/mysql/mysql-bin.log
## 设置二进制日志使用内存大小(事务)
binlog_cache_size = 1M
## 设置使用的二进制日志格式(mixed, statement, row)
binlog_format = mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days = 7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断
## 1062 错误为主键重复,1032 错误为主从数据库数据不一致
slave_skip_errors = 1062
配置说明:
配置完成后重启 MySQL 主实例
使用以下命令重启 mysql-master 容器,使新配置生效:
docker restart mysql-master
进入 mysql-master 容器
重启后,可以使用以下命令进入正在运行的 mysql-master 容器:
docker exec -it mysql-master bash
登录到 MySQL 客户端
进入容器后,使用以下命令以 root 用户身份登录 MySQL:
mysql -u root -p123456
创建数据同步用户
在 MySQL 控制台中,创建一个用于数据同步的专用用户,确保该用户具备 REPLICATION SLAVE 权限。执行以下 SQL 命令:
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
具体示例
比如,我们创建一个名为 slave 的同步用户,密码为 123456,用于从实例同步数据:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
配置完成后,slave 用户即可用于从实例的数据同步连接,接下来可以继续配置从实例。
从实例搭建
使用以下命令启动 MySQL 从实例:
docker run -p 3308:3306 --name mysql-slave \
-v /docker/mysql-slave/log:/var/log/mysql \
-v /docker/mysql-slave/data:/var/lib/mysql \
-v /docker/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
创建配置文件 f
在 /docker/mysql-slave/conf/ 目录下创建 f 文件,并添加以下配置内容:
[mysqld]
## 设置 server_id,与主服务器不同
server_id = 2
## 设置中继日志路径
relay_log = /var/log/mysql/mysql-relay-bin.log
## 指定不需要同步的数据库名称
binlog-ignore-db = mysql
## 二进制日志设置(如果需要从服务器充当主服务器进行多级复制)
log_bin = /var/log/mysql/mysql-slave-bin.log
## 设置二进制日志使用内存大小(事务)
binlog_cache_size = 1M
## 设置二进制日志格式
binlog_format = mixed
## 二进制日志过期清理时间
expire_logs_days = 7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断
## 1062 错误为主键重复,1032 错误为主从数据库数据不一致
slave_skip_errors = 1062
配置说明:
重启从实例容器
完成配置文件设置后,使用以下命令重启 mysql-slave 容器以使更改生效:
docker restart mysql-slave
主从数据库连接
登录主实例 MySQL 客户端并查看主数据库状态
首先,通过以下命令进入 mysql-master 容器并登录 MySQL 客户端:
docker exec -it mysql-master bash
mysql -u root -p123456
查看主数据库状态
登录后,使用以下命令查看主实例的状态,以获取二进制日志的文件名和位置:
SHOW MASTER STATUS;
主数据库的状态如下:
记下 File 和 Position 字段的值(例如 mysql-bin.000001 和 749),稍后将用于配置从实例连接到主实例。
进入从实例容器
使用以下命令进入 mysql-slave 容器:
docker exec -it mysql-slave bash
登录从实例的 MySQL 客户端
在 mysql-slave 容器中,使用以下命令登录 MySQL 客户端:
mysql -u root -p123456
配置主从复制
登录 MySQL 后,使用以下命令配置从实例连接到主实例。请将 MASTER_HOST、MASTER_PORT、MASTER_USER、MASTER_PASSWORD、MASTER_LOG_FILE 和 MASTER_LOG_POS 的值替换为实际的主实例 IP 地址、端口号、同步用户及其密码,以及在主实例中通过 SHOW MASTER STATUS 命令获取的 File 和 Position 值。包含所有必要的选项:
CHANGE MASTER TO
MASTER_HOST='主实例IP地址',
MASTER_PORT=3306,
MASTER_USER='replica_user',
MASTER_PASSWORD='replica_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
参数说明:
示例配置
我们按照上面配置的主实例参数来配置主从复制,示例如下:
CHANGE MASTER TO
MASTER_HOST='172.17.0.10',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=749,
MASTER_CONNECT_RETRY=30;
在此示例中:
验证复制状态
使用以下命令查看复制状态,确保配置成功:
SHOW SLAVE STATUS\G;
在输出中,确认 Slave_IO_Running 和 Slave_SQL_Running 的值为 No,表示主从复制还没开始工作。
启动从实例的复制进程
运行以下命令启动从实例的复制进程:
START SLAVE;
查看同步状态
运行 SHOW SLAVE STATUS\G;,查看从数据库状态,确认已经同步:
如果 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes,则表示主从复制成功。
测试主从复制是否已成功搭建
登录主实例数据库并创建一个测试数据库
首先,进入 mysql-master 容器并登录 MySQL:
docker exec -it mysql-master bash
mysql -u root -p123456
然后在主实例中创建一个测试数据库:
CREATE DATABASE test_replication;
创建完成后,您应该会看到如下输出,表示数据库已成功创建:
登录从实例数据库并检查是否已同步该数据库
接下来,进入 mysql-slave 容器并登录 MySQL:
docker exec -it mysql-slave bash
mysql -u root -p123456
在从实例中检查是否已同步 test_replication 数据库:
SHOW DATABASES;
在从实例中看到 test_replication 数据库已经存在,说明主从复制已经成功搭建。