MySQL多主双向复制
概念
MySQL多主双向复制是指多个MySQL节点在一个环形拓扑结构内进行主从复制。每个节点既可作为主节点,也可作为从节点,同时在同一时间只能存在一个主节点。
环境要求
- MySQL版本需 >= 5.6.0
- 每个MySQL节点需在不同的服务器上
操作步骤
- 对于每个MySQL节点,配置
my.cnf
,打开bin-log并设置server-id:
[mysqld]
# 开启bin-log,用于记录所有的数据修改
log-bin=mysql-bin
server-id=1 # 设置server-id,值需要保证唯一
- 开启GTID复制:
[mysqld]
# 开启GTID复制
gtid-mode=on
log-slave-updates=on
enforce-gtid-consistency=on
- 在每一台MySQL节点上创建一个复制账号,并在服务器的安全组中将各节点的IP加入白名单:
CREATE USER 'replication'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.x.x';
- 启动MySQL服务,在节点1上设置节点2为从节点,在节点2上设置节点1为从节点:
# 在节点1执行
CHANGE MASTER TO
MASTER_HOST='192.168.x.2', /* 从节点的IP地址 */
MASTER_USER='replication',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1; /* 开启GTID模式 */
# 在节点2执行
CHANGE MASTER TO
MASTER_HOST='192.168.x.1', /* 从节点的IP地址 */
MASTER_USER='replication',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1; /* 开启GTID模式 */
- 启动从节点的复制:
# 在节点2执行
START SLAVE;
- 可以通过以下命令检查复制是否正常工作:
SHOW SLAVE STATUS\G
示例
以下示例展示了如何将两个MySQL节点设置为多主双向复制:
# 配置节点1
[mysqld]
log-bin=mysql-bin
server-id=1
gtid-mode=on
log-slave-updates=on
enforce-gtid-consistency=on
# 配置节点2
[mysqld]
log-bin=mysql-bin
server-id=2
gtid-mode=on
log-slave-updates=on
enforce-gtid-consistency=on
# 在节点1上
CREATE USER 'repl'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.x.x';
CHANGE MASTER TO
MASTER_HOST='192.168.x.2',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
START SLAVE;
# 在节点2上
CREATE USER 'repl'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.x.x';
CHANGE MASTER TO
MASTER_HOST='192.168.x.1',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
START SLAVE;
MySQL级联复制
概念
MySQL级联复制是指在一个主从环境中,将从节点作为另一个从节点的主节点,进行层级的复制。这样主节点上的数据会在多个从节点之间进行分发和同步。
环境要求
- MySQL版本需 >= 5.7.7
- 每个MySQL节点需在不同的服务器上
操作步骤
- 在主节点上打开binlog并设置server-id:
[mysqld]
log-bin=mysql-bin
server-id=1
- 在所有从节点上打开binlog并设置server-id:
[mysqld]
log-bin=mysql-bin
server-id=2
- 在从节点1上将其设置为主节点,从节点2和从节点3设置为从节点。
# 在从节点1上
CREATE USER 'repl'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.x.x';
# 在从节点1设置主节点
CHANGE MASTER TO
MASTER_HOST='192.168.x.1',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
# 在从节点2和从节点3上
CREATE USER 'repl'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.x.x';
# 在从节点2和从节点3上设置从节点
CHANGE MASTER TO
MASTER_HOST='192.168.x.2',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
- 启动从节点的复制:
# 在从节点1上
START SLAVE;
# 在从节点2和从节点3上
START SLAVE;
示例
以下示例展示了如何设立三个MySQL节点之间的级联复制:
# 配置主节点
[mysqld]
log-bin=mysql-bin
server-id=1
# 配置从节点1
[mysqld]
log-bin=mysql-bin
server-id=2
# 配置从节点2
[mysqld]
log-bin=mysql-bin
server-id=3
# 在从节点1上
CREATE USER 'repl'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.x.x';
# 在从节点1设置主节点
CHANGE MASTER TO
MASTER_HOST='192.168.x.1',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
# 在从节点2和从节点3上
CREATE USER 'repl'@'192.168.x.x' IDENTIFIED BY 'mypassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.x.x';
# 在从节点2设置从节点
CHANGE MASTER TO
MASTER_HOST='192.168.x.2',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
# 在从节点3上设置从节点
CHANGE MASTER TO
MASTER_HOST='192.168.x.2',
MASTER_USER='repl',
MASTER_PASSWORD='mypassword',
MASTER_AUTO_POSITION=1;
# 在从节点1上启动复制
START SLAVE;
# 在从节点2上和从节点3上启动复制
START SLAVE;
注意:级联复制时,从节点上的数据不应该进行修改操作,否则可能会导致复制链中的错误,从而影响到整个环境。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql多主双向和级联复制 - Python技术站