MySQL主从复制(传统和GTIDs)

Posted ღ᭄小艾ヅ࿐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制(传统和GTIDs)相关的知识,希望对你有一定的参考价值。

一、mysql集群概述:

1.集群的主要类型:

  • 高可用集群:高可用集群是指通过特殊的软件把独立的服务器连接起来,组成一个能够提供故障切换功能的集群

2.如何衡量高可用:

这里是引用

  • 计算方法:
    在这里插入图片描述

3.常用的集群架构:

  • MySQL Replication
  • MySQL Cluster
  • MySQL Group Replication (MGR)多主一从
  • MariaDB Galera Cluster
    -MHA | Keepalived | HeartBeat | Lvs, Haproxy等技术构建高可用集群

二、MySQL复制简介:

1.什么是MySQL复制:

  • Replication可以实现将数据从一台数据库服务器(master)复制到一台到多台数据库服务器(slave)
  • 默认情况下,属于异步复制,所以无需维持长连接

2.MySQL复制原理(重点):

  • 简单来说,master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据重演操作,实现数据异步同步
  • master:主
  • slave:从
    在这里插入图片描述
  • 详细描述:(当主从同步配置完毕后)
  1. slave端的io线程发送请求给master端的binlog dump线程
  2. master端的binlog dump线程获取二进制日志信息(文件名和位置信息)发送给slave端的io线程
  3. slave端io线程获取到的内容依次写入到slave端relaylog(中继日志)里,并把master端的binlog文件名和位置记录到master.info里
  4. slave端的SQL线程,检测到relay log 中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和m aster数据一致

1).扩展(relay log中继日志):

  • 作用:记录从(slave)服务器接收来自主(master)服务器的二进制日志
  • 场景:用于主从复制
  • master主服务器将自己的二进制日志发送给slave从服务器,slave先保存在自己的中继日志中,然后再执行自己本地的relay log里的sql达到数据库更改和master保持一致
  • 如何开启?
    默认不开启,需要修改配置文件,完成开启
    在这里插入图片描述

3.MySQL复制架构:

1).双机热备(AB复制):

这里是引用

  • 默认情况下,master接收读写请求,slave只接受读请求以减轻master的压力

2).级联复制:

这里是引用

  • 优点:进一步分担读的压力
  • 缺点:slave1出现故障,后面的所有级联slave服务器都会同步失败

3).并联复制(一主多从):

在这里插入图片描述

  • 优点:解决级联复制slave1的单点故障问题 ,同时也分担读压力
  • 缺点:间接增加master的压力(传输二进制日志压力)

4).双主复制

这里是引用

  • 特点:从命名上看,两台master好像都能接收读写请求,但实际上,往往运作的时候,同一时刻只有一台master会接受写请求,另外一台接受读请求

三、MySQL主从复制的搭建(AB复制):

1.传统AB复制架构(M-S):

  • 说明:在配置mysql主从架构时,必须保证数据库版本高度一致

2.环境规划:

编号主机名称主机ip地址角色信息
1master192.168.74.19master主服务器
2slave192.168.74.25slave从服务器
  • 由于两台机器处于集群架构,需要互相连接。绑定主机名称与IP地址到/etc/hosts
  • 时间需要同步(重要)

3.MySQL主从复制核心思路:

1.slave必须安装相同版本的mysql数据库软件
2.master必须开启二进制日志;slave端必须开启relay log日志
3.master端和slave端的server-id号不能一样
4.slave端配置向master来同步数据

  • master端必须创建一个复制用户
  • 保证master和slave端初始数据一样
  • 配置主从复制(slave端)

4.MySQL主从复制的具体实践:

  • 在slave从服务器端安装mysql软件(不需要初始化)
  • 相对于主服务器MySQL的安装与配置,从服务器端不需要进行初始化操作,因为其数据将来都来自主服务器

1).配置my.cnf文件:

  • 从服务器:这里是引用

2).把master主服务器的数据目录同步到slave从服务器:

  • 第一步:把master服务器中的mysql停止掉
    在这里插入图片描述
  • 第二步:把master服务器中的/mysql_3306/data/auto.cnf文件删除
    每安装一个mysql软件,其data数据目录都会产生一个auto.cnf文件,里面是一个唯一性的编号,相当于我们每个人的身份证号码
    在这里插入图片描述
  • 第三步:把master服务器中的/mysql_3306中的data目录拷贝一份到slave从服务器的/usr/localmysql目录
    在这里插入图片描述
  • 第四步:同步完成后,把主服务器与从服务器中的mysql启动

3).常见问题解决方案:

  • 常见问题1:mysql无法启动
    在这里插入图片描述
    出现以上问题的主要原因在于/etc/init.d目录中没有mysqld这个文件,换句话说就是没有拷贝mysql.server脚本
    在这里插入图片描述
  • 常见问题2:MySQL没有安装在/usr/local/mysql目录中,service也无法启动
    在这里插入图片描述
    所以我们更换了mysql的安装位置,则必须更改/etci/init.d/mysql脚本中basedir和datadir目录
  • 我的是修改这个文件,因人而异!!在这里插入图片描述
    在这里插入图片描述

4).配置master-slave主从同步:

  • 第一步:在master主服务器中创建一个账号,专门用于实现数据同步
    在这里插入图片描述
  • 第二步:在master中锁表,然后查看二进制文件的名称及位置
    在这里插入图片描述
  • 第三步:在slave从服务器中,使用change master to 指定主服务器,实现数据同步
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 第四步:在slave从服务器中启动slave数据同步:
    start slave;

    查看:
    在这里插入图片描述
  • 第五步:测试验证(只能在主服务器写入数据,从服务器不能写只能读)
    我在主服务器新建了一个数据库叫db_lin2,新创了一张表叫tb_chaochao,并且插入了一条信息
  • 接下来我们进入从服务器查看:
    在这里插入图片描述
    在这里插入图片描述
    这样子就完成主从同步了!!!!

5.总结:

  • 主从复制必须保证两台数据库实例的server-id不一样
  • 主服务器必须开启二进制日志,从服务器必须开启中继日志
  • 主从复制搭建必须保证初始数据一样
  • 主服务器必须要给从服务器创建一个复制用户,并授予复制的权限
  • master -> slave架构,主写会同步到从,而从写不会同步到主

6.slave从服务器不小心写入数据解决方案

  • 正常情况下:master可读可写,但slave从服务器只能读不能写。
  • 一旦我们在slave从服务器中写入数据,主从架构会失败
  • 我已经在从服务器中写了一条数据
    在这里插入图片描述
    遇上以上问题,如果数量较少,还可以通过跳过当前语句的方式解决。但是如果从服务器写入数据过多则以上架构得重新搭建!!
  • 解决方案:
    答:可以通过变量sql_slave_skip_counter临时跳过事务进行处理
    在这里插入图片描述
    在这里插入图片描述

四、基于GTIDs的主从复制架构(M-S)

1.GTIDs概述:

  • GTIDs全局事务标识符
  • 当使用GTIDs时,每一个事务都可以被识别并且跟踪
  • 添加新的slave或者当发生故障需要将master身份或者角色迁移到slave上时,都无需考虑是哪一个二进制日志以及哪个position值,极大简化了相关操作
  • GTIDs是完全基于事务的,因此不支持myisam存储引擎
  • GTID由source_id和transaction_id组成
  • 使用GTIDs的限制条件有哪些?
    在这里插入图片描述

2.基于GTIDs的主从复制:

  • 思路:
    修改配置文件支持GTIDs(主+从)
    重启数据库(主+从)
    为了保证数据一致性,master和slave设置为只读模式(主+从)
    从服务器上重新配置同步(从)

3.基于GTIDs的主从复制实践:

  • 第一步:修改配置文件支持GTIDs
    • master(my.cnf)
      在这里插入图片描述
    • slave(my.cnf)
      在这里插入图片描述

这里是引用

  • 第二步:重新启动mysql
  • 第三步:主从配置只读模式(主服务器和从服务器都要执行)
    在这里插入图片描述
  • 第四步:slave从服务器重新配置change master to
    在这里插入图片描述
  • 第五步:关闭主从服务器的只读模式
    在这里插入图片描述

4.slave从服务器不小心写入数据解决方案:

  • 方法一这里是引用
  • 方法二:重新同步data目录

以上是关于MySQL主从复制(传统和GTIDs)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)

MySQL数据库在线热备(主从复制之基于GTIDs的AB复制)

Linux----------mysql主从复制和基于GTID主从复制

在线建立或重做mysql主从复制架构方法(传统模式和GTID模式)

CentOS 7 部署MySQL 5.7(主从复制,传统方式及GTID)

[MySQL] 主从复制原理