MySQL主从复制配置与原理
MySQL主从复制是一种实现数据冗余和读写分离的技术,通过将主数据库的数据变更同步到从数据库,可以提高系统的可用性和性能。
一、主从复制工作机制
主服务器会将所有的数据修改操作记录在其二进制日志文件(例如 mysql-bin.xxx)中。从服务器上的 I/O 线程会连接到主服务器,并使用指定的账户下载这些二进制日志。下载的内容会被写入从服务器本地的中继日志(relay-log)文件中。随后,从服务器上的 SQL 线程会读取中继日志,并执行其中的 SQL 语句,从而实现数据同步。
二、主从复制的目的
- 提高系统可用性: 当主服务器发生故障时,可以将从服务器提升为主服务器,减少服务中断时间。
- 提升读性能: 将读请求分发到从服务器,可以减轻主服务器的压力,并可能获得更快的响应时间。
三、主从复制的主要作用
- 作为数据备份的一种手段,类似于热备份。
- 实现读写分离,平衡数据库的负载。
四、环境准备
假设主从服务器的 IP 地址如下:
- 主服务器:192.168.1.35 (已安装 MySQL)
- 从服务器:192.168.1.36 (已安装 MySQL)
五、配置步骤
1. 主从服务器配置文件修改
编辑主从服务器的 /etc/my.cnf 文件:
# 主服务器配置
[mysqld]
log-bin=mysql-bin # 启用二进制日志
server-id=35 # 服务器唯一ID,通常取IP的最后一段
# 从服务器配置
[mysqld]
log-bin=mysql-bin # 启用二进制日志
server-id=36 # 服务器唯一ID,通常取IP的最后一段
修改完成后,需要重启主从服务器的 MySQL 服务:
# 在主从服务器上执行
/etc/init.d/mysqld restart
六、主服务器操作
1. 创建同步用户并授权
在主服务器上执行以下 MySQL 命令:
-- 登录 MySQL
mysql -uroot -p
-- 创建用于复制的用户并授权
-- 替换 '123456' 为您期望的密码
grant replication slave on *.* to 'repl_user'@'192.168.1.36' identified by '123456';
flush privileges;
exit;
2. 获取主库状态信息
在主服务器上执行以下命令,记录下 File 和 Position 的值,这些信息在配置从服务器时需要用到:
mysql -uroot -p
show master status;
-- 示例输出:
-- +------------------+----------+--------------+------------------+-------------------+
-- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
-- +------------------+----------+--------------+------------------+-------------------+
-- | mysql-bin.000002 | 550 | | | |
-- +------------------+----------+--------------+------------------+-------------------+
七、从服务器操作
1. 配置主库连接信息并启动复制
在从服务器上执行以下 MySQL 命令,替换相应的主库信息和记录下的日志文件及位置:
-- 登录 MySQL
mysql -uroot -p
-- 配置主库信息
-- 'repl_user' 和 '123456' 需与主服务器上创建的用户和密码一致
-- 'mysql-bin.000002' 和 550 需替换为从主服务器获取的值
change master to
master_host='192.168.1.35',
master_user='repl_user',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=550;
-- 启动 Slave 线程
start slave;
exit;
2. 检查复制状态
在从服务器上执行以下命令,检查主从复制是否正常运行:
mysql -uroot -p
show slave status\G
检查输出结果中的 Slave_IO_Running 和 Slave_SQL_Running 状态。两者都应显示为 Yes。Seconds_Behind_Master 应尽量接近 0。
如果出现错误,请仔细检查日志和配置。例如,以下是正常状态的部分输出:
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0
...
八、处理已有数据的主从复制
如果主服务器已有数据,在配置主从复制时,需要确保数据的一致性:
- 主服务器锁定表: 在主服务器上执行
flush tables with read lock;以阻止新的写入操作。 - 获取主库状态: 再次执行
show master status;,记录下当前的File和Position。 - 数据迁移: 将主服务器的数据文件(建议先使用
tar压缩)备份并迁移到从服务器。 - 主服务器解锁: 在主服务器上执行
unlock tables;。 - 从服务器配置: 按照前面的步骤配置从服务器,使用记录下的主库状态信息。
九、验证主从复制
在主服务器上执行数据操作,然后检查从服务器是否同步了这些变更:
1. 主服务器上的测试操作
-- 在主服务器上创建数据库和表
mysql -uroot -p
mysql> create database test_replication;
mysql> use test_replication;
mysql> CREATE TABLE IF NOT EXISTS `sample_data`(
-> `id` INT UNSIGNED AUTO_INCREMENT,
-> `name` VARCHAR(100) NOT NULL,
-> `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-> PRIMARY KEY (`id`)
-> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> INSERT INTO `sample_data` (name) VALUES ('Test Record 1');
2. 从服务器上的验证
登录到从服务器,检查 test_replication 数据库、sample_data 表以及插入的数据是否存在。