主从复制是MySQL中用于提高数据冗余性和可用性的技术。通过将主库的数据复制到一个或多个从库,可以在主库故障时快速切换到从库,保证服务的连续性。此外,主从复制还可以用于负载均衡,将读操作分发到从库,减轻主库的压力。
MySQL 8引入了多项改进,包括:
主库将所有对数据库的更改记录在二进制日志中。从库通过读取这些日志来应用相同的更改。
从库异步地应用主库的日志,延迟较高,但性能较好。
至少一个从库确认收到并执行了事务后,主库才提交事务,提高了数据一致性。
一个从库可以从多个主库复制数据,适用于复杂的复制拓扑。
确保所有节点运行MySQL 8版本,并且网络连接正常。
确保主库和从库之间可以互相通信。
在主库上创建一个用于复制的用户,并赋予相应的权限。
-- 主库上执行
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
my.cnf
文件在主库的my.cnf
文件中添加以下配置:
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=ROW
重启MySQL服务以应用配置更改。
sudo systemctl restart mysql
server-id
确保每个MySQL实例都有唯一的server-id
。
my.cnf
文件在从库的my.cnf
文件中添加以下配置:
[mysqld]
server-id=2
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
server-id
确保每个MySQL实例都有唯一的server-id
。
在从库上配置主库信息。
-- 从库上执行
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replicator',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
mysqldump
备份主库数据在主库上使用mysqldump
备份数据。
mysqldump --all-databases --master-data=1 --single-transaction --routines --triggers --events > backup.sql
将备份文件传输到从库并导入数据。
mysql < backup.sql
在从库上启动复制线程。
-- 从库上执行
START SLAVE;
检查复制状态以确保一切正常。
-- 从库上执行
SHOW SLAVE STATUS\G
在主库上创建一个测试表并插入数据,检查从库是否同步。
-- 主库上执行
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table (id, name) VALUES (1, 'Alice');
在从库上查询数据:
-- 从库上执行
USE testdb;
SELECT * FROM test_table;
检查主从复制的延迟情况。
-- 从库上执行
SHOW SLAVE STATUS\G
CHANGE MASTER TO
语句中的日志文件和位置正确。pt-table-checksum
和pt-table-sync
工具检查和修复数据不一致。适当调整二进制日志文件的大小,避免频繁切换日志文件。
[mysqld]
max_binlog_size=100M
启用并行复制可以提高复制性能。
[mysqld]
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=4
优化SQL语句,减少锁的使用,提高复制效率。
启用半同步复制可以提高数据一致性。
-- 主库上执行
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
-- 从库上执行
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
一个从库可以从多个主库复制数据。
-- 从库上执行
CHANGE MASTER TO
MASTER_HOST='master_host_ip_1',
MASTER_USER='replicator',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154
FOR CHANNEL 'channel1';
CHANGE MASTER TO
MASTER_HOST='master_host_ip_2',
MASTER_USER='replicator',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154
FOR CHANNEL 'channel2';
-- 从库上执行
START SLAVE FOR CHANNEL 'channel1';
START SLAVE FOR CHANNEL 'channel2';
使用GTID可以简化复制配置和管理。
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON
-- 从库上执行
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replicator',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1;