周顺的技术博客

  • 首页
  • 榜上有名
  • 文章归档
  • 读者排行
  • 豆瓣书影
  • 友情链接
  • DevOps (4)
  • Docker (4)
  • k8s (9)
  • linux (11)
  • Mysql (9)
  • Python (2)
  • Redis (1)
  • Shell (6)
  • 主题 (0)
  • 未分类 (0)

GTID的配置与实现

  • xiaoteng
  • 2025-02-11
  • 0

作用:基于GTID实现主从复制(重点)

文档:https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-howto.html

环境说明:

关闭防火墙+SELINUX、配置IP与主机映射、时间同步、安装依赖包

IP主机名角色
192.168.88.101node1.xiaoteng.cnmaster(主)
192.168.88.102node2.xiaoteng.cnslave(从)

安装前准备:① 配置IP、主机名 ② 配置IP与主机映射 => /etc/hosts ③ 关闭防火墙与SELinux ④ 时间同步 ⑤ 安装必备软件,如vim、wget、rsync

设置主机名称

hostnamectl set-hostname node1.xiaoteng.cn
hostnamectl set-hostname node2.xiaoteng.cn

su或者bash指令

配置IP与主机映射

vim /etc/hosts
尾部追加如下内容
192.168.88.101 node1 node1.xiaoteng.cn
192.168.88.102 node2 node2.xiaoteng.cn

关闭防火墙与SELinux

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
vim /etc/selinux/config

安装一些依赖软件(系统必备软件)

dnf install vim wget rsync -y

到此环境准备完毕了!


数据库环境准备:请基于master.sh以及slave.sh自行安装mysql8软件,并进行数据同步

master:安装mysql并进行初始化

source master.sh

slave:只安装mysql不进行初始化

source slave.sh

停止mysqld,然后同步数据到slave中

master:

systemctl stop mysqld
rm -rf /export/server/mysql/data/auto.cnf
rsync -av /export/server/mysql/data node2:/export/server/mysql/

第一步:修改主库配置

修改主库的配置文件

cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/export/server/mysql
datadir=/export/server/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/export/server/mysql/master.err
log-bin=/export/server/mysql/data/binlog
server-id=10
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
gtid_mode=on
enforce_gtid_consistency=on
log_slave_updates=1
EOF

GTID配置说明:

启用全局事务标识符(GTID)模式

gtid_mode=on

强制GTID的一致性。这意味着在执行事务时,MySQL将确保所有涉及的服务器都使用相同的GTID集。

enforce_gtid_consistency=on

log_slave_updates=1

log_slave_updates=1是 MySQL 主从复制中的一个关键参数,它决定了从库(Slave)是否将从主库(master)同步过来的数据变更事件记录到自己的二进制日志(binlog)

第二步:修改从库配置

修改从库配置文件


cat > /etc/my.cnf <<EOF
[mysqld]
basedir=/export/server/mysql
datadir=/export/server/mysql/data
socket=/tmp/mysql.sock
port=3306
log-error=/export/server/mysql/slave.err
log-bin=/export/server/mysql/data/binlog
relay-log=/export/server/mysql/data/relaylog
server-id=20
character_set_server=utf8mb4
collation-server=utf8mb4_unicode_ci
gtid_mode=on  
enforce_gtid_consistency=on
log_slave_updates=1
read-only=on
EOF

master节点/slave节点,重启MySQL

# 主服务器
touch /export/server/mysql/master.err
chown -R mysql.mysql /export/server/mysql
systemctl start mysqld

# 从服务器
touch /export/server/mysql/slave.err
chown -R mysql.mysql /export/server/mysql
systemctl start mysqld

从节点设置主库信息

以下是官网提供的设置参考(仅参考,需要调整为自己master服务器信息)

https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-howto.html
mysql> CHANGE REPLICATION SOURCE TO
     >     SOURCE_HOST = host,
     >     SOURCE_PORT = port,
     >     SOURCE_USER = user,
     >     SOURCE_PASSWORD = password,
     >     SOURCE_AUTO_POSITION = 1;

SOURCE_AUTO_POSITION = 1: 这告诉从服务器使用自动位置跟踪功能,以便它可以自动从主服务器获取最新的二进制日志事件,而无需手动指定位置。

具体配置代码:

master主服务器创建同步账号:

mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

slave从服务器基于change replication source进行同步操作

mysql> change replication source to
  source_host='192.168.88.101',
  source_port=3306,
  source_user='slave',
  source_password='123',
  source_auto_position=1;

和AB复制最大的不同就是不需要寻找binlog以及对应的pos点位,只需要source_auto_position=1就可以自动同步!

第三步:开启从库复制

mysql> start replica;

查看复制状态

mysql> show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
© 2026 周顺的技术博客
Theme by Wing
  • {{ item.name }}
  • {{ item.name }}