mysql主从同步 读写分离

设置 MySQL 主从复制的详细步骤
假设您有两个服务器:

主服务器 IP: 192.168.1.10

从服务器 IP: 192.168.1.11

第一部分:主服务器 (Master) 配置
修改 MySQL 配置文件
编辑主服务器上的 my.cnf (通常是 /etc/my.cnf 或 /etc/mysql/my.cnf)。

ini
[mysqld]
# 服务器唯一ID,在整个复制集群中必须唯一
server-id = 1
# 启用二进制日志,并指定日志文件名前缀
log_bin = mysql-bin
# 可选:指定需要复制的数据库(多个则写多行),不指定则复制所有库
binlog_do_db = your_database_name
# 可选:为了数据一致性,推荐使用行格式
binlog_format = ROW
重启 MySQL 服务
让配置生效。

bash
sudo systemctl restart mysql
# 或者
sudo systemctl restart mysqld
创建用于复制的用户
登录主服务器的 MySQL,创建一个专门用于从服务器连接和复制的用户。

sql
mysql -u root -p

-- 创建用户 ‘repl',并允许从 ‘192.168.1.11’ 登录,密码为 ‘SlavePass123!’
CREATE USER 'repl'@'192.168.1.11' IDENTIFIED BY 'SlavePass123!';

-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.11';

-- 刷新权限
FLUSH PRIVILEGES;
锁定数据库并获取主节点状态
为了防止数据发生变化,先锁定。

sql
-- 锁定表,禁止写操作
FLUSH TABLES WITH READ LOCK;

-- 查看主节点状态,记录下 File 和 Position 的值,从服务器配置时需要
SHOW MASTER STATUS;
输出会类似于:

text
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | your_database_name |                  |
+------------------+----------+--------------+------------------+
记下 File (mysql-bin.000001) 和 Position (107)。

备份并导出数据
如果主服务器上已有数据,需要先导出一份给从服务器。

bash
# 在命令行执行,导出 your_database_name 数据库
mysqldump -u root -p your_database_name > master_dump.sql
解锁主数据库
数据导出后,即可解锁。

sql
UNLOCK TABLES;
第二部分:从服务器 (Slave) 配置
导入数据
将主服务器的备份文件拷贝到从服务器,并导入。

bash
# 在从服务器上执行
mysql -u root -p your_database_name < master_dump.sql
修改 MySQL 配置文件
编辑从服务器上的 my.cnf。

ini
[mysqld]
# 服务器唯一ID,必须与主服务器和其他从服务器不同
server-id = 2
# 可选:启用中继日志
relay-log = mysql-relay-bin
# 可选:允许从服务器将其重放的中继日志记录到自己的二进制日志中,用于链式复制
log_bin = mysql-bin
# 可选:指定需要复制的数据库
replicate_do_db = your_database_name
重启 MySQL 服务

bash
sudo systemctl restart mysql
配置复制链路
登录从服务器的 MySQL,告诉它主服务器是谁,以及从哪里开始复制。

sql
mysql -u root -p

STOP SLAVE; -- 先停止 Slave 进程

CHANGE MASTER TO
MASTER_HOST='192.168.1.10',      -- 主服务器 IP
MASTER_USER='repl',              -- 复制用户
MASTER_PASSWORD='SlavePass123!', -- 复制用户密码
MASTER_LOG_FILE='mysql-bin.000001', -- 第4步记录的 File
MASTER_LOG_POS=107;              -- 第4步记录的 Position
启动复制并检查状态

sql
-- 启动 Slave 进程
START SLAVE;

-- 查看 Slave 状态
SHOW SLAVE STATUS\G
第三部分:验证复制
在 SHOW SLAVE STATUS\G 的输出中,检查以下两个关键字段:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果这两个值都是 Yes,说明复制正在正常运行。

最终测试:

在主服务器的 your_database_name 中创建一个新表或插入一条新记录。

在从服务器上查询,检查变化是否已经同步过来。

其他复制拓扑
链式复制 (A -> B -> C):可以减轻主服务器的压力。

主主复制:两个服务器互为主从,都可以接受写操作。需要特别小心自增主键冲突等问题,配置更复杂。

多源复制:一个从服务器可以从多个主服务器复制数据。

注意事项
版本兼容性:主从服务器的 MySQL 大版本最好一致,从节点版本可以高于主节点,反之则不推荐。

网络:确保主从节点之间的网络通畅,防火墙开放了 MySQL 端口(默认3306)。

数据一致性:在设置复制前,确保主从服务器的初始数据是一致的。

监控:定期检查 SHOW SLAVE STATUS 来监控复制状态,处理可能出现的错误。

这个流程涵盖了搭建 MySQL 跨节点复制库的核心步骤。根据您的具体需求和环境,细节可能会略有不同。

 

posted @ 2025-11-06 14:06  cidgur  阅读(7)  评论(0)    收藏  举报