GTID 入门

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

GTID概念

从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

开启GTID的好处

GTID相对于行复制数据安全性更高,故障切换更简单。

  1. 根据 GTID 可以快速的确定事务最初是在哪个实例上提交的。
  2. 简单的实现 failover,不用以前那样在需要找 log_file 和 log_pos。
  3. 更简单的搭建主从复制,确保每个事务只会被执行一次。
  4. 比传统的复制更加安全,一个 GTID 在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
  5. GTID是连续的没有空洞的,保证数据的一致性,零丢失
  6. GTID 用来代替classic的复制方法,不再使用 binlog+pos 开启复制。而是使用 master_auto_postion=1 的方式自动匹配 GTID 断点进行复制。
  7. GTID 的引入,让每一个事务在集群事务的海洋中有了秩序,使得 DBA 在运维中做集群变迁时更加方便

MySQL8配置主主同步(开启GTID)

GTID概念从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上...

如何开启

只需要在my.cnf中的[mysqld]添加:

[mysqld]
# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true

注:一般会放在 /etc/my.cnf 或 /etc/mysql/my.cnf 目录下

然后执行:

stop slave;
change master to master_host='主库的IP',master_port=3306,master_user='slaveuser',master_password='password',master_auto_position = 1;
start slave;

跟之前对比,不需要再去查master_log_filemaster_log_pos,直接用master_auto_position = 1代替即可。

注意事项:需要在主库和从库都开启才有效。

查看GTID是否开启

show variables like 'gtid_mode'

实战

环境说明

准备两台数据库A和B,其中A为正在使用的线上环境的数据库,B为将要添加的数据库。最终A和B为主主关系。

开启同步及GTID

修改数据库A的my.cnf文件,在末尾添加:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1
log-slave-updates
slave-skip-errors=all
binlog-ignore-db=mysql,sys,performance_schema,information_schema
replicate-ignore-db=mysql,sys,performance_schema,information_schema
# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true

数据库B的my.cnf也添加以上内容,但需要将server-id改为其他数字,不能与数据路A一样。例如改成server-id=2

创建同步账号

在A和B库执行如下语句添加一个账号为slaveuser,密码为password的同步账号。

SET SQL_LOG_BIN=0;
CREATE USER slaveuser@'%' IDENTIFIED WITH mysql_native_password BY 'password';
grant replication slave on *.* to slaveuser@'%';
flush privileges;
SET SQL_LOG_BIN=1;

重启mysql

分别重启A库和B库

/etc/init.d/mysqld restart

配置同步

在A库执行:

stop slave;
change master to master_host='B库的数据库地址',master_port=3306,master_user='slaveuser',master_password='password',master_auto_position =  1;
start slave;

在B库执行:

stop slave;
change master to master_host='A库的数据库地址',master_port=3306,master_user='slaveuser',master_password='password',master_auto_position =  1;
start slave;

检查同步

分别在A库和B库执行:

show slave status;

如果这两个字段都为Yes,则表明同步已正常开启。

Slave_IO_Running Slave_SQL_Running
Yes Yes

测试同步

修改A库和B库的数据内容,检查是否同步。

故障模拟

下面模拟A库挂掉,程序切换至B库,重新搭建A库并加入同步的过程。

模拟A库挂掉

在A库执行以下代码,搞坏A库的mysql以及数据。我这里使用的是宝塔安装的mysql,所以mysql的安装位置是:/www/server/mysql,数据存放在/www/server/data,需要根据你的实际情况修改。

#结束mysql进程
pkill -9  mysqld
#卸载mysql
rm -rf /www/server/mysql
#删除数据库文件
rm -rf /www/server/data

执行以上语句后,A库的mysql已打不开了,且数据也丢失了。

业务系统切换至B库

修改业务系统的数据库连接地址,改成B库的地址,让业务系统继续运转。

A库重装mysql

修改A库my.cnf

在末尾添加:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1
log-slave-updates
slave-skip-errors=all
binlog-ignore-db=mysql,sys,performance_schema,information_schema
replicate-ignore-db=mysql,sys,performance_schema,information_schema
# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true

创建同名数据库

在A库创建一个跟B库同名的数据库,最好密码也一致,方便管理。

从B库复制数据到A库

从B库复制数据到A库。由于业务系统已切换到B库,意味着B库的数据随时在变动。后面配置好同步后,A库会自动更新到最新的B库的数据。

创建同步账号

在A库创建同步账号:

CREATE USER slaveuser@'%' IDENTIFIED WITH mysql_native_password BY 'password';
grant replication slave on *.* to slaveuser@'%';
flush privileges;

重启A库mysql

/etc/init.d/mysqld restart

配置同步

在A库上执行:

stop slave;
change master to master_host='B库的地址',master_port=3306,master_user='slaveuser',master_password='abc123456',master_auto_position =  1;
start slave;

在B库上执行:

stop slave;
change master to master_host='A库的地址',master_port=3306,master_user='slaveuser',master_password='abc123456',master_auto_position =  1;
start slave;

检查同步情况。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
1894 0
|
负载均衡 算法 应用服务中间件
Nginx入门 -- 理解 Nginx 的请求处理流程
Nginx入门 -- 理解 Nginx 的请求处理流程
979 2
|
监控 网络协议 Linux
Linux netstat 命令详解
Linux netstat 命令详解
|
NoSQL 关系型数据库 MySQL
HAProxy的高级配置选项-haproxy的四层负载及访问控制案例
这篇文章介绍了HAProxy的高级配置选项,特别是如何进行四层负载均衡和基于策略的访问控制。通过实战案例,展示了如何配置HAProxy以实现对特定IP地址的访问控制,以及如何通过四层负载均衡将流量分配到后端的MySQL和Redis服务。
582 6
|
Kubernetes 负载均衡 调度
在K8S中,如何实现集群管理?
在K8S中,如何实现集群管理?
|
存储 Kubernetes Ubuntu
使用 ezctl 工具部署和管理 Kubernetes 集群
使用 ezctl 工具部署和管理 Kubernetes 集群
1707 0
使用 ezctl 工具部署和管理 Kubernetes 集群
|
数据库 SQL Oracle
数据库漫谈-sybase
sybase就是“system”加“database”
|
数据可视化 测试技术 数据安全/隐私保护
​十个常见的 Python 脚本 (详细介绍 + 代码举例)
​十个常见的 Python 脚本 (详细介绍 + 代码举例)
709 0
|
消息中间件 安全 NoSQL
「架构」SOA(面向服务的架构)
**SOA**是构建灵活企业IT系统的架构模式,基于服务组件进行设计。它强调服务的自包含、模块化,通过服务识别、抽象、组合和交互实现业务流程。特点包括松耦合、重用性、互操作性和标准化。优点是灵活性、可维护性、可扩展性和成本效益,但也有复杂性、性能和治理问题。设计策略涉及业务能力识别、服务契约定义和服务目录建立。技术栈涵盖Java EE、.NET、SOAP、REST、服务治理工具和各种数据库、消息队列及安全标准。SOA旨在适应变化,但也需妥善管理和规划。
1042 0
|
Arthas Java 测试技术
Arthas之动态加载类(retransform)
Arthas之动态加载类(retransform)
914 0