MySQL主从复制与读写分离 及其实例

目录

主从复制与读写分离

1、MySQL主从复制原理

1.1、MySQL的复制类型

1.2、MySQL主从复制的工作过程

1.3、mysq支持的复制类型

1.4、 数据流向

1.5、主从复制的工作过程

2、读写分离

2.1、什么是读写分离?

2.2、为什么要读写分离呢?

2.3、什么时候要读写分离?

2.4、MySQL 读写分离原理

2.5、读写分离的分类:

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

2、基于中间代理层实现

3、实现主从复制

3.1、时间设置一致

3.2、主服务器的MySQL配置

4、读写分离

4.1、安装java环境

4.2、安装 Amoeba软件

4.3、修改数据库配置文件

4.4、测试读写分离


主从复制与读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

1、MySQL主从复制原理

1.1、MySQL的复制类型

基于语句的复制
基于行的复制
混合类型的复制

1.2、MySQL主从复制的工作过程

 

1.3、mysq支持的复制类型

  1. STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
  2. ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
  3. MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

1.4、 数据流向

 

 主-从 进行复制了解为什么复制? ? ? ?

保证数据完整性谁复制谁 ?

slave角色复制master角色的数据数据放在什么地方?

二进制日志文件当中mwsql-bin.000001------>记录完整的sqslave复制二进制日志到本地节点,保存为中继日志文件的方式最后基于这个中继日志 进行“恢复” 操作,将执行的SQL同步执行在自己的数据库内部,最终达到和master数据一致

dump:

用于监听I/O线程请求

将二进制日志中更新数据发送给slave    I/O线程

1.5、主从复制的工作过程

  1. (1)Master节点将数据的改变记录成二进制日志 (bin lg),当Master上的数据发生改变时,则将其改变写入二进制日志中
  2.  slave节点会在一定时间间隔内Laster的二进制日志进行探测其是否发生改变,如果发生改变,则开始个/0线程请求 aster的二进制事件。
  3. 同时Master节点为每个I/0线程启动一个dump线程,用于向其发送二进制事件,并保存至SLave节点本地的中继日志(Relaylog)中,Slave节点将启动SOL线程从中继日志中读取二进制日志,在本地重放,即解析成 sgL 语句逐一执行,使得其数据和Master节点的保持一致,最后I/0线程和SOL线程将进入睡眠状态,等待下一次被唤醒。同步复制和异步复制

注: ●中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。

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

1.6、 同步复制与异步复制

异步复制

同步复制:

半同步复制

同步复制、半同步复制和异步复制是数据库系统中常见的数据复制技术,用于在多个数据库实例之间保持数据一致性和可用性。

1. 同步复制(Synchronous Replication):在同步复制中,当主数据库(源数据库)执行写操作时,它会等待所有从数据库(目标数据库)都确认已成功接收和应用这些写操作后才返回给客户端。只有在所有从数据库都成功接收和应用了相同的写操作后,主数据库才能继续进行下一步操作。这种方式确保了在任何情况下,所有从数据库都与主数据库保持数据的完全一致性。然而,由于需要等待从数据库的确认,同步复制的性能相对较低,并且可能会受到网络延迟和故障的影响。

2. 半同步复制(Semi-Synchronous Replication):半同步复制是同步复制和异步复制的折衷方案。在半同步复制中,主数据库在执行写操作后,至少等待一个从数据库确认接收并应用了这个写操作,然后才返回给客户端。这个确认过程可以通过网络传输完成。与同步复制相比,半同步复制提供了更高的性能,因为主数据库不需要等待所有从数据库的确认。然而,半同步复制仍然保证了至少一个从数据库与主数据库之间的数据一致性。

3. 异步复制(Asynchronous Replication):在异步复制中,主数据库在执行写操作后,不会等待从数据库的确认,而是立即返回给客户端。从数据库会尽快地复制主数据库的写操作,但时间上可能存在延迟。异步复制具有较高的性能,并且不受网络延迟和故障的限制。然而,由于主数据库和从数据库之间存在一定的时间差,异步复制的数据一致性可能会有所降低。

总结来说,同步复制提供了最高的数据一致性,但性能相对较低;半同步复制在性能和数据一致性之间取得了平衡;异步复制提供了最高的性能,但数据一致性可能有所降低。选择适合的数据复制技术取决于应用程序的需求和对数据一致性和性能的权衡考虑。

2、读写分离

2.1、什么是读写分离?

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

2.2、为什么要读写分离呢?

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

2.3、什么时候要读写分离?

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

2.4、MySQL 读写分离原理

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

2.5、读写分离的分类:

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

3、实现主从复制

关闭安全机制

3.1、时间设置一致

 安装NTP

 配置NTP

重启服务

从服务器设置

与主服务器的时间一致

 两服务器的操作同理

3.2、主服务器的MySQL配置

然后重启

File 列显示日志名,Position 列显示偏移量,偏移量必须相同

从服务器mysql配置文件

两个从服务器配置同理

主服务器进入数据库,创建库

从服务器可以查询到

4、读写分离

4.1、安装java环境

解压完成

修改文件名

在 vim /etc/profile配置文件中添加

4.2、安装 Amoeba软件

安装成功

一主两从服务器同时赋权给amoba服务器

修改amoeba配置文件

4.3、修改数据库配置文件

/usr/local/oeba/bin/oeba start& #启动Amoeba软件,按ctrl+c 返回

查看8066端口是否启动

4.4、测试读写分离

主服务器上创建表

从服务器1

 从服务器2

​​​​​​​主服务器创建数据

客户端查看数据

 因为是轮询算法

客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据

客户端创建数据

 只能在主服务器上查看

主服务器也只能查看写入的数据

在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/120787.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速搭建母婴行业的微信小程序?

如果你想为你的母婴行业打造一个独特的小程序,但没有任何编程经验,别担心!现在有许多小程序制作平台提供了简单易用的工具,让你可以轻松地建立自己的小程序。接下来,我将为你详细介绍搭建母婴行业小程序的步骤。 首先&…

MySQL——MySQL的基础操作部分

使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可: 当看到出现“mysql>“的符号之后,就表示已经进入到了MySQL系统中,就可以输入My&#xf…

Android学习之路(13) Handler详解

1. 简介 Handler是一套 Android 消息传递机制,主要用于线程间通信。 用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message.…

【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录 前言明确目标分析过程企业排行榜的公司信息公司详情页面的招聘信息 代码实现创建项目定义item 创建和编写爬虫文件存储文件修改设置 代码实操总结 前言 上一关,我们学习了Scrapy框架,知道了Scrapy爬虫公司的结构和工作原理。 在Scrapy爬虫公司…

漏洞发现-web应用发现探针类型利用(43)

关于在真实环境下面,这个漏洞该如何发现 这里老师把它分成了三块第一类是 #已知cms 如常见的dedecms,discuz,wordpress等源码结构,这些都是网上比较知名的php源码的cms的名称,这是我们在国内常见的几个程序&#xf…

Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket 在Java中,Socket是一种用于网络通信的编程接口,它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍: Socket类型&…

后端笔试题(2)分频器波形图

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口

冠达管理:“旺季”来临,煤炭板块走高,云煤能源、陕西黑猫涨停

煤炭板块1日盘中发力走高,截至发稿,云煤动力、陕西黑猫涨停,兖矿动力涨超7%,晋控煤业、华阳股份涨超6%,山西焦煤、平煤股份涨超5%。 组织表明,动力大通胀背景下,未来3-5年煤炭供需偏紧的格局仍…

【Spring】SpringBoot的10个参数验证技巧

这里写目录标题 前言1.使用验证注解2 使用自定义验证注解3 在服务器端验证4 提供有意义的错误信息5 将 i18n 用于错误消息messages.properties6 使用分组验证7 对复杂逻辑使用跨域验证8 对验证错误使用异常处理9 测试你的验证逻辑10 考虑客户端验证总结 前言 参数验证很重要&am…

mysql-1:认识mysql

文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史:SQL语言分类 数据库概述 什么是数据库 数据库就是[存储数据的仓库],其本质是一个[文件系统],数据按照特定的…

简述电子企业MES管理系统解决方案的实施策略

引言:在电子制造企业中,随着产品种类的增多和订单数量的增长,传统的手工管理方式已经无法满足企业的生产需求。为了提高生产效率,降低成本,提高订单的履行速度和准确性,电子企业需要实施MES管理系统。本文将…

VGA OUT 的PCB设计注意事项

VGA(Video Graphics Array)即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LcD液晶显示设备的标准接口,具有广泛的应用范围。 VGA OUT PCB设计注意事项: 1、整体布局时&…

混合动力汽车耐久测试

一 背景 整车厂可通过发动机和电机驱动的结合为多款车型提供混合动力驱动技术。汽车集成电机驱动可大大减少二氧化碳的排放,不仅如此,全电动驱动或混合动力驱动的汽车还将使用户体验到更好的驾驶感受,且这种汽车可通过电动机来实现更快的加速…

Jenkins java8安装版本安装

一、首先准备Jenkins、Jdk8、Tomcat9安装包 根据Jenkins官网介绍,Jenkins支持Java8的版本如下: 我们选择2.164版本进行安装,根据版本号支持输入下载地址:https://archives.jenkins.io/war/2.164/jenkins.war,进行下载…

XSS简单介绍

目录 一、认识XSS 1.XSS原理 2.XSS分类 二、XSS漏洞复现 1.搭建靶机进行复现 2.案例解析 2.1第一关 2.2第二关 2.3第三关 2.4第四关 一、认识XSS 1.XSS原理 XSS跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,…

skywalking springgateway 全链路

环境 spring-cloud-gateway 3.1.0 springGateway整合skywalking skywalking 默认是不整合springGateway的,需要手动拷贝skywalking optional-plugins下的 apm-spring-cloud-gateway-N.x-plugin-8.13.0.jar 和 apm-spring-webflux-5.x-plugin-8.13.0.jar 架包拷贝到plugins目…

C# 采用3DES-MAC进行签名 base64解码与编码

** 3DES-MAC ** 3DES-MAC(Triple Data Encryption Standard Message Authentication Code)是一种消息认证码(MAC)算法,用于验证消息的完整性和真实性。3DES-MAC使用了3DES(Triple Data Encryption Standa…

将 Python 与 RStudio IDE 配合使用(R与Python系列第一篇)

目录 前言: 1-安装reticulate包 2-安装Python 3-选择Python的默认版本(配置Python环境) 4-使用Python 4.1 运行一个简单的Python脚本 4.2 在RStudio上安装Python模块 4.3 在 R 中调用 Python 模块 4.4 在RStudio上调用Python脚本写的…

python-wordcloud词云

导入模块 from wordcloud import WordCloud import jieba import imageio import matplotlib.pyplot as plt from PIL import ImageGrab import numpy as npwordcloud以空格为分隔符号,来将文本分隔成单词 PIL pillow模块 img imageio.imread(image.png)这行代码…

PHP8的多维数组-PHP8知识详解

今天分享的是php8的数组中的多维数组,主要内容有:多维数组的概念、创建和输出二维数组、创建和输出三维数组。 1、多维数组的概念 多维数组是包含一个或多个数组的数组。在多维数组中,主数组中的每一个元素也可以是一个数组,子数…