mysql主从同步原理及应用场景示例详解

目录
  • 基础知识
  • MySQL 主从同步的主要应用场景有:
  • 原理
    • 设置主从同步,还有以下几个前提:
  • 实验环境模拟实现主从同步
    • 首先在 docker 中拉取 mysql 5.7 版本的镜像:
    • 通过以下命令进入到 Master 容器内部:
    • 接下来,进入数据库:
    • 接下来执行以下命令:

基础知识

随着业务复杂度的增加,单台 MySQL 数据库服务器已不能满足实际的需求,取而代之的是数据库服务器集群。MySQL 具有支持分布式的特性,能轻松搭建一个支持高并发的 MySQL 数据库服务器集群。在集群中我们必须保证各个 MySQL 节点的数据是同步的。主从同步就是一种最为常见的同步方式。

主从同步是指,在数据同步过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,另一个或多个其它的服务器充当从服务器(Slave),接收来自主服务器的 binlog 内容,解析出 SQL 语句,更新到从数据库,使得主从服务器的数据达到一致。

MySQL 主从同步的主要应用场景有:

  • 从服务器作为主服务器的备份节点,防止单点灾难;
  • 后续,可以在主从同步的基础上,通过一些数据库中间件实现读写分离,从而大幅提高数据库的并发性能;
  • 根据业务将多个从服务器进行拆分,实现专库专用。

从 MySQL5.6 版本开始,实现主从数据同步有两种方式:基于日志(binlog)和基于 GTID(全局事务标示符)。

原理

要实现 MySQL 主从同步,首先必须打开 Master 端的 binlog 记录功能,否则就无法实现。因为整个同步过程实际上就是 Slave 端从 Master 端获取 binlog 日志,然后再在 Slave 上以相同的顺序执行从 binlog 日志中所记录的各种 SQL,如下图所示。

主从同步原理:

  • 主数据库中对数据的各种操作,都会自动写入 Binary Log 中;
  • 从数据库会在一定时间间隔内探测主数据库的 Binary Log 是否发生变化,如有变化,则开始一个 IO 线程,请求访问主数据库的二进制日志文件并保存到从数据库的中继日志(Relay Log)中;
  • 从数据库启动 SQL 线程从中继日志中读取二进制日志,在本地重放,使其数据与主数据库保持一致,完成后相关线程会陷入休眠,等待下一次唤醒。

设置主从同步,还有以下几个前提:

  • 主库和从库的版本保持一致;
  • 主从同步集群中每个数据库实例的 server-id 值不能重复;

实验环境模拟实现主从同步

我们在此使用 docker 这样的容器技术在一台主机上实现 mysql 的主从同步。这里需要做一点解释,docker 中存在容器的概念,当启动一个 mysql 容器时,其实可以理解为启动了一台仅仅只安装了 mysql 的服务器。

首先在 docker 中拉取 mysql 5.7 版本的镜像:

docker pull mysql:5.7

使用以下命令,启动一个 Master 容器,将其命名为 masterMysql,并设置 mysql 的 root 用户密码为 123456:

docker run -p 3339:3306 --name masterMysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

使用以下命令可以查看正在运行的容器:

dokcer ps

这里可以看到,主容器已经启动起来了。

同样的方式,启动一个 Slave 容器,将其命名为 slaveMysql, 并设置 mysql 的 root 用户密码为 123456:

docker run -p 3340:3306 --name slaveMysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

通过以下命令进入到 Master 容器内部:

docker exec -it masterMysql /bin/bash

也可以使用查看正在运行容器时查看到的 CONTAINER ID 来启动,例如笔者使用这种方式的启动命令如下:

docker exec -it c30b3528b8c8 /bin/bash

两种启动方式都可以。

由于容器环境下没有安装 vim,所以使用以下命令安装 vim

sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
apt update
apt install vim

使用以下命令切换到 /etc/mysql 目录下,修改配置文件 my.cnf

cd /etc/mysql
vim my.cnf

在 my.cnf 中添加如下配置:

[mysqld]
server-id=100
sync-binlog=1
binlog-do-db=world
log-bin=mysql-bin

参数说明:

  • server-id:即主从集群中每个数据库实例 id,在多个服务器间该值不能重复,可以设置 1 - 255 之间的任意值。
  • sync-binlog:该参数控制数据操作与磁盘日志同步频率。该参数的值 n 表示,执行 n 次写入后,与磁盘同步一次,示例中设置为 1,是最安全的,但也是最慢的。
  • binlog-do-db:表示准备进行同步的数据库。
  • log-bin:开启二进制日志功能,可以随便取

之后使用以下命令重启 mysql 使配置文件生效。此时,docker 容器也会停止,还需要启动一次 masterMysql 容器:

service mysql restart
docker start masterMysql
docker exec -it masterMysql /bin/bash

接下来,进入数据库:

mysql -uroot -p123456

在 Master 上配置复制所需要的账户,这里创建一个 slave 用户, % 表示任何远程地址的 slave 用户都可以连接 Master 容器:

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

授予用户 slave replication slave 权限和 replication client 权限,用于在主从库之间同步数据:

GRANT replication slave, replication client ON *.* TO 'slave'@'%';

查看二进制日志状态信息,获取 position 的值,为从服务器配置做准备:

SHOW MASTER STATUS;

重新开启一个 Xfce Terminal,通过以下命令进入到 Slave 容器内部:

docker exec -it slaveMysql /bin/bash

由于容器环境下没有安装 vim,所以使用以下命令安装 vim

sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
apt update
apt install vim

使用以下命令切换到 /etc/mysql 目录下,修改配置文件 my.cnf:

cd /etc/mysql
vim my.cnf

在 my.cnf 中添加如下配置:

[mysqld]
server-id=101
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin

参数说明:

  • log-bin:开启二进制日志功能,以备 Slave 作为其它 Slave 的 Master 时使用
  • relay_log:配置中继日志

之后使用以下命令重启 mysql 使配置文件生效。

service mysql restart
docker start slaveMysql
docker exec -it slaveMysql /bin/bash

进入 MySQL:

mysql -uroot -p123456

接下来执行以下命令:

change master to
master_host='172.17.0.2',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos= 617,
master_connect_retry=30;

参数说明:

master_host:Master 的地址,指的是容器的独立 IP,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' masterMysql 查询 Master 的 IP

master_user:Master 中设置的用户名

master_password:Master 中设置的用户名对应密码

master_port: Master 的端口号,指的是容器的端口号

master_log_file:二进制日志文件名(这里注意填写为实验者在之前使用 show master status 命令查询出来的值)

master_log_pos:二进制日志的 position 值(这里注意填写为实验者在之前使用 show master status 命令查询出来的值)

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是 60 秒

执行以下命令,启动主从操作:

start slave;

执行以下命令,查询 Slave 状态:

show slave status\G

结果如下:

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.2
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 617
               Relay_Log_File: edu-mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
         ...

我们主要查看的是 Slave_IO_Running 和 Slave_SQL_Running ,如果它们的值都是 Yes,则表示主从环境配置成功。

测试主从复制就比较简单了,我们仿照之前的实验,在 Master 中新建一个 world 数据库,然后插入一些数据:

CREATE DATABASE world;
USE world;
CREATE TABLE student(
    stuId INT(10) NOT NULL,
    stuName VARCHAR(10) NOT NULL,
    stuAge INT(10) NOT NULL,
    PRIMARY KEY(stuId)
    );
INSERT INTO student(stuId, stuName, stuAge) VALUES(1, 'zhangsan', 18),(2, 'lisi', 19), (3, 'wangwu', 18);

在 Slave 中执行:

SHOW DATABASES;

可以看到我们在 Master 中新建的 world 数据库已经同步过来了。

再执行以下命令查看插入的数据是否也同步过来了:

USE world;
SELECT * FROM student;

可以看到插入的数据也已经同步过来了。

接下来再在 Master 删除一条数据:

DELETE FROM student
WHERE stuId = 1;

再在 Slave 中执行以下命令查看数据是否同步成功:

SELECT * FROM student;

此时主从复制情况良好。

以上就是mysql主从同步原理及应用场景示例详解的详细内容,更多关于mysql主从同步的资料请关注我们其它相关文章!

(0)

相关推荐

  • MYSQL数据库主从同步设置的实现步骤

    目录 为什么要主从同步? 主从同步的原理 MYSQL数据库进行主从同步 创建两个MYSQL数据库 初始化,安装主机数据库 配置从机 测试主从同步 为什么要主从同步? 1.读写分离 主从同步分为一个主机多个从机,可以设置主从机权限.主机可以读写,从机只能读.主机对数据的操作会复制到从机,主机的数据和从机的一致.这样就可以实现读写分离,读写分离可以缓解服务器压力.互联网的应用往往是“读多写少”的需求,采用读写分离的方式,可以实现更高的并发访问. 2.数据备份 我们通过主从复制将主库上的数据复制到了从

  • MySQL主从同步中的server-id示例详解

    前言 当我们搭建MySQL集群时,自然需要完成数据库的主从同步来保证数据一致性.而主从同步的方式也分很多种,一主多从.链式主从.多主多从,根据你的需要来进行设置.但只要你需要主从同步,就一定要注意server-id的配置,否则会出现主从复制异常. 在控制数据库数据复制和日志管理中,有两个重要的配置:server-id和server-uuid,他们会影响二进制日志文件记录和全局事务标识. server-id配置 当你使用主从拓扑时,一定要对所有MySQL实例都分别指定一个独特的互不相同的serve

  • 一文带你了解Mysql主从同步原理

    目录 Mysql 主从同步原理简析 1.什么是主从 2.为什么要搞主从呢? 3.如何实现主从同步呢? 4.mysql 主从同步的原理 Mysql 主从同步原理简析 在开始讲述原理的情况下,我们先来做个知识汇总, 究竟什么是主从,为什么要搞主从,可以怎么实现主从,mysql主从同步的原理 1.什么是主从 其实主从这个概念非常简单 主机就是我们平常主要用来读写的服务,我们称之为master(主人.主宰) 从机就是主机进行的一个扩展,他一般不会主动用来读写,我们称之为slave( [sleɪv] 奴隶

  • MYSQL数据库如何设置主从同步

    目录 1.配置主数据库 2.配置从数据库 总结 MYSQL可以配置1个主数据库多个从数据库 1.配置主数据库 主master : 192.168.1.132 从slave : 192.168.1.133 1)授权给从数据库 GRANT REPLICATION SLAVE ON *.* to 'repl'@'192.168.1.132' identified by 'test123456'; FLUSH PRIVILEGES; 2)修改主库配置文件,开启binlog,并设置server-id,每次

  • Mysql数据库的主从同步配置

    目录 Mysql主从同步配置 1.安装两个 mysql 2.编写mysql配置文件 3.初始化数据 4.其他mysql 相关命令 Mysql主从同步配置 配置准备: 需要两个数据库 mysql 可视化工具,当然使用用命令行也可以 我这里演示使用 docker 启动两个 mysql 容器, 你也可以安装两个 mysql 前提版本一致 1.安装两个 mysql 创建 msyql 挂载目录 [root@localhost /]# mkdir -p /opt/docker/mysql1/conf/ [r

  • MySQL 主从同步,事务回滚的实现原理

    BinLog BinLog是记录所有数据库表结构变更(例如create.alter table)以及表数据修改(insert.update.delete)的二进制日志,主从数据库同步用到的都是BinLog文件.BinLog日志文件有三种模式. STATEMENT 模式 内容:binlog 只会记录引起数据变更的 sql 语句 优势:该模式下,因为没有记录实际的数据,所以日志量和 IO 都消耗很低,性能是最优的 劣势:但有些操作并不是确定的,比如 uuid() 函数会随机产生唯一标识,当依赖 bi

  • mysql主从同步原理及应用场景示例详解

    目录 基础知识 MySQL 主从同步的主要应用场景有: 原理 设置主从同步,还有以下几个前提: 实验环境模拟实现主从同步 首先在 docker 中拉取 mysql 5.7 版本的镜像: 通过以下命令进入到 Master 容器内部: 接下来,进入数据库: 接下来执行以下命令: 基础知识 随着业务复杂度的增加,单台 MySQL 数据库服务器已不能满足实际的需求,取而代之的是数据库服务器集群.MySQL 具有支持分布式的特性,能轻松搭建一个支持高并发的 MySQL 数据库服务器集群.在集群中我们必须保

  • MySQL主从同步原理及应用

    目录 1.主从同步原理 主从同步架构图(异步同步) 主从同步流程(异步同步) 什么是binlog? binlog的3种格式 binlog格式对比 主从同步的2种方式 主从同步流程(半同步) 半同步适用场景 2.主从同步应用场景 1.主从同步原理 主从同步架构图(异步同步) 这是最常见的主从同步架构 主从同步流程(异步同步) 主库把数据变更写入binlog文件 从库I/O线程发起dump请求 主库I/O线程推送binlog至从库 从库I/O线程写入本地的relay log文件(与binlog格式一

  • 一文详解MySQL主从同步原理

    目录 1. MySQL主从同步实现方式 2. MySQL主从同步的作用 一主多从架构 双主多从架构 3. 主动同步的原理 4. 主从同步延迟问题 主从同步延迟的原因有哪些? 主从同步延迟的解决方案? 5. 如何提升主从同步性能 从库开启多线程复制 修改同步模式,改为异步 修改从库Bin Log配置 知识点总结 1. MySQL主从同步实现方式 MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句. Bin Log共有三种日志格式,可以binlog_format配置

  • MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段 用法注意: 1.distinct[查询字段],必须放在要查询字段的开头,即放在第一个参数: 2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用: 3.DISTINCT 表示对后面的所有参数的拼接取 不重复的记录,即查出的参数拼接每行记录

  • JS前端中的设计模式和使用场景示例详解

    目录 引言 策略模式 1.绩效考核 2.表单验证 策略模式的优缺点: 代理模式 1.图片懒加载: 2.缓存代理 总结 引言 相信大家在日常学习和工作中都多多少少听说/了解/使用过 设计模式,我们都知道,使用恰当的设计模式可以优化我们的代码,那你是否知道对于前端开发哪些 设计模式 是日常工作经常用到或者必须掌握的呢?本文我将带大家一起学习下前端常见的设计模式以及它们的 使用场景!!! 本文主讲: 策略模式 代理模式 适合人群: 前端人员 设计模式小白/想知道如何在项目中使用设计模式 策略模式 策略

  • 详解polyfills如何按需加载及场景示例详解

    目录 前言 青铜时代 火枪时代 webpack添加babel-loader @babel/preset-env @babel/polyfill 配置 useBuiltIns 加入 @babel/plugin-transform-runtime 前言 青铜时代 最使前端头痛的问题,莫过于浏览器兼容性,无论是js,还是css都要考虑浏览器兼容性问题,在webpack出来之前,这无非是一个非常头疼的问题,查到一个兼容性问题,查找很多资料,解决一下,再出来一个问题又要花很长时间解决一下,这无疑要花费很长

  • Gin与Mysql实现简单Restful风格API实战示例详解

    目录 It works main.go 编译运行 数据库 CURD 增删改查 增 查 查询列表 Query 查询单条记录 QueryRow 改 删 组织代码 封装模型方法 Handler函数 组织项目 数据库处理 数据model封装 handler 路由 分组路由 app入口 总结 我们已经了解了Golang的Gin框架.对于Webservice服务,restful风格几乎一统天下.Gin也天然的支持restful.下面就使用gin写一个简单的服务,麻雀虽小,五脏俱全.我们先以一个单文件开始,然

  • MySQL主从同步原理介绍

    概述 Mysql的Replication(复制)是一个异步的复制过程,从一个 Mysql instance(我们称之为 Master)复制到另一个Mysql instance(我们称之 Slave).在 Master 与 Slave之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在Master端. 主从同步需求 要实现 MySQL 的 Replication ,首先必须打开 Master 端的BinaryLog(mysq

  • MySQL中sleep函数的特殊现象示例详解

    前言 MySQL中的系统函数sleep,实际应用的场景不多,一般用来做实验测试,昨天在测试的时候,意外发现sleep函数的一个特殊现象.如果在查询语句中使用sleep函数,那么休眠的时间跟返回的记录有关. 如下测试所示: mysql> create table test(id int); Query OK, 0 rows affected (0.03 sec) mysql> select *, sleep(6) from test; Empty set (0.00 sec) mysql>

随机推荐