Mysql(1)--主从复制(position和gtid)

本文详细介绍了MySQL主从复制的概念、工作原理和原因,重点讲解了基于position和GTID的复制原理及配置步骤。通过实验展示了如何在master和slave节点上配置,验证了数据的异步复制和GTID自动找点同步功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概念

  • 指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器
  • 主服务器中的数据自动复制到从服务器中
  • 即就是主数据库做什么,从数据库做什么

2.主从复制工作原理

  • Master数据库只要发生变化,立马记录到Binary log日志文件中
  • Slave数据库启动一个I/O thread连接Master数据库,请求Master变化的二进制日志
  • Slave I/O获取到的二进制日志,保存到自己的Relay log日志文件中
  • Slave有一个SQL thread定期检查Realy log是否变化,变化就更新数据
    在这里插入图片描述

3.使用mysql主从的原因

  • 实现服务器的负载均衡
  • 通过复制实现数据的异地备份
  • 提高数据库系统的可用性

4.主从复制的原理(position)

  • 异步复制(主从复制)master节点不会关心slave节点的状态,只需要写自己的数据即可
  • 能不能完成复制看slave节点的io线程和sql线程是否开启
  • mysql的主从配置又叫replication,AB复制,基于binlog二进制日志
  • 主数据库必须开启binlog二进制日志才能进行复制
  • mysql的主从复制(异步复制)(基于position)把一个事件拆开来复制
  • 并不是以一个完整的事件为单位来进行复制
主库开启binlog日志(设置log-bin参数)
主从server-id不同
从库服务器能连同主库
master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
从库生成两个线程,一个i/o线程,一个SQL线程,i/o线程去请求主库的binlog,sql线程进行日志回放来复制
slave将master的binary log events拷贝到它的中继日志(relay log);
slave重做中继日志中的事件,将更改应用到自己的数据上。
  • 注意:
  • 一开始两个mysql必须一模一样,否则会报错 master自己做自己的,写在自己的日志里
  • slave能否同步成功取决于IO线程,和SQL线程回放日志 IO通过联系master拿到master的二进制日志,SQL回放日志
  • slave节点的数据总比master节点的数据慢

5.实验步骤

实验环境:

  • master节点:number1,ip为172.25.254.1
  • slave节点:number2,ip为172.25.254.2
  • 测试:真机,ip为172.25.254.76

配置master节点(number1上)

  • 在官网上下载mysql的包mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar
  • tar xf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar #解压
  • 安装所需要的rpm包
yum install mysql-community-client-5.7.25-1.el7.x86_64.rpm 
mysql-community-common-5.7.25-1.el7.x86_64.rpm 
mysql-community-libs-5.7.25-1.el7.x86_64.rpm 
mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm 
mysql-community-server-5.7.25-1.el7.x86_64.rpm -y

在这里插入图片描述

  • vim /etc/my.cnf # 编辑文件
  • 编辑内容为:(在文件最后写入)
log-bin=mysql-bin   #开启二进制日志
server-id=1   #主库server-id需要比从库小,用来区分主机与从机

在这里插入图片描述

  • systemctl start mysqld #开启服务
  • cat /var/log/mysqld.log | grep password #查看原始密码
  • DUsjnO(nN6j! #为原始密码
  • 开启服务之后生成了一个临时密码,使用临时密码进行数据库安全初始化
  • mysql_secure_installation #安全初始化
  • 设定新密码时:密码大于8位,数字+大小写英文+特殊字符
  • 因为该数据库版本开启了密码检测系统,简单密码会报错
  • 第一处直接回车,其他输入y

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • mysql -p #登录数据库
  • CREATE USER 'wang'@'172.25.254.%' IDENTIFIED BY 'WMZdys12*'; #创建从库连接的用户,可以使用此用户远程登录数据库
  • GRANT REPLICATION SLAVE ON *.* TO 'wang'@'172.25.254.%'; #授权为可以复制master节点数据的slave节点
  • flush privileges; #刷新
  • show master status; #查看master节点的状态
REPLICATION:表示复制的权限
*.* :表示对所有库的所有表都授权
wang:用户名
‘172.25.254.%’ : 授权172.25.254网段的所有数据库节点都可以同步(复制)

在这里插入图片描述
在主机上测试主节点是否设置好:

  • mysql -h 172.25.254.1 -uwang -pWMZdys12* #登录数据库
    在这里插入图片描述

配置slave节点(number2上)

  • tar xf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar #解压
  • 安装所需要的rpm包
yum install mysql-community-client-5.7.25-1.el7.x86_64.rpm 
mysql-community-common-5.7.25-1.el7.x86_64.rpm 
mysql-community-libs-5.7.25-1.el7.x86_64.rpm 
mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm 
mysql-community-server-5.7.25-1.el7.x86_64.rpm -y

在这里插入图片描述

  • vim /etc/my.cnf # 编辑文件
  • 编辑内容为(在最后写):server-id=2
    在这里插入图片描述
  • systemctl start mysqld #开启服务
  • cat /var/log/mysqld.log | grep password #查看原始密码
  • 原始密码为:U;1#:DikqftU
  • mysql_secure_installation #安全初始化
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • mysql -p #登录数据库
  • 配置主库信息:
  • CHANGE MASTER TO MASTER_HOST='172.25.254.1', #主库的ip地址
  • MASTER_USER='wang', #主库的用户
  • MASTER_PASSWORD='WMZdys12*', #主库的密码
  • MASTER_LOG_FILE='mysql-bin.000002', #主库的日志文件
  • MASTER_LOG_POS=1325; #主库的状态码
  • 日志文件和状态码可以在主库中查看
  • start slave; #开启从库
  • show slave status\G; #查看从库状态
  • 可以看到的当前两个进程都是yes,表示主库和从库的数据一致
  • 开启成功,IQ SQL线程都开启才能正常复制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 可以看到在number1主机上有刚刚的日志文件
    在这里插入图片描述

测试

在主库上创建新的数据库
在这里插入图片描述在从库上查看是否复制

在这里插入图片描述在这里插入图片描述

6.主从辅助复制gtid的原理

  • GTID复制不像传统的复制方式(异步复制、半同步复制)需要找到binlog(MASTER_LOG_FILE)和POS点(MASTER_LOG_POS)
  • 只需要知道master的IP、端口、账号、密码即可
  • 因为复制是自动的,MySQL会通过内部机制GTID自动找点同步
  • 和基于position的主从复制的不同之处在于:它是以一整个事件为单位进行复制的
  • server-id:服务器身份id,在初始化MySQL时,会自动生成一个server-id并写到数据目录的auto.cnf文件中,
  • 官方不建议修改,并且server-id跟GTID有密切关系,并且对于任意一个数据库节点,server-id是唯一的
  • GTID:全局事务标识符,使用这个功能时,内次事务提交都会在binlog里生成一个唯一的标识符,
  • 它由UUID和事务ID组成,首次提交的事务为1,第二次为2,第三次为3,以此类推
  • 开启GTID,无需找到binlog和POS点,直接change master to master_auto_postion=1即可,它会自动寻找同步
原理步骤:
在master上一个事务提交,并写入binlog里
binlog日志发送到slave,slave接收并写入中继日志里,slave读取到这个GTID,并设置gtid_next的值。
例如set @@session。gtid_next=’=fbd841f9-5590-11e8-b819-000c29e6461e’;
然后告诉slave接下来的事务必须使用GTID,并写入它自己的binlog里
slave检查并确认这个GTID没有被使用,如果没有被使用,那么开始执行这个事务并写入自己的binlog里
由于gtid_next的值不为空,slave不会尝试去生成一个新的gtid而是通过主从同步来获取GTID

7.实验步骤

配置master节点(number1上)

  • vim /etc/my.cnf #编辑文件
  • 编辑内容为(在最后加入):
gtid_mode=ON  #打开gtid模式
enforce-gtid-consistency=true
  • systemctl restart mysqld #重启数据库

在这里插入图片描述
在这里插入图片描述

  • use mysql;
  • select * from gtid_executed; # 发现是空的
    在这里插入图片描述
  • cd /var/lib/mysql
  • mysqlbinlog mysql-bin.000002 #可以看出完成一个事件需要很多步
    在这里插入图片描述

配置slave节点(number2上)

  • vim /etc/my.cnf #编辑文件
  • 编辑内容为(在最后加入):
gtid_mode=ON  #打开gtid模式
enforce-gtid-consistency=true
  • systemctl restart mysqld #重启数据库
    在这里插入图片描述
    在这里插入图片描述
  • mysql -p #登录数据库
  • stop slave; #关闭slave
  • 配置主库信息:
  • change master to master_host ='172.25.254.1', #主库的ip地址
  • master_user='wang', #主库的用户
  • master_password='WMZdys12*', #主库的密码
  • master_auto_position=1; #设定为自动
  • start slave; #开启slave
  • show slave status\G; #查看从库状态
  • 可以看到的当前两个进程都是yes,表示主库和从库的数据一致

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

测试

在主库上添加数据
在这里插入图片描述在从库上查看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### MySQL 主从复制中的POSGTID #### 配置方法 对于基于位置(Position, POS)的主从复制,配置相对简单。在`/etc/my.cnf`中设置`server_id`唯一标识符,并启用二进制日志记录功能即可完成初步配置[^1]。 ```ini [mysqld] server_id=1 log_bin=/usr/local/mysql/data/log-bin ``` 而采用全局事务标识符(Global Transaction ID, GTID)的方式则需额外参数支持。除了上述基本项外,还需激活`gtid_mode`与强制一致性选项来确保数据同步准确性[^2]。 ```ini gtid_mode=ON enforce_gtid_consistency=true ``` 重启服务使更改生效: ```bash systemctl restart mysqld ``` #### 区别对比 - **POS方式**依赖于二进制日志文件名及其内部偏移量来进行增量更新操作;这种方式下每次执行变更都会被记录到新的事件条目里,从而形成连续的日志流。 - **GTID机制**通过分配唯一的事务编号给每笔交易,在整个集群范围内保持一致性可追溯性。这不仅简化了故障恢复流程,还允许自动定位最近一次成功提交的位置继续后续工作而不必担心断点丢失等问题。 #### 故障排查 当遇到主从不同步的情况时,无论是哪种模式都应先检查网络状况是否稳定正常以及资源占用情况如何。如果是因为某些特定原因造成延迟,则可以根据具体表现形式采取相应对策。例如针对大容量表结构修改引起的长时间阻塞现象,建议利用在线DDL工具减少锁定时间影响范围;而对于频繁发生的短时延滞问题,则可通过优化查询语句性能、增加硬件资源配置等方式改善整体效率[^3]。 另外值得注意的是,在使用GTIDs的情况下,还可以借助内置函数获取当前节点的状态信息以便快速诊断潜在风险因素。比如查看源端已发送但目标端尚未应用的变化列表等实用技巧都能帮助运维人员更好地维护系统健康运行状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值