• 作者:老汪软件技巧
  • 发表时间: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

_mysql主从复制原理面试_mysql主从复制的实现需要

查看主数据库状态

登录后,使用以下命令查看主实例的状态,以获取二进制日志的文件名和位置:

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 数据库已经存在,说明主从复制已经成功搭建。