11

MySQL主从同步 - Lag_range

 2 years ago
source link: https://www.cnblogs.com/lag-range/p/16924121.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1.什么是MySQL主从同步?

       “主”指的是MySQL主服务器(master),负责写请求。“从”指的是MySQL从服务器(slave),负责读请求。主从同步指的是将主服务器上的数据同步至从服务器。

2.为什么需要主从同步?

      针对大流量,一台服务器已经不能满足要求。这个时候往往是将MySQL集群部署,但是这样会存在数据一致性的问题,即客户端相同的请求,访问不同的节点,如何能够得到相同的访问结果。通常的部署架构有一主多从和多主多从。

一主多从,主服务器负责写请求,从服务器负责读请求,从服务器的数据同步自主服务器。每台服务器都拥有所有的数据,因此可以解决数据一致性问题。使用多台服务器共同来处理请求,也达到了负责均衡的效果,之所以从服务器比主服务器多,原因是实际生产中,读请求远多于写请求。

1533867-20221130230640698-1606692.png

 多主多从,一主多从在业务量大的时候,主库的写入速度就会成为性能瓶颈。这个时候可以使用分库分表,让数据分布在多个master中,每个master又有多个从库,负责写请求。那么client端在请求数据时,怎么知道数据在哪个节点上呢?对于分库分表,每个表都会有一个字段作为分库键,中间件(比如MyCat)在查询时会根据分库键计算出数据在哪一个库上。

 

1533867-20221201220049079-1630271674.png
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--逻辑库,物理层面由db1、db2、db3组成-->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!--逻辑表,由不同的数据库中的表组成-->
        <table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot" />
    </schema>
    <!--dataNode,可以理解为一个master和他的从库组成的一个逻辑节点-->
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <!--dataNode的连接信息-->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" 
        dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <!--主节点(master节点)-->
        <writeHost host="hostM1" url="localhost:3306" user="root"  password="root">   
            <!--从节点(slave节点)-->
            <readHost host="hostS2" url="192.168.1.200:3306"user="root"password="root" />
        </writeHost>
    </dataHost>
</mycat:schema> 

3.主从同步如何使用?

3.1 配置主节点

  • 配置log_bin和server_id

在/etc/my.cnf中增加如下配置

log-bin=mysql-bin # binlog名称
server-id=1 # 服务器id
  • 创建复制账号
create user 'data_copy'@'%' identified by 'Test@1234';   # 创建复制账号

grant FILE on *.* to 'data_copy'@'192.168.126.132' identified by 'Test@1234'; # 授予复制账号FILE权限,允许从库IP访问主库

grant replication slave on *.* to 'data_copy'@'192.168.126.132' identified by 'Test@1234'; # 授予账号主从同步权限

flush privileges; # 刷新权限
  • 重启服务器

service mysql start

  • 查看主服务器状态
1533867-20221203222455427-555968649.png

3.2 配置从节点

  • 配置server_id

在/etc/my.cnf中增加如下配置

server-id=2 # 服务器id
  • 重启服务器

service mysql start

  • 在从节点上配置主节点信息
stop slave; 

# 设置当前服务器对应的master change master to master_host='192.168.126.134', master_user='data_copy' ,master_password='Test@1234', master_log_file='mysql-bin.000005' ,master_log_pos=0; start slave;
  • 查看从节点状态

show slave status \G;

1533867-20221203225926454-355416614.png

 

4.主从同步的原理

4.1 主从同步的步骤

1533867-20221204133945975-1511014086.png

  如上图,复制主要分为以下几个步骤:

1.主库将数据的更改记录到二进制文件中(binary log)

2.从库连接主库,此时会在从库上创建两个线程:I/O线程和SQL线程,在主库上创建一个线程:Binlog Dump线程。可以在主库和从库上使用 SHOW PROCESSLIST命令查看

Binlog Dump线程

1533867-20221204134241112-1773185291.png

I/O线程和SQL线程

 

1533867-20221204134320232-1020708207.png

3.Binlog Dump线程会将Binlog中的事件发送给从库

4.从库中的I/O线程接收到事件后,将事件写入relay log

5.SQL线程重放relay log中的事件,达到将主库的数据复制到从库的目的

从以上的步骤可以看出,这种复制架构将事件获取和事件重放完全解耦开来。是典型的生产者和消费者模式的运用,mysql主线程负责生产Binlog,Binlog Dump线程负责消费;I/O线程负责生产relay log,SQL线程消费relay log。

4.2 主从同步原理

基于语句的复制

基于语句的复制,binlog会记录造成数据或者表结构更改的语句,从库重放事件时,相当于把这些语句再执行一遍。

基于行的复制

基于行的复制,binlog直接记录更改后的数据

这两种模式各有优劣,mysql会在这两种模式之间动态切换。

5.主从同步的延迟问题

 由于主从同步是异步的,难免会存在主从同步延迟问题,一般情况下这种延迟可以忽略,但是对于数据一致性要求比较高的场景,就必须想办法解决。

1.对于不能容忍半点数据不一致的情况:强制读主库

2.对于可以稍微容忍不一致的情况:可以在卸库完成后,sleep 500m后再读取


Recommend

  • 53
    • blog.51cto.com 7 years ago
    • Cache

    Mysql主从同步-LINUX系统运维

    什么是Mysql主从同步?从库同步主库上的数据,(让其他数据库服务器自动同步当前正在被访问的数据服务器上的数据)主从同步的结构类型1主------>1从(常用)一台主服务器(负责业务更新)一台从服务器1主------->多从(常用)一台主服务器(负责业务更新)多...

  • 57

    day05一、数据备份与恢复-增量备份和增量恢复a.binlog日志介绍(二进制文件):使用Mysql数据库服务日志文件类型的一种。记录除查询之外的sql命令。默认没启用查询的sql包括:selectdescshow不是查询的命令:insertupdatedeletecreatedropgrantrevokeb.启用binlog...

  • 65
    • wsgzao.github.io 6 years ago
    • Cache

    Redis 主从同步配置实践

    Redis 是一个高性能的 key-value 数据库,作为一个典型的内存数据库,高速读写性能并支持数据持久化是大多数人选择 Redis 的原因,当然 Redis 也有很多局限,即使现在升级至 5.0 在技术圈仍有很多不同的声音。Redis 监控可以通过 Keepaliv...

  • 47
    • down.51cto.com 6 years ago
    • Cache

    SQL Server 2008 R2 主从数据库同步

    SQL Server 2008 R2 主从数据库同步技术文档,截图+详细说明

  • 13

    我所理解的MySQL(六)分库分表与主从同步 Planeswalker23 2020年11月11日 共8,255字 101次浏览

  • 8
    • zzyongx.github.io 3 years ago
    • Cache

    排查redis主从复制lag不断增大问题

    排查redis主从复制lag不断增大问题 redis以主从模式部署时,监控主从是否同步非常重要。我们在master执行 info replication 命令并监控 slave# 的值。 slave#的值类似这种 ip=10.14.11.12,port=6379,st...

  • 9
    • blog.51cto.com 2 years ago
    • Cache

    MySql主从同步介绍

    大家好,Mysql是大家最常用的数据库,下面为大家带来mysql主从同步知识点的分享,以便巩固mysql基础知识,如有错误,还请各位大佬们指正。2 MySql主从同步概述MySQL主从同步,即MySQL Replication,可以实现将数据从一台数据库服务器同步到...

  • 4

    Step 1 — Master数据库服务器配置 [root@server155 ~]# nano /etc/my.cnf GNU nano 2.0.9 File: /etc/my.cnf# For advice on how to change settings...

  • 3
    • blog.51cto.com 2 years ago
    • Cache

    使用docker实现mysql主从同步

           本文是以最少步骤的安装,仅实现了在docker下mysql的主从同步 1. 创建Docker镜像        创建两个MySQL版本:5.7的镜像,一个容器名称为master,另一个为slaver。 docker run -d --name master...

  • 11

    Mysql主从、双主及主从同步1236错误最近迁机房,Mysql集群换到新环境出现主从不一致的情况,具体为1236报错,集群架构采用的是双主+keepalived高可用,测试了几种恢复的方法,记录一下。Last_IO_Error: Got...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK