文章目录
- 主要内容
- 一.启用GUID并配置循环复制
- 1.其中,UUID用来唯一标识每一个服务器,事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT @@server_uuid\G命令可以查看服务器的UUID,sever1的UUID值显示如下:
- 代码如下(示例):
- 2.在三个节点上分别操作,先关闭mysqld实例,然后修改my.cnf配置文件,去除gtid-mode=ON和enforce-gtid-consistency两个选项的注释,保存。
- 代码如下(示例):
- 3.分别启动三个mysqld实例:
- 代码如下(示例):
- 4.在server2和server3上执行stop slave命令以停止从属服务器上的I/O 和SQL 线程。
- 代码如下(示例):
- 5.在sever1、server2和server3上分别执行reset master命令,该命令会复位现有的二进制日志文件,并将gtid_executed和gtid_purged设置为空字符串,以便日志文件仅包含使用GTID 的事件。
- 代码如下(示例):
- 6.在server2和server3上分别执行CHANGE MASTER TO MASTER_AUTO_POSITION=1;和START SLAVE USER='repl' PASSWORD='oracle';恢复前面的三层复制结构,注意这次使用的是GTID。
- 代码如下(示例):
- 7.验证复制功能,在server1上删除city表ID大于4060的行;在server2和server3上查看到相同的同步结果,复制成功:
- 代码如下(示例):
- 8.在server3,检查从属服务器状态:
- 9.继续,在server1上执行changemaster to命令,更改server1为server3的master,并启动复制:
- 代码如下(示例):
- 10.在server2上删除city表ID大于4050的行:
- 代码如下(示例):
- 11.在server1上大于4050的行也被删除,查询server1的gtid_executed变量可以看到该删除操作的初始执行位置是server2(server2的UUID=0469d41c-f7db-11ed-aa03-000c29bd1425):
- 代码如下(示例):
- 总结
主要内容
- 预备知识
MySQL主从复制是MySQL数据库中常用的一种高可用性和数据备份方案,它可以将主数据库的数据同步到从数据库,从而实现数据的备份和读写分离。下面是MySQL主从复制的详细原理及工程实现:
主从复制的原理:
主从复制的原理是通过在主数据库上记录所有的数据变更操作(如INSERT、UPDATE、DELETE)并将这些操作记录在二进制日志(Binary Log)中,然后从数据库通过读取主数据库的二进制日志来获取这些数据变更操作,并在从数据库上执行相同的操作,从而保持从数据库和主数据库的数据一致性。
一.启用GUID并配置循环复制
二进制日志坐标只适应于简单的复制结构,对于复杂的比如循环、双向和多源复制,二进制日志坐标就不能唯一标识一个事务了,这个时候必须使用GTID(全局事务标识符)来记录产生更改的事务。
1.其中,UUID用来唯一标识每一个服务器,事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT @@server_uuid\G命令可以查看服务器的UUID,sever1的UUID值显示如下:
代码如下(示例):
select @@server_uuid\G
在复杂复制拓扑中,必须使用GTID才能唯一标识某一个事务。
下面我们将在三个服务器上启用GTID,并构建循环拓扑,也即将server1设置为server3的slave,在这种结构中,每一个服务器既是master,同时又是slave,在任何一个服务器上的修改,都会同步到其余的两个服务器上。
2.在三个节点上分别操作,先关闭mysqld实例,然后修改my.cnf配置文件,去除gtid-mode=ON和enforce-gtid-consistency两个选项的注释,保存。
代码如下(示例):
systemctl stop mysqld
vim /etc/my.cnf
cat /etc/my.cnf
3.分别启动三个mysqld实例:
代码如下(示例):
systemctl start mysqld
systemctl status mysqld
4.在server2和server3上执行stop slave命令以停止从属服务器上的I/O 和SQL 线程。
代码如下(示例):
stop slave;
5.在sever1、server2和server3上分别执行reset master命令,该命令会复位现有的二进制日志文件,并将gtid_executed和gtid_purged设置为空字符串,以便日志文件仅包含使用GTID 的事件。
代码如下(示例):
reset master;
select @@server_uuid\G
6.在server2和server3上分别执行CHANGE MASTER TO MASTER_AUTO_POSITION=1;和START SLAVE USER=‘repl’ PASSWORD=‘oracle’;恢复前面的三层复制结构,注意这次使用的是GTID。
代码如下(示例):
change master to MASTER_TO_POSITION=1;
start slave user='repl' password='oracle';
show slave status\G
7.验证复制功能,在server1上删除city表ID大于4060的行;在server2和server3上查看到相同的同步结果,复制成功:
代码如下(示例):
delete from world.city where id>4060;
select id,name
from world.city
order by id desc
limit 5;
8.在server3,检查从属服务器状态:
可以看到,server3上执行的事务,其事务初始执行位置是在server1。
9.继续,在server1上执行changemaster to命令,更改server1为server3的master,并启动复制:
代码如下(示例):
change master to MASTER_HOST='server3',MASTER_AUTO_POSITION=1;
start slave user='repl' password='oracle';
10.在server2上删除city表ID大于4050的行:
代码如下(示例):
delete from world.city where id > 4050;
select id,name
from world.city
order by desc
limit 5;
11.在server1上大于4050的行也被删除,查询server1的gtid_executed变量可以看到该删除操作的初始执行位置是server2(server2的UUID=0469d41c-f7db-11ed-aa03-000c29bd1425):
代码如下(示例):
select id,name from world.city
order by id desc
limit 5;
select @@global.gtid_executed\G
总结
以上是今天要讲的内容,学到了MySQL复制拓扑的启用GUID并配置循环复制。