Mysql操作教学之在Linux中实现主从复制,从背景原理到搭建实施,步骤详细教学,超实用!!!(6)

前言

MySQL主从复制是一种数据同步机制,通过将主库(Master)的变更实时复制到一个或多个从库(Slave),实现数据冗余与读写分离。主库记录所有数据更改(写入、更新等)到二进制日志(binlog),从库通过I/O线程拉取这些日志并保存为中继日志(relay log),再由SQL线程重放操作,最终保持数据一致。主从复制支持高可用、负载均衡及备份扩展,适用于读多写少场景。配置需确保主从服务器ID唯一,并指定binlog格式(如ROWSTATEMENT)。延迟和一致性需监控优化。

1、Mysql主从复制介绍

MySQL主从复制(Replication)是一种数据同步机制,允许数据从一个主库(Master)自动复制到一个或多个从库(Slave)。以下是其背景、原理及实现步骤的详细说明:

1.1 背景与作用


1、背景

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别是数据丢失的话,后果更是不堪设想。这时候,我们会考虑如何减少数据库的连接,下面就进入我们今天的主题。


2、作用

  1. 高可用性:主库故障时,从库可快速切换为主库,减少停机时间。

  2. 负载均衡:主库处理写操作,从库处理读操作,分散数据库压力。

  3. 数据备份:从库作为实时备份,避免数据丢失。

  4. 数据分析:在从库执行复杂查询,不影响主库性能。

  5. 地理分布:跨地域部署从库,提升访问速度。

1.2 核心原理及模型说明


1、核心原理

主从复制基于二进制日志(Binary Log),过程分为三阶段:

  1. 主库写入二进制日志(Binlog)

    • 主库将所有修改数据的操作(如INSERT/UPDATE/DELETE)记录到Binlog中。

    • 支持三种Binlog格式:语句模式(SBR)、行模式(RBR)、混合模式(Mixed)。

  2. 从库拉取日志(IO线程)

    • 从库通过IO线程连接主库,读取Binlog并保存为中继日志(Relay Log)。

    • 使用主库授权的账号认证。

  3. 从库重放日志(SQL线程)

    • 从库的SQL线程读取Relay Log,按顺序执行SQL操作,更新自身数据。

    • 保证最终数据一致性。


2、模型说明
在这里插入图片描述

说明:

  • 在上面的模型中,Mysql-A就是主服务器,即masterMysql-B就是从服务器,
    slave
  • Mysgl-A的数据库事件(例如修改数据库的 SQL操作语句),都会存储到日
    志系统A中,在相应的端口(默认3306)通过网络发送给Mysql-BMysql-B
    收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库Mysgl-B
    中完成。
  • 日志系统A,是MYSQL的日志类型中的二进制日志,也就是专门用来保存修改
    数据库表的所有动作,即 bin log,注意 MYSQL 会在执行语句之后,释放锁之
    前,写入二进制日志,确保事务安全。
  • 日志系统B,不是二进制日志,由于它是从MYSQL-A的二进制日志复制过来的,
    并不是自己的数据库变化产生的,有点接力的感觉,称为中继目志,即relaylog
  • 通过上面的机制,可以保证Mysgl-AMysgL-B的数据库数据一致,但是时间
    上肯定有延迟,即MysqL-B的数据是滞后的。因此,会出现这样的问题,Mysgl-A
    的数据库操作是可以并发的执行的,但是Mysgl-B只能从relaylog中一条一条
    的读取执行。若Mysql-A的写操作很频繁,Mysgl-B很可能就跟不上了。

1.3 主从复制方式

  1. 异步复制

    master只需要完成自己的数据库操作即可,至于slave是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。


  1. 同步复制

    master的事务需在所有slave节点提交后才返回成功,通常通过第三方方案实现(如 Galera Cluster 或 MySQL Group Replication)。


  1. 半同步复制

    master只保证slave中的一个操作成功,就返回,其他slave不管。这个功能,是由GoogleMYSQL引入的。

下面主从复制的搭建默认使用的是异步复制方式,大家可自行扩展其它方式。

2、主从复制实现步骤

2.1 描述和原理


1、描述

  • 主从复制是指将主数据库的DDLDML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而
    使得从库和主库的数据保持同步。
  • MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
  • MySQL复制的有点主要包含以下三个方面:
    1. 主库出现问题,可以快速切换到从库提供服务。
    2. 实现读写分离,降低主库的访问压力。
    3. 可以在从库中执行备份,以避免备份期间影响主库服务。
      在这里插入图片描述

2、原理

在这里插入图片描述

从上图来看,复制分成三步:

  1. Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
  2. 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志RelayLog
  3. slave重做中继日志中的事件,将改变反映它自己的数据。

2.2 搭建步骤

本文说的是在centos 7系统上,实现mysql5.7数据库的主从配置,从而实现读写分离操作。
Linux上安装mysql教程

1、准备两台服务器(用虚拟机安装两台centos7即可)

在这里插入图片描述

  • 防火墙配置: 两个服务器做相同配置
    开放指定的3306端口号:
    firewall-cmd --zone=public -add-port=3306/tcp -permanent
    firewall-cmd -reload
    
    关闭服务器的防火墙:
    systemctl stop firewalld
    systemctl disable firewalld
    
    两台服务器需要安装对应的mysql软件,并启动。

2、主库的配置(master)

  1. 修改配置文件 /etc/my.cnf

    # mysql服务ID,保证整个集群环境中唯一,取值范围:1-232-1,默认为1
    server-id=1
    
    # 是否只读,1代表只读,0代表读写
    read-only=0
    
    # 忽略的数据,指定不需要同步的数据库
    # binlog-ignore-db=mysql
    
    # 指定同步的数据库,默认同步全部数据库
    # binlog-do-db=db01
    
  2. 重启MySQL服务

    systemctl restart mysqld
    
  3. 登陆mysql,创建远程连接的账号,并授予主从复制的权限

    # 创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
    creat user itcast'@'% identified by 'password'
    
    # 为itcast@%用户分配主从复制权限
    grant replication slave on *.* to 'itcaast'@'%';
    
    # 刷新权限
    flush privileges;
    
  4. 查看主库状态

    show master status;
    

    在这里插入图片描述

    字段说明:

    • file:从哪个日志文件开始推送日志文件
    • position:从哪个位置开始推送日志
    • binlog_ignore_db:指定不需要同步的数据库


    记录这几个字段,后续在从库需要使用。


3、从库的配置(slave)

  1. 修改配置文件 /etc/my.cnf

    # mySql服务ID,保证整个集群环境中唯一,取值范围:1-232-1,和主库不一样即可
    server-id=2
    
    # 是否只读,1代表只读,0代表读写
    read-only=1
    

    如果想要超级管理员也是只读的添加字段: super-read-only=1

  2. 重启MySQL服务

    systemctl restart mysqld
    
  3. 登陆mysql,设置主库配置

    • Mysql8.0.23之前的写法:(本文使用该写法)

      change master to
      master_host = '主库ip',
      master_user = 'itcast',  #  主库创建用户名
      master_password = 'password',	# 密码
      master_log_file = 'mysql-bin.000001',	 # 日志文件名
      master_log_pos = 154; # 位置
      
    • Mysql8.0.23写法:

      change replication
      source to source_host = '主库ip', 
      source_user = 'itcast', 
      source_password = 'password', 
      source_log_file = 'mysql-bin.000001', 
      source_log_pos = 154;
      
    • 参数说明:

      mysql8.0.23含义mysql8.0.23之前
      source_host主库IP地址master_host
      source_user连接主库的用户名master_user
      source_password连接主库的密码master_password
      source_log_filebinlog日志文件名master_log_file
      source_log_posbinlog日志文件位置master_log_pos
  4. 开启同步状态

    start replica;	# 8.0.22之后
    start slave;	# 8.0.22之前(本文使用该方法)
    
  5. 登陆mysql,查看主从同步状态

    show replica status; # 8.0.22之后
    show slave status; # 8.0.22之前(本文使用该方法)
    

    在这里插入图片描述


4、验证配置

  1. 在主库上创建数据库、表,并插入数据,如下:

    # 创建数据库
    create database db0l;
    
    # 选择数据库
    use db01;
    
    # 创建表
    create table tb user(
    idint(11)primarykeynotnullauto_increment,
    namevarchar(5o)notnull
    sex varchar(1)
    )engine=innodb default charset=utf8mb4;
    
    # 插入数据
    insert into tb_user(id,name,sex) values(null,'Tom','1'),(null,'Trigger','O'),(null,'Dawn','1');
    
  2. 在从库中查询数据,验证主从库是否同步

2.3 初始数据同步

如果需要将主库之前的数据库同步到从库,可以提前先将主库数据拷贝到从库,因为主从同步是从当前位置进行同步的。

步骤如下:

  1. 锁定主库(可选)

    flush tables with read lock;
    
  2. 导出数据

    mysqldump -u root -p --all-databases > master_data.sql
    
  3. 解锁主库

    unlock tables;
    
  4. 导入数据到从库

    mysql -u root -p < master_data.sql
    

2.4 常见问题排查及总结


1、问题排查

  • 连接失败:检查主从网络、防火墙、复制用户权限。

  • 数据不一致:使用工具如 pt-table-checksum 校验数据。

  • 复制延迟:优化从库硬件、减少大事务、调整并行复制参数。


2、总结:

MySQL主从复制通过Binlog实现数据同步,配置步骤包括主库开启Binlog、创建复制用户,从库配置连接信息并启动复制。该机制为高可用、读写分离及数据备份提供了基础支持,是构建健壮数据库架构的核心技术之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盲敲代码的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值