数据库面试知识点(七)主从复制和读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力

在这里插入图片描述

一、主从复制

1.mysq 支持的复制类型

1) 基于语句的复制。在服务器上执行 sql 语句,在从服务器上执行同样的语句,mysql 默认采用基于语句的复制,执行效率高。

2) 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

3) 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

2.主(Master)从(Slave)复制的工作过程

1) 在每个事务更新数据完成之前,master 在二进制日志记录这些改变。写入二进制日志完成后,master 通知存储引擎提交事务。

2) Slave 将 master 的 binary log 复制到其中继日志。首先 slave 开始一个工作线程(I/O),I/O 线程在 master 上打开一个普通的连接,然后开始 binlog dump process。binlog dump process 从 master 的二进制日志中读取事件,如果已经跟上 master,它会睡眠并等待 master 产生新的事件,I/O 线程将这些事件写入中继日志。

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

在这里插入图片描述

3.主从复制的几种方式

  • 同步复制: master 的变化,必须等待 slave-1,slave-2,…,slave-n 完成后才能返回。 这样,显然不可取,也不是 MySQL 复制的默认设置。比如,在 WEB 前端页面上,用户增加了条记录,需要等待很长时间。

  • 异步复制:如同 AJAX 请求一样。master 只需要完成自己的数据库操作即可。至于 slaves 是否收到二进制日志,是否完成操作,不用关心,MySQL 的默认设置。

  • 半同步复制:master 只保证 slaves 中的一个操作成功,就返回,其他 slave 不管。 这个功能,是由 google 为 MySQL 引入的。

4.随着应用的日益增长,读操作很多,我们可以扩展 slave,但是如果 master 满足不了写操作了,怎么办呢?

可以分库【垂直拆分】,分表【水平拆分】。


二、读写分离

读写分离就是在主服务器上修改数据会同步到从服务器从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

在这里插入图片描述

前较为常见的 Mysql 读写分离分为以下两种:

1)基于程序代码内部实现

在代码中根据 select 、insert 进行路由分类,这类方法也是目前生产环境下应用最广泛的。优点是性能较好,因为程序在代码中实现,不需要增加额外的硬件开支缺点是需要开发人员来实现,运维人员无从下手

2) 基于中间代理层实现

代理一般介于应用服务器和数据库服务器之间,代理数据库服务器接收到应用服务器的请求后根据判断后转发到,后端数据库,有以下代表性的程序。

  • mysql_proxy。mysql_proxy 是 Mysql 的一个开源项目,通过其自带的 lua 脚本进行 sql 判断。

不是所有的应用都能够在基于程序代码中实现读写分离,像一些大型的 java 应用,如果在程序代码中实现读写分离对代码的改动就较大,所以,像这种应用一般会考虑使用代理层来实现


【Java 面试那点事】

这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!

这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】

面试路上,你不孤单!
在这里插入图片描述

发布了196 篇原创文章 · 获赞 878 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/104655666
今日推荐