MySQL主从复制与读写分离

目录

一、主从复制

1、概念

2、主从复制的工作过程

3、主从复制实验演示

二、读写分离

1、概念

2、原理

3、目前较为常见的MySQL读写分离种类

4、读写分离实验演示

总结:


一、主从复制

1、概念

随着业务流量的增长,对数据库的要求更高,单台数据库有时会因为负载过重而导致单点故障,为了提高MySQL数据库的性能,一般都会采用主从复制的方法去解决单点故障的问题。主从复制中分为主服务器(master)和从服务器(slave)。MySQL默认采用异步复制方式,这样从服务器不用一直访问主数据库来更新自己的数据。从数据库复制主服务器,数据放在二进制文件当中,例如:mysqlbin.000001,记录完整的sql语句。

为什么复制:保证数据完整性

谁复制谁:slave从数据库复制master主数据库

数据放在什么地方:二进制日志文件当中 mysql-bin.000001----->记录完整的sql。slave从会复制二进制日志到本地的节点当中,保存为中继日志,最后基于这个中继日志,进行"恢复"操作。将执行的sql同步执行在自己的数据库内部内部,最终达到和master主数据一致。

mysql支持的复制类型

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

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

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

2、主从复制的工作过程

(1)Master节点将数据的改变记录成二进制日志(bin log),当Master上的数据发生改变时,则将其改变写入二进制日志中。

(2)Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求 Master的二进制事件。

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

总结:

(1)当客户端通过访问动态页面到写入主数据库时,主数据库会将新写入的数据的记录保存在二进制日志文件当中。

(2)此时,从数据库的I/O接口监听到主数据的二进制日志文件发生了更新,则向主数据库的dump线程发出同步请求。

(3)主数据库的dump线程从睡眠状态中被唤醒,监听到I/O线程的请求后,会读取主数据库中二进制日志更新的数据,然后响应I/O线程的请求,并把二进制日志更新的数据转发给从数据库的I/O线程。

(4)I/O线程接收到dump线程转发的二进制日志更新的数据后,将其存放在中继日志中。

(5)从服务器的SQL线程读取中继日志的数据,并存放在本地数据库中。

(6)至此,主从复制过程完成。

注:

(1)中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。

(2)复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作。

3、主从复制实验演示

主数据库:

从数据库1:

从数据库2:

主数据库:

从数据库1:

从数据库2:

测试:

主数据库:

从数据库1:

从数据库2:

二、读写分离

1、概念

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

为什么要读写分离:因为数据库的"写"(写10000条数据可能要3分钟)操作是比较耗时的。但是数据库的"读"(读10000条数据可能只要5秒钟)。所以读写分离,解决的是,数据库的写入,影响了查询的效率。

什么时候要读写分离 :数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

2、原理

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据库。

3、目前较为常见的MySQL读写分离种类

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

在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。

优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。

但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

(2)基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。

(1)MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。

(2)Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。

(3)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

注:

由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的。

Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。

4、读写分离实验演示

主数据库:名称:192.168.11.10 ip地址:192.168.11.10

从数据库1:名称:mysql2 ip地址:192.168.11.22

从数据库2:名称:mysql3 ip地址:192.168.11.23

amoeba服务/客户端:名称:mysql4 ip地址:192.168.11.24

amobe服务/客户端:

主数据

amobe服务/客户端

测试:

通过主从复制的方式,创建一个新的数据库进行测试,然后关闭主从复制功能。

1、关闭主从复制

主数据插入一条新的记录

从数据库1插入一条新的记录

从数据库2插入一条新的记录

amoeba服务/客户端查看数据库的表,发现只能以轮询的方式查看到两个从数据库的的信息表

主数据可以看到刚刚客户端添加的记录,但是两个从服务器看不到刚刚添加的记录,因为没有开启主从复制,从服务器同步不了主数据库的数据。

2、恢复主从复制

总结:

当开启读写分离时:

当未开启主从复制功能时,主从数据库都各自插入一条记录,都只能查看到各自插入的记录。从客户端查看数据库的信息时,客户端只能以设置好的访问策略(轮询、加权、hash等)分别查看到两个从服务的信息。当客户端插入一条新的记录时,主数据库上可以查看到此记录,但是两个从数据库上却看不到,这是因为没有开启主从复制功能,从数据库未能复制主服务器更新的数据。同时,客户端也还是只能查看到两个从数据库的信息(没有更新主数据库的数据)

当开启主从复制功能时,从数据库会同步主数据库的更新信息。所以,当客户端查看数据库信息的时候,虽然还是只能看到从数据库的信息,但是其中的信息也会包含主数据的信息。当客户端插入一条新的信息的时候,主数据可以看到客户端插入的新信息,从数据库不仅可以看到自己往数据库中插入的信息,也能看到主数据的信息,这是因为主从复制功能的开启。

相关推荐
师太,答应老衲吧42 分钟前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml42 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
Channing Lewis2 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
追风林2 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
毕业设计制作和分享3 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil273 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk4 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境4 小时前
第02章 MySQL环境搭建
数据库·mysql
knight-n4 小时前
MYSQL库的操作
数据库·mysql
包饭厅咸鱼5 小时前
QML----复制指定下标的ListModel数据
开发语言·数据库