MySQL主从复制是一种常用的数据复制方式,可以实现数据的备份、读写分离等多种功能。MySQL 4种常用的主从复制架构包括基于二进制日志的复制、基于GTID的复制、基于半同步复制和基于组复制。下面将为您详细介绍这四种架构的实现方法。
基于二进制日志的复制
基于二进制日志的MySQL主从复制是最常见的一种方式,实现起来也比较简单。步骤如下:
- 在主服务器的my.cnf配置文件中,开启二进制日志功能,并指定日志文件路径和名称。
bash
[mysqld]
log-bin=mysql-bin - 在主服务器上创建一个用于复制的账户,并授予该账户 REPLICATION SLAVE 权限。
bash
CREATE USER 'replication'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; - 在主服务器上设置一个唯一的 server_id,以便在后续的操作中进行标识。
bash
server_id=1 - 在从服务器上修改 my.cnf 配置文件,设置唯一的 server_id,并指定需要复制的主服务器的 IP 和端口号。
bash
[mysqld]
server-id=2
log-bin=mysql-bin
relay-log=relay-bin
log-slave-updates=1
read-only=1 - 在从服务器上启动 MySQL 服务,并执行如下命令,将从服务器连接到主服务器开始复制数据。
bash
CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='master1-bin.000001',
MASTER_LOG_POS=501;
START SLAVE;
基于GTID的复制
GTID(global transaction identifier)是指全局事务标识符,可以跨越多个服务器,实现数据在不同服务器之间的复制和同步。基于GTID的MySQL主从复制需要先开启GTID功能,步骤如下:
- 在主服务器的my.cnf配置文件中,开启GTID功能,并指定日志文件路径和名称。
bash
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
log-bin=mysql-bin - 在从服务器的my.cnf配置文件中,开启GTID功能,指定唯一的 server_id,并设置 read-only。
bash
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
server-id=2
log-bin=mysql-bin
relay-log=relay-bin
log-slave-updates=1
read-only=1 - 在从服务器上启动 MySQL 服务,并执行如下命令,将从服务器连接到主服务器开始复制数据。
bash
CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_AUTO_POSITION=1;
START SLAVE;
基于半同步复制
半同步复制是指在主服务器写入数据后,至少要等待其中一个从服务器将数据接收成功后,才能继续向前写入数据。这种方式可以避免数据误删除和数据不一致的问题。步骤如下:
- 在主服务器的my.cnf配置文件中,开启半同步复制功能。
bash
[mysqld]
plugin-load=semisync_master=semisync_master.so;semisync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000000000
rpl_semi_sync_slave_enabled=1 - 在从服务器的my.cnf配置文件中,开启半同步复制功能,指定唯一的 server_id,并设置 read-only。
bash
[mysqld]
plugin-load=semisync_master=semisync_master.so;semisync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
server-id=2
read-only=1 - 在从服务器上启动 MySQL 服务,并执行如下命令,将从服务器连接到主服务器开始复制数据。
bash
CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_CONNECT_RETRY=10;
START SLAVE;
基于组复制
MySQL 5.7 引入了基于组复制的数据复制方式,可以在不同的机器之间进行数据同步。步骤如下:
- 在每个参与组复制的 MySQL 节点上,安装并启用 Group Replication 插件。
bash
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; - 根据需求在节点中指定一个或多个主服务器。
```bash
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
3. 创建一个用于组同步的用户,并为其分配 REPLICATION SLAVE 权限。
bash
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON . TO 'repl_user'@'%';
4. 在每个节点上执行下列命令,将其连接到同一组:
bash
SET GLOBAL group_replication_allow_local_disjoint_gtids_join=ON;
SET GLOBAL group_replication_bootstrap_group=OFF;
START GROUP_REPLICATION;
```
示例1:基于GTID的复制
- 主服务器
在主服务器的my.cnf配置文件中,开启GTID功能,并指定日志文件路径和名称。
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
log-bin=mysql-bin
- 从服务器
在从服务器的my.cnf配置文件中,开启GTID功能,指定唯一的 server_id,并设置 read-only。
[mysqld]
gtid_mode=on
enforce_gtid_consistency=on
server-id=2
log-bin=mysql-bin
relay-log=relay-bin
log-slave-updates=1
read-only=1
在从服务器上启动 MySQL 服务并执行如下命令,将从服务器连接到主服务器开始复制数据。需要注意的是,这里的 GTID 需要替换为从主服务器查询到的属于这个 GTID 所在事务内任何语句的集合。
CHANGE MASTER TO
MASTER_HOST='database.domain.com',
MASTER_USER='repl_user',
MASTER_PASSWORD='yourpassword',
MASTER_AUTO_POSITION=1;
START SLAVE;
示例2:基于半同步复制
- 主服务器
在主服务器的my.cnf配置文件中开启半同步复制功能。
[mysqld]
plugin-load=semisync_master=semisync_master.so;semisync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000000000
rpl_semi_sync_slave_enabled=1
- 从服务器
在从服务器的my.cnf配置文件中,开启半同步复制功能,指定唯一的 server_id,并设置 read-only。
[mysqld]
plugin-load=semisync_master=semisync_master.so;semisync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
server-id=2
read-only=1
在从服务器上启动 MySQL 服务并执行如下命令,将从服务器连接到主服务器开始复制数据。
CHANGE MASTER TO
MASTER_HOST='database.domain.com',
MASTER_USER='repl_user',
MASTER_PASSWORD='yourpassword',
MASTER_PORT=3306,
MASTER_CONNECT_RETRY=10;
START SLAVE;
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL 4种常用的主从复制架构 - Python技术站