java八股文面试[数据库]——mysql主从复制

什么是mysql的主从复制?

        MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表

mysql为什么需要主从同步?

1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

2、做数据的热备

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

4、解决主库的单点故障

主从复制相关线程和文件
# 线程
    dump线程:主库上的线程,从binlog中取出数据交给从库的IO线程
    IO线程:从库上的线程,连接主库dump线程取数据,取到数据写入缓存(relay log中)
    SQL线程:从库上的线程,执行relay log中的SQL语句到数据库中
    
# 文件
    binlog日志:主库上的文件,记录所有更改库表的语句
    master.info:从库上的文件,记录主库的binlog名字和位置点,IO线程更新/读取
    relay-log.info:从库上的文件,记录relay-log里的位置点,上一次SQL线程读取到哪里了,SQL线程更新/读取
    relay-log:从库上的文件,记录从主库binlog拿来的新数据

mysql复制原理是什么?

java八股文面试[数据库]——mysql主从复制_第1张图片

(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

也就是说:

  • 从库会生成两个线程,一个I/O线程,一个SQL线程;

  • I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;

  • 主库会生成一个log dump线程,用来给从库I/O线程传binlog;

  • SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;

注意:

1--master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。

2--slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。

3--Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。

4--Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)

5--master和slave两节点间时间需同步

java八股文面试[数据库]——mysql主从复制_第2张图片

具体步骤:

1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave

2、从库的IO线程和主库的dump线程建立连接

3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求

4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。

5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info

6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge

同步复制(Synchronous replicaton)

同步复制的模式下,主库在提交事务前,必须确认事务在所有的备库上都已经完成提交。即主库是最后一个提交的,在提交前需要将事务传递给从库并完成重放、提交等一系列动作。其优点是任何时候主备库都是一致的,主库的崩溃不会丢失事务,缺点是由于主库需要等待备库先提交事务,吞吐量很低

MySQL的半同步复制

从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。

半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库
出发点是保证主从数据一致性问题,安全的考虑。

半同步复制介于异步复制和同步复制之间。主库在提交事务时先等待,必须确认至少一个从库收到了事件(从库将事件写入relaylog,不需要重放和提交,并向主库发送一个确认信息ACK),主库收到确认信息后才会正式commit。

与同步复制相比,半同步复制速度快很多,因为他只需要至少1个从库确认写入relaylog,并不需要完成在从库上的事务提交,同时又比异步复制更安全,因为主库在提交时,事务至少已经存在2个地方(主库的binlog和从库的relaylog)。由于半同步复制在提交事务前,需要从库返还确认信息,所以这里涉及到网络的往返通信开销,因此半同步复制只适合在网络条件较好的且地理上距离不远的环境部署,否则可能会因为网络延迟大幅降低主库性能。

半同步复制的特点:

从库在连接主库时需要表明它是否支持半同步复制
如果主库启用了半同步复制,且有一个支持半同步复制的从库,则主库上事务提交将等待至少一个从库确认已收到事务,或者直到发生超时。
默认只有在将事务写入其中继日志刷新到磁盘后,主库才会提交事务(也可以配置成提交后等待确认)。
如果没有任何从库确认事务的情况下发生超时,则主库将退化为异步复制。当至少有一个半同步从库赶上时,主库恢复半同步复制。退化与恢复过程都是自动的。
必须在主库和从库上都启用半同步复制,否则使用异步复制。

三种复制方式比较

异步复制:源将事件写入其二进制日志,副本在准备好时请求它们。源不知道副本是否或何时已检索和处理事务,并且无法保证任何事件都会到达任何副本。使用异步复制,如果源崩溃,它已提交的事务可能不会传输到任何副本。在这种情况下,从源故障转移到副本可能会导致故障转移到缺少与源相关的事务的服务器。

java八股文面试[数据库]——mysql主从复制_第3张图片

完全同步复制:当源提交事务时,所有副本也必须在源返回到执行事务的会话之前提交事务。完全同步复制意味着可以随时从源故障转移到任何副本。完全同步复制的缺点是完成事务可能会有很多延迟

java八股文面试[数据库]——mysql主从复制_第4张图片

半同步复制:半同步复制介于异步复制和完全同步复制之间。源等待直到至少一个副本接收并记录了事件(所需的副本数量是可配置的),然后提交事务。源不等待所有副本确认接收,它只需要来自副本的确认,而不是事件已在副本端完全执行并提交。因此,半同步复制保证如果源崩溃,它已提交的所有事务都已传输到至少一个副本。

java八股文面试[数据库]——mysql主从复制_第5张图片

        与异步复制相比,半同步复制提供了改进的数据完整性,因为当一次提交成功返回时,就知道数据至少存在于两个地方。在半同步源收到来自所需数量的副本的确认之前,事务处于暂停状态且未提交。
        与完全同步复制相比,半同步复制更快,因为它可以配置为平衡您对数据完整性的要求(确认收到事务的副本数)和提交速度,提交速度由于需要等待而较慢复制品。
        对于半同步复制,如果源崩溃并且执行到副本的故障转移,则故障源不应该被重用作为复制源服务器,而应该被丢弃。它可能有任何副本未确认的事务,因此在故障转移之前未提交
        与异步复制相比,半同步复制的性能影响是提高数据完整性的权衡。减速量至少是发送提交到副本并等待副本确认接收的 TCP/IP 往返时间。这意味着半同步复制最适合通过快速网络通信的近距离服务器,而对于通过慢速网络通信的远程服务器最差。半同步复制还通过限制二进制日志事件从源发送到副本的速度来限制繁忙会话的速率。当一个用户太忙时,这会减慢它的速度,这在某些部署情况下很有用。

过滤复制

什么是过滤复制
出现原因
让从节点仅仅复制指定的数据库,或指定数据库的指定数据表。主服务器有10个数据库,而从节点只需要同步其中的一两个数据库。这个时候就需要复制过滤。
复制过滤器可以在主节点中实现,也可以在从节点中实现。
过滤复制选择:
主节点
在主节点的二进制事件日志中仅记录与指定数据库(数据表)相关的事件日志,但是主节点的二进制日志不完整,没有记录所有对主节点的修改操作。(不推荐)
如果要使用该方式,则在主节点的配置文件中添加如下参数:
binlog_do_db=”XXX,XXX,XXX”; #数据库白名单列表
binlog_ingore_db=”XXX,XXX,XXX”; #数据库黑名单列表。
但这两个配置参数不要同时使用。
从节点
从服务器的 SQL Thread在Replay中继日志中的事件时,仅读取于特定数据库(数据表)相关的事件,并应用于本地。(但是浪费I/O ,浪费带宽)推荐使用
从节点复制过滤相关设置项:
replicate_do_db =”“; #复制的白名单
replicate_ingore_db =”“; #复制的黑名单
replicate_do_table=”“;
relicate_ingore_table=”“;
replicate_wild_do_table=”“; #更高级别的应用,通配符,应用到哪一类表的。

知识来源:

MySQL主从复制 - 知乎

MySQL复制(二):半同步复制(Semisynchronous replicaiton)_mysql半同步复制_V1ncent Chen的博客-CSDN博客

MySQL半同步复制_mysql 半同步_intqao的博客-CSDN博客

mysql 复制过滤_MySQL过滤复制_Photosource的博客-CSDN博客

你可能感兴趣的:(java八股文,数据库,java,面试)