MySQL复制是一种将一个MySQL数据库服务器的数据和改动同步到另一个MySQL数据库服务器的机制。它主要用于以下场景:
- 数据备份:通过复制,确保数据在多个服务器上都有副本,提高数据的可用性和可靠性。
- 负载均衡:读操作可以分布到多个从服务器上,减轻主服务器的负载。
- 数据分布:将数据同步到地理上分散的多个服务器,以提高访问速度和容灾能力。
1. 复制类型
MySQL提供了多种复制类型:
- 异步复制:主服务器将数据变更记录到二进制日志文件中,从服务器定期读取并应用这些日志。
- 半同步复制:主服务器在提交事务后等待至少一个从服务器确认接收到日志,然后才返回确认给客户端。
- 组复制:一种多主复制,通过Paxos协议或Raft协议实现强一致性和高可用性。
2. 配置主从复制
以下是配置MySQL异步复制的步骤,包括主服务器(Master)和从服务器(Slave)的设置。
2.1 主服务器配置(Master)
首先,在主服务器的配置文件my.cnf中添加以下配置:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = row
重启MySQL服务:
sudo service mysql restart
在主服务器上创建一个用于复制的用户,并授予权限:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
获取主服务器的二进制日志位置:
SHOW MASTER STATUS;
以上命令会返回类似以下的信息:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
记下File和Position,以便在从服务器上配置。
2.2 从服务器配置(Slave)
在从服务器的配置文件my.cnf中添加以下配置:
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
重启MySQL服务:
sudo service mysql restart
在从服务器上配置主服务器的连接信息:
CHANGE MASTER TO
MASTER_HOST='主服务器IP地址',
MASTER_USER='replicator',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
启动从服务器的复制线程:
START SLAVE;
可以通过以下命令检查从服务器的复制状态:
SHOW SLAVE STATUS\G
输出中Slave_IO_Running和Slave_SQL_Running应该都显示为Yes,这表示复制正在正常进行。
3. 配置半同步复制
半同步复制在主服务器确认事务提交前,等待至少一个从服务器确认接收到日志。需要在主从服务器上安装半同步复制插件。
3.1 安装插件
在主服务器和从服务器上分别运行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
3.2 配置主服务器
在主服务器的配置文件my.cnf中添加:
[mysqld]
rpl_semi_sync_master_enabled = 1
重启MySQL服务后,启用半同步复制:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
3.3 配置从服务器
在从服务器的配置文件my.cnf中添加:
[mysqld]
rpl_semi_sync_slave_enabled = 1
重启MySQL服务后,启用半同步复制:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
4. 配置组复制
组复制是一种实现多主复制的高可用方案,基于Paxos协议或Raft协议。
4.1 配置主服务器
在每个主服务器的配置文件my.cnf中添加:
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = row
plugin-load = group_replication.so
group_replication_group_name = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
group_replication_start_on_boot = off
group_replication_local_address = "主服务器IP:33061"
group_replication_group_seeds = "主服务器IP:33061,从服务器IP:33061"
group_replication_bootstrap_group = off
重启MySQL服务:
sudo service mysql restart
4.2 启动组复制
在每个服务器上启动组复制:
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group = OFF;
检查组复制状态:
SELECT * FROM performance_schema.replication_group_members;
小结
MySQL的复制功能提供了多种不同的方式来实现数据的高可用性和扩展性。通过主从复制、半同步复制和组复制等配置,可以满足不同的业务需求。根据具体的场景和要求,选择适合的复制方案,并进行合理的配置和调优,以确保系统的稳定性和高效运行。