460-MySQL(主从复制原理)

MySQL集群

在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
1、数据备份 - 热备份&容灾&高可用
2、读写分离,支持更大的并发(有了主从复制,才可以实现读写分离)

读写分离:我们读操作多,写操作少。主库专门写操作,数据的更新,通过binlog同步到从库,客户端的查询请求最终映射到从库上,从库读操作。1主2从。提高后端并发能力和高可用容灾。

服务器中间件:消息队列,缓存,zk。
MySQL的中间件:Mycat进行读写分离配置

主从复制

读写分离就是基于主从复制来实现的。
原理介绍:
在这里插入图片描述
主从就是角色关系
主库用来进行增删改查,从库用来数据的同步和备份。

主库(master)从库(slave)
主库对外提供数据的增删改查服务。主库中涉及到数据的修改都会写binary log。
从库通过专门的线程从主库里面的binlog(二进制日志),把主库里跟数据,权限,表结构相关的修改同步到从库里面。相当于就是后台在主库的所有修改通过主从复制机制体现在从库
好处是可以做一个数据的备份,通过mysql中间件mycat,直接配置热备份&容灾,如果主库挂了,由中间件代理mycat自动把服务的请求映射到从库,又从库继续对外提供服务,这就是容灾,高可用(后端的服务允许一定的异常发生,但是后端的架构服务要可以容错,把这些异常的错误处理掉,并对外重新提供正常的服务)。
在这里插入图片描述
上图中的binlog,我们没有主从复制,也是会写binlog,只不过主从复制就是通过binlog来复制的从库专门有一个I/O线程:专门读取接收主库发过来的binlog的内容,并写到中继日志relay log,相当于做了一个缓冲。并不是把主库的binlog读过来直接执行,这样的不好之处是:主库的binlog的内容可能很多,而从库接收到binlog的内容执行起来比较慢,导致从库的更新速度和主库相差越来越大。

从库还会写一个线程:SQL线程,专门从中继日志读取相应的操作,跟放电影一样,全部的SQL都执行一下,这样,从库的内容和主库的内容同步更新了。

主库master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。

主从复制的流程
2个日志(binlog二进制日志&relay log日志)和3个线程(master的1个线程和slave的2个线程)

1、主库的更新操作写入binlog二进制日志中。
所以,我们的主库要打开二进制日志。因为要把主的数据同步给从。主要写binlog。
2、master服务器创建一个binlog转储线程,将二进制日志内容发送到从服务器。
3、slave机器执行START SLAVE命令会在从服务器创建一个IO线程,接收master的binary log复制到其中继日志(是在内存上放着,日志多,操作多,所以内存可能放不了,会在磁盘上二级存储)。

从线程相当于客户端,是主动来连主库的。
首先slave开始一个工作线程(I/O线程),I/O线程在master上打开一个普通的连接,然后开始 binlog dump process,binlog dump process从master的二进制日志中读取事件,如果已经跟上master(主库上的dump线程已经把binlog的内容发完了,而且主库上binlog没有产生更多的内容,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。)

4、sql slave thread(sql从线程)处理该过程的最后一步,sql线程从中继日志中读取事件,并重放其中的事件而更新slave机器的数据,使其与master的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小。

我们先看一下结果再进行配置

我们把linux作为一个主库。
Windows上的mysql server作为从库。

在这里插入图片描述
从配置主从复制之后开始,两个机器上的数据才是同步的。配置之前,就是什么都不变,都是原来的库表。
主往从同,是单向同步。

配置好之后:
在这里插入图片描述
库同步过来了。
在这里插入图片描述
现在我们在linux的mysql上对这个表插入数据:
在这里插入图片描述
同步了哦!进行了主从复制。

现在linux上的mysql(主)进行 drop 表mytest
在这里插入图片描述
把更改的SQL都记录在binlog里面了。

主库产生binlog dump,专门把二进制的内容发送给从库
在主库上查看当前环境下的线程
在这里插入图片描述
现在,主库上的binlog dump线程已经把主库上的所有二进制数据都发送到从库上了,已经处于阻塞睡眠状态,等待二进制日志的更新,然后继续把事件发送到从库上。
我们在从库上看看:

开启主从复制后,打印是当前正正活动的线程
在这里插入图片描述
从库增加了2个线程。1 是 I/O线程,等主库发送过来的更新的事件。
1 和 2都在waiting,等待,已经读到最新了,等待 relay log的更新。

在这里插入图片描述
下面主库的binlogdump线程,专门发送二进制日志到存库上。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林林林ZEYU

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

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

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

打赏作者

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

抵扣说明:

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

余额充值