wb.ouyang

毕竟几人真得鹿,不知终日梦为鱼

导航

MySQL主从复制配置

本次测试使用VirtualBox+centos7.9+mysql8.0.42,两台虚拟机,主机192.168.1.100,从机192.168.200。从机是通过复制主机生成,故从机启动后首先修改本机ip,然后修改mysql实例的uuid。

find / -name auto.cnf 修改从机mysql的uuid。

1、MySQL主从复制实现原理

image

 2、配置示例(简化版):

-- 主库 my.cnf
server-id=1
-- log-bin=mysql-bin
-- 创建复制用户 CREATE USER 'repl'@'从库IP' IDENTIFIED BY 'pwd'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从库IP'; FLUSH PRIVILEGES; SHOW MASTER STATUS;
-- 从库 my.cnf server-id=2 -- relay-log=relay-log-bin
-- 配置主从关系 CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='repl', MASTER_PASSWORD='pwd', MASTER_LOG_FILE='记录的File', MASTER_LOG_POS=记录的Position;
START SLAVE; SHOW SLAVE STATUS\G;

当Slave_IO_Running和Slave_SQL_Running均为Yes时,表示复制成功。
应用场景:
读写分离:主库处理写请求,从库分担读请求,提升并发能力。
高可用与容灾:主库故障时可快速切换到从库。
备份与延迟复制:防止误操作导致数据不可恢复。
这种机制在高并发和高可用架构中非常关键,但需根据业务在性能与一致性之间权衡选择复制模式。

 2.1、配置过程

主库

 从库

 

2.2、解决SHOW SLAVE STATUS的报错

报错一:Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection

通常是由于 MySQL 8.0 默认的 caching_sha2_password 插件需要安全连接,而当前连接未满足安全要求。

方法一:修改用户认证插件为 mysql_native_password
将用户的认证方式从 caching_sha2_password 修改为 mysql_native_password。
示例:

ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';

方法二:启用 get_master_public_key
在从库配置中添加 get_master_public_key=1 参数,请求主库的 RSA 公钥以支持加密。
示例:

CHANGE MASTER TO
   MASTER_HOST='host',
   MASTER_USER='username',
   MASTER_PASSWORD='password',
   MASTER_LOG_FILE='mysql-bin.000001',
   MASTER_LOG_POS=120,
   GET_MASTER_PUBLIC_KEY=1;

报错二:The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

解决:找到auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可。 

 

3、docker配置示例

3.1. 配置主库

启动主库并开启二进制日志:

docker run -d \
 --name mysql-master \
 -p 3306:3306 \
 -e MYSQL_ROOT_PASSWORD=123456 \
 -v /opt/mysql-master/conf:/etc/mysql/conf.d \
 -v /opt/mysql-master/data:/var/lib/mysql \
 mysql:8.0

创建配置文件 /opt/mysql-master/conf/my.cnf:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=testdb

重启容器以使配置生效:

docker restart mysql-master

创建复制用户:

CREATE USER 'repl'@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

记录 File 和 Position,例如:mysql-bin.000001 和 154。

3.2. 配置从库

启动从库容器:

docker run -d \
 --name mysql-slave1 \
 -p 3307:3306 \
 -e MYSQL_ROOT_PASSWORD=123456 \
 -v /opt/mysql-slave1/conf:/etc/mysql/conf.d \
 -v /opt/mysql-slave1/data:/var/lib/mysql \
 mysql:8.0

创建配置文件 /opt/mysql-slave1/conf/my.cnf:

[mysqld]
server-id=2
relay-log=relay-log
read-only=1

重启容器:

docker restart mysql-slave1

3.3. 设置主从连接

进入从库容器并配置主库信息:

docker exec -it mysql-slave1 bash
mysql -uroot -p123456
CHANGE MASTER
TO MASTER_HOST='主库IP', MASTER_USER='repl', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
START SLAVE; SHOW SLAVE STATUS\G;

确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes。

3.4. 测试同步效果

在主库创建测试数据:

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE t_user (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO t_user VALUES (1, 'TestUser');

在从库验证数据是否同步:

SELECT * FROM testdb.t_user;

如果数据一致,说明主从复制配置成功。


最佳实践与注意事项
防止延迟:优化 SQL 查询,避免慢查询和大事务。
网络优化:确保主从服务器之间的网络稳定性。
监控状态:定期检查 SHOW SLAVE STATUS\G,确保复制正常运行。
通过以上步骤,您可以成功搭建 MySQL 主从复制环境,实现高效的数据同步与管理。

 

posted on 2025-12-22 22:39  wenbin_ouyang  阅读(0)  评论(0)    收藏  举报