Mysql的复制概念+原理+步骤+方式+优点+GTID简单了解

mysql复制的概念

Mysql的复制就是让一台服务器的数据和其它服务器保持同步一台主库可以同步到多台备库上面,备库也可以作为另一台服务器的主库。主库和备库之间可以有多种不同的组合方式。
MySQL内建的复制功能是构建基于MySQL的大规模,高性能应用的基础。

为什么需要主从复制?

1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。

2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。

3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响正在运行中的业务,如果使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

mysql从3.23版本开始提供复制功能,复制是将主库的DDL和DML操作通过二进制日志传递到复制服务器(从库)上,然后从库对这些日志重新执行(重做),从而使得主库和从库保持数据一致。

在这里插入图片描述对于第一条来说,许多主服务器可以只执行数据的增删改操作,而从服务器提供数据的查询操作。比如基金净增值预测的网站,数据的更新都是管理员更新的,更新的用户比较少,而查询的用户数量比较大,可以设计一台服务器做数据的更新,多台从服务器做数据的查询。

也可以主服务器和从服务器切分查询作业,主服务器也提供读操作,只是当主服务器比较忙时,才会把业务给从服务器。

对于第二条来说,如果在本地备份,备份操作可能会影响会主服务器正常的操作。有时候会降低服务器性能。而且放在本地也不安全,如果主服务器硬盘损坏了,数据可能丢失。

对于第三条,参考做数据的热备。

mysql的复制原理、步骤及方式

复制的方式

(1) 基于行的复制方式
在mysql5.x版本中存在

(2)基于语句的复制方式
一般被称为逻辑复制,在mysql3.x版本中就存在

复制的原理

(3)两种复制方式的原理都是在主库上记录二进制日志,在备库重放日志的方式实现异步数据复制。

意味着在同一时间点,备库上的数据可能存在与主库数据不一致的问题。
并且可能导致主库数据的延迟,一些大的数据可能会出现几秒,几分钟的延迟。后面要探讨的就是如何减少延迟。

主从复制的步骤

在这里插入图片描述

三个线程

MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点。

主节点 binary log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。

从节点I/O线程
当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。

从节点SQL线程
SQL线程负责读取relay log(中继日志)中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。

要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。因为整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作

主从复制的具体步骤

1)、主库记录二进制日志(binlog),每次准备提交事物完成数据库更新前,先记录二进制日志,记录二进制日志后,主库会告诉存储引擎可以提交事物了

2)、备库将主库的二进制日志复制到本地的中继日志(relay log)中,首先,备库会先启动一个工作进程,称为IO工作线程,负责和主库建立一个普通的客户端连接。如果该进程追赶上了主库,它将进入睡眠状态,直到主库有新的事件产生通知它,他才会被唤醒,将接收到的事件记录到中继日志中。

3)、备库的SQL线程执行最后一步,该线程重中继日志中读取事件并且在备库执行,当SQL线程赶上IO线程的时候,中继日志通常记录在系统缓存中,所以中继日志的开销很低。SQL线程也可以根据配置选项来决定是否写入其自己的二进制日志中。

备库复制主库是异地的,不影响主库的读写,在本地重写主库的数据。

简单来说:

1.数据修改写入master数据库的binlog中。
2.slave的IO线程复制这些变动的binlog到自己的relay log中。
3.slave的SQL线程读取并重新应用relay log到自己的数据库上,让其和master数据库保持一致。

其中:

IO线程用于连接master,监控和接受master的binlog

SQL线程用于监控、读取并重放relay log中的日志,将数据写入到自己的数据库中

mysql复制的优点

1.提供了读写分离的能力。

客户端可以从各个slave中读取数据,而写数据则从master上操作。也就是实现了读写分离。

通常遇到读写分离这个词,立刻就能意识到它会分散压力、提高性能。

2.数据库备份时,对业务影响降到最低。
由于MySQL服务器群中所有数据都是一致的(至少几乎是一致的),所以在需要备份数据库的时候可以任意停止某一台slave的复制功能(甚至停止整个mysql服务),然后从这台主机上进行备份,这样几乎不会影响整个业务。

3.提高可用性和故障切换的性能
主服务器发生故障时,可以将从服务器升级为主服务器

4. 提高查询性能

查询处理负载高的情况下,可以通过增加从服务器来实现负载均衡,提高性能

(如果主库出现问题,可以快速切换到从库提供服务

可以在从库执行查询操作,降低主库的访问压力。

可以在从库进行备份,以免备份期间影响主库的服务。)

注意:
由于mysql实现的异步复制,所以主库和从库数据之间存在一定的差异,在从库执行查询操作需要考虑这些数据的差异,一般只有更新不频繁和对实时性要求不高的数据可以通过从库查询,实行要求高的仍要从主库查询

GTID是什么

从 MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

在原来基于二进制日志的复制中,从库需要告知主库要从哪个偏移量进行增量同步,如果指定错误会造成数据的遗漏,从而造成数据的不一致。借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。

GTID 实际上 是由UUID+TID组成的。其中 UUID 是一个 MySQL 实例的唯一标识。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增

个人理解:
GTID相当于主库上的一个标志位,从库会自动识别这个标志位,找到自己需要复制的点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>