MySQL主从复制与读写分离(重要!)

news/2024/7/27 11:49:58/文章来源:https://blog.csdn.net/xmllovezl/article/details/137098086

目录

引言

一、主从复制

1.1 MySQL主从复制原理

1.1.1 为什么进行复制?

1.1.2 谁复制谁?

1.1.3 数据放在什么地方?

1.1.4 MySQL主从版本问题

1.2 MySQL的复制类型

1.3 MySQL主从复制的工作过程

1.4 MySQL主从复制延迟原因

1.5  MySQL主从复制实验部署

1.5.1 实验环境

1.5.2 实验步骤

1.5.3  实验结果验证

二、读写分离

2.1 MySQL读写分离原理

2.1.1 什么是读写分离?

2.1.2 为什么要读写分离?

2.1.3 什么时候要读写分离?

2.2 MySQL读写分离实现方法

2.2.1 基于程序代码内部实现

2.2.2 基于中间代理层实现

2.3 MySQL读写分离实验部署

2.3.1 实验环境

2.3.2 实验步骤

2.3.3 实验结果验证


引言

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

        在企业应用中,成熟的业务通常数据量都比较大,单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求,配置多台主从数据库服务器以实现读写分离。

一、主从复制

1.1 MySQL主从复制原理

  • 从库生成两个线程,一个I/O线程,一个SQL线程;
  • i/o线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
  • 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
  • SQL 线程会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。

1.1.1 为什么进行复制?

答:保证数据的完整性。

1.1.2 谁复制谁?

答:slave角色(从)复制master角色(主)的数据。

1.1.3 数据放在什么地方?

答:二进制文件 mysql-bin-000001--->记录完整的sql,slave复制二进制文件到本地节点,保存为中继日志文件方式,最后基于这个中继日志进行恢复,操作将执行的sql同步到自己的数据库当中,从而达到与master数据的一致性。

1.1.4 MySQL主从版本问题

答:从服务器(slave)的版本一定要高于主服务器(master),确保主服务器的更新可以使从服务器进行同步,保证可以向下兼容

1.2 MySQL的复制类型

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

1.3 MySQL主从复制的工作过程

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

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

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

注:

  • 中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。
  • 复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作。

核心重点:

  • 两个日志:二进制日志和中继日志
  • 三个线程:dump线程、I/O线程和sql线程

1.4 MySQL主从复制延迟原因

  • master服务器高并发,形成大量事务
  • 网络延迟
  • 主从硬件设备导致,cpu主频、内存io、硬盘io等
  • 本来就不是同步复制、而是异步复制

1.5  MySQL主从复制实验部署

1.5.1 实验环境

Master服务器192.168.10.3
Slave服务器192.168.10.4

1.5.2 实验步骤

1、关闭防火墙

systemctl stop firewalld

2、设置防火墙开机不自动启动 

systemctl disable firewalld
setenforce 0

3、 先在主服务器上进行配置时间同步

yum intall ntp -y #安装时间同步软件
vim /etc/ntp.conf
--末尾添加--
server 127.127.10.0							#设置本地是时钟源,注意修改网段
fudge 127.127.10.0 stratum 8				#设置时间层级为8(限制在15内)
service ntpd start  #开启时间同步服务

4、在从服务器上进行配置时间同步

yum install ntp ntpdate -y
service ntpd start
/usr/sbin/ntpdate 192.168.10.3		#进行时间同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.10.3    #设置定时任务:每半小时同步一次时间

 

5、主服务器上进行MySQL配置

vim /etc/my.cnf
log-bin=master-bin			#添加,主服务器开启二进制日志
binlog_format = MIXED
log-slave-updates=true		#添加,允许slave从master复制数据时可以写入到自己的二进制日志

systemctl restart mysqld    #重启MySQL服务
mysql -uroot -p123456
grant replication slave ON *.* to 'myslave'@'192.168.10.%' identified by '123456';
flush privileges;    #给服务器授权
show master status;

 #File 列显示日志名,Position 列显示偏移量

6、从服务器上进行MySQL配置

vim /etc/my.cnf
server-id = 2							#修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin					#添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index	#添加,定义中继日志文件的位置和名称,一般和relay-log在同一目录
relay_log_recovery = 1                  #选配项,当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。

systemctl restart mysqld    #重启MySQL服务

 

1.5.3  实验结果验证

 

 

二、读写分离

2.1 MySQL读写分离原理

  • 只在主服务器(master)上写,只在从服务器(slave)上读
  • 主数据库处理事务性查询,从数据库处理SELECT查询
  • 数据库复制用于将事务性查询的变更同步到集群中的从数据库

2.1.1 什么是读写分离?

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

2.1.2 为什么要读写分离?

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

2.1.3 什么时候要读写分离?

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

2.2 MySQL读写分离实现方法

2.2.1 基于程序代码内部实现

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

优点:性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支。

缺点:需要开发人员来实现,运维人员无从下手。

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

2.2.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语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层。

2.3 MySQL读写分离实验部署

2.3.1 实验环境

Master服务器192.168.10.3
Slave服务器192.168.10.4
Amoeba服务器192.168.10.5
客户机192.168.10.10

2.3.2 实验步骤

1、在amoeba服务器配置java环境

安装Java环境,因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。

cd /opt  #将文件传到该目录下
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64     #赋予执行权限
./jdk-6u14-linux-x64.bin        #启动java程序//按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile    #在末行添加以下内容
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version    #查看java的版本,已验证是否安装成功

2、安装amoeba软件

mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba    #如显示amoeba start|stop说明安装成功

 

3、配置 Amoeba读写分离

先在Master、Slave1的mysql上开放权限给 Amoeba 访问:

grant all on *.* to test@'192.168.10.%' identified by '123456';   

  再回到amoeba服务器配置amoeba服务:

cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml    #修改amoeba配置
文件
--30行--
<property name="user">amoeba</property>
--32行-- 
<property name="password">123456</property>
--115行--
<property name="defaultPool">master</property>
--117-去掉注释-
<property name="writePool">master</property>
<property name="readPool">slaves</property>
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml								#修改数据库配置文件
--23行--注释掉  作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注释
<property name="password">123456</property>
--45--修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.10.15</property>
--52--修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.10.14</property>
--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.10.16</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>

4、验证是否配置成功

/usr/local/amoeba/bin/amoeba start&			#启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java					#查看8066端口是否开启,默认端口为TCP 8066

2.3.3 实验结果验证

测试读写分离

yum install -y mariadb-server mariadb
systemctl start mariadb.service

在客户端服务器上测试:
mysql -u amoeba -p123456 -h 192.168.10.13 -P8066        
//通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从--从服务器

在主服务器上:
use db_test;
create table test (id int(10),name varchar(10),address varchar(20));

在两台从服务器上:
stop slave;                                            #关闭同步
use db_test;
//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');

//在slave2上:
insert into test values('2','lisi','this_is_slave2');

//在主服务器上:
insert into test values('3','wangwu','this_is_master');

//在客户端服务器上:
use db_test;
select * from test;        //客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器上添加的数据

insert into test values('4','qianqi','this_is_client');        //只有主服务器上有此数据

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

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

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

相关文章

云原生(七)、Kubernetes初学 + 裸机搭建k8s集群

Kubernetes简介 Kubernetes&#xff08;通常简称为K8s&#xff09;是一个开源的容器编排平台&#xff0c;最初由Google设计和开发&#xff0c;现在由Cloud Native Computing Foundation&#xff08;CNCF&#xff09;维护。它旨在简化容器化应用程序的部署、扩展和管理。 Kube…

[GN] Spring Security 和 SHiro的配置使用

文章目录 SHiroSpring Security SHiro Shrio安全框架更灵活和简单&#xff0c;代码易读使用简单 但授权第三方登录需要手动实现 配置shrio的核心内容 安全管理器 realm Configuration public class ShiroConfig {//0.配置shrioFilterBean("shiroFilter")public Sh…

什么是跨域问题,SpringBoot如何解决?

目录 什么是跨域&#xff1f;如何解决跨域问题&#xff1f;JSONP (JSON with Padding)CORS(跨源资源共享)CrossOrigin注解实现WebMvcConfigurer addCorsMappingsCorsFilter 代理服务器反向代理(推荐) 什么是跨域&#xff1f; 跨域是指浏览器为了安全性&#xff0c;设定的一种同…

蓝桥杯第八届c++大学B组详解

目录 1.购物单 2.等差素数列 3.承压计算 4.方格分割 5.日期问题 6.包子凑数 7.全球变暖 8.k倍区间 1.购物单 题目解析&#xff1a;就是将折扣字符串转化为数字&#xff0c;进行相加求和。 #include<iostream> #include<string> #include<cmath> usin…

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小&#xff0c;以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别&#xff1f;简述break与continue、return的区别&#xff1f;Arrays类的…

常见的三维建模软件有哪些?

云端地球是一款免费的在线实景三维建模软件&#xff0c;不需要复杂的技巧&#xff0c;只要需要手机&#xff0c;多拍几张照片&#xff0c;就可以得到完整的三维模型&#xff01; 无论是大场景倾斜摄影测量还是小场景、小物体建模&#xff0c;都可以通过云端地球将二维数据向三…

宝塔面板 -- 打包前端项目并部署提升访问速度

文章目录 前言一、打包前端项目二、添加PHP项目三、部署打包文件四、开通防火墙五、运行网站总结 前言 在前面写到的文章使用宝塔面板部署前端项目中&#xff0c;并没有将前端项目打包而是直接部署&#xff0c;导致网站访问速度非常慢&#xff0c;加载甚至要十几秒。因此&…

两张图片相似度匹配算法学习路线

大纲&#xff1a;​​​​​​目标跟踪基础&#xff1a;两张图片相似度算法-腾讯云开发者社区-腾讯云 (tencent.com) 目标跟踪基础&#xff1a;两张图片相似度算法 (qq.com) 一、传统方法 1.欧式距离&#xff08;用于判断是否完全相同&#xff09; [三维重建] [机器学习] 图…

Vue2.x安装Tinymce依赖冲突解决

Vue2.x安装Tinymce依赖冲突原因 使用vue整合tinymce富文本编辑器&#xff0c;安装依赖时报错 报错的原因是下载版本与vue的版本对不上vue2.x版本应该使用如下指定版本依赖更合适 npm install --save "tinymce/tinymce-vue^3.1"额外依赖为 npm install --save &quo…

“和美大桥 共创未来”,共富联合体打响稽东优质春茶金字招牌

2024年3月31日&#xff0c;由日茗康茶业主办&#xff0c;稽东“和美大桥 共创未来”乡村共富联合体协办的“第二届稽东春山好暨日茗康新茶品鉴会”活动在绍兴市柯桥区稽东镇大桥村委举行。 新茶品鉴会上有来自绍兴市、柯桥区、稽东镇的有关领导出席&#xff0c;茶友及行业专家1…

leetcode刷题-字符串

目录 1、Reverse String 反转字符串 2、Reverse String II 反转字符串II 3、Reverse Words in a String 翻转字符串里的单词 4、Find the Index of the FirstOccurrence in a String 实现 strStr() KMP算法 next数组如何建立 模式串和字符串匹配 5、Repeated Substring…

Rust---有关介绍

目录 Rust---有关介绍变量的操作Rust 数值库&#xff1a;num某些基础数据类型序列(Range)字符类型单元类型 发散函数表达式&#xff08;&#xff01; 语句&#xff09; Rust—有关介绍 得益于各种零开销抽象、深入到底层的优化潜力、优质的标准库和第三方库实现&#xff0c;Ru…

【物联网】Qinghub opc-ua 连接协议

基础信息 组件名称 &#xff1a; opcua-connector 组件版本&#xff1a; 1.0.0 组件类型&#xff1a; 系统默认 状 态&#xff1a; 正式发布 组件描述&#xff1a;通过OPCUA连接网关&#xff0c;通过定时任务获取OPCUA相关的数据或通过执行指令控制设备相关参数。 配置文件&a…

鸿蒙HarmonyOS应用开发之Native与ArkTS对象绑定

场景介绍 通过napi_wrap将ArkTS对象与Native的C对象绑定&#xff0c;后续操作时再通过napi_unwrap将ArkTS对象绑定的C对象取出&#xff0c;并对其进行操作。 使用示例 接口声明、编译配置以及模块注册 接口声明 // index.d.ts export class MyObject {constructor(arg: num…

第十八章 算法

一、介绍 1.1 什么是算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获…

微软开源的面向初学者的生成式人工智能课程

介绍 微软开源了一套面向初学者的生成人工智能课程&#xff0c;旨在通过18节课教我们开始构建生成式AI应用程序所需知道的一切。 课程设置&#xff1a; 序号课程1生成式AI和大语言模型导论2探索和比较不同的大语言模型3使用生成式AI4理解提示词工程基础5创建高级提示词6构建…

VSCode - 离线安装扩展python插件教程

1&#xff0c;下载插件 &#xff08;1&#xff09;首先使用浏览器打开 VSCode 插件市场link &#xff08;2&#xff09;进入插件主页&#xff0c;点击右侧的 Download Extension 链接&#xff0c;将离线安装包下载下来&#xff08;文件后缀为 .vsix&#xff09; 2&#xff0c;…

EyouCMS换服务器网站内页出现大量404页面(已解决)

换了服务器后打开网站&#xff0c;内页全部显示404吓死人&#xff0c;去网上查发现是伪静态设置问题&#xff0c;今天就把这个设置方法交给大家&#xff01; 第一步&#xff0c;宝塔面板找到伪静态然后选中THINKPHP 第二步&#xff0c;登录官网后台&#xff0c;清除网站后台缓…

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

问题2-前端json数组数据转换成csv文件

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>将 JSON 数据导出为 CSV 文件</title> …