MySQL基础(五)主从复制及读写分离

news2024/11/16 21:25:36

目录

前言

一、概述

(一)、MySQL Replication

(二)、MySQL复制类型

(三)、MySQL支持的复制方式

二、部署MySQL主从异步复制

(一)、master(主)

(二)、slave(从)

1.slave1

         2.slave2

三、基于Amoeba读写分离

总结



前言

在企业实际应用中,成熟的业务通常数据量都比较大,而单台MySQL服务器在安全性、高可用性和高并发方面都无法满足实际的需求,我们可以在多台MySQL服务器(Master-Slave)部署 主从复制来实现同步数据,再通过 读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

一、概述

(一)、MySQL Replication

MySQL Replication俗称MySQL AB复制、主从复制、主从同步,是MySQL官方推荐的数据同步技术。数据同步基本过程为从数据库会实时去读取主数据库的二进制日志文件,按照日志中记录对从库进行同样的操作,以达到数据同步效果。

MySQL Replication优点:

  • 通过增加从服务器来提高数据库平台的可靠性。在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器地数量,从而调整数据库平台地高性能。
  • 提高数据安全性,因为数据已复制到从服务器,主数据库异常时,可以将从服务器复制进程终止来达到保护数据完整性地特点。
  • 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而缓解主服务器地性能压力。

(二)、MySQL复制类型

1.异步复制(Asynchronous repication)

MySQL默认地复制是异步地,主库在执行完客户端提交地事务后会立刻将结果返回给客户端,并不关心从库是否已经接受并处理了事务,这样就会有一个问题,主库如果down掉了,此时主上已经提交地事务可能没有传到从库服务器上,如果此时,强制将从提升为主,可能会导致新主上的数据不完整。默认情况下MySQL5.5/5.6/5.7和mariaDB10.0/10.1的复制功能是异步的。

2.全同步复制(Fully synchronous replication)

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响,返回客户端的响应速度也会被拖慢。

3.半同步复制(Semisynchronous replication)

MySQL由Google贡献的补丁才开始支持半同步复制模式,介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接受到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。当出现超时情况时,源主服务器会暂时切换到异步复制模式,直到至少有一台设置为半同步复制模式的从服务器及时收到信息为止。

半同步复制模式在主服务器和从服务器同时启用,否则主服务器默认使用异步复制模式。

(三)、MySQL支持的复制方式

基于SQL语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句,效率比较高。

基于行的复制:主服务器把表的行变化作为事件写入到二进制日志中,主服务器把代表了行变化的事件复制到从服务器中。

混合模式复制:先采用基于语句的复制,一旦发现基于语句无法精确复制时,再采用行。

复制的工作过程

  1. 在每个事务更新完成数据之前,Master会在二进制日志中记录这些数据的语句,当MySQL将事务串行的写入二进制日志完成后,Master通知存储引擎提交事务并将数据写入磁盘
  2. Slave开启一个I/O工作线程,在Master之间建立一个连接,然后开始Binlog dump process,Binlog dump process会从Master的二进制日志中读取操作事件,如果已经跟Master达到一致状态,它会催眠并等待Master产生新的操作事件,I/O线程将这些改变数据的事件写入自己的中继日志。
  3. SQL Slave Thread(SQL工作线程)是处理MySQL Replication过程的最后一步。SQL线程从中继日志读取操作事件,重放其中的事件从而更新Slave服务器的数据,使slave与Master中的数据保持一致,只要该线程与I/O线程保持一致,中继日志通常会在OS的缓存中,所以中继日志的开销很小。

 复制过程的限制

  • MySQL5.6之前的版本复制操作在slave上执行的是串行化的,也就是Master上的并行更新会导致数据复制延迟
  • 所有MySQL服务器的版本都要高于3.2,还有一个基本的原则就是从服务器的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。

二、部署MySQL主从异步复制

yum安装的mariadb

master ip 192.168.100.1

slave1 ip 192.168.100.2

slave2 ip 192.168.100.3

(一)、master(主)

1.在/etc/my.cnf中修改或者增加如下内容

server-id=1

log-bin=mysql-binlog

log-slave-updates=true

systemctl restart mariadb

2、创建Replication用户

登录mysql

grant replication slave on *.* to 'myslave'@'192.168.100.%' identified by'123456';

flush privileges;

show master status;

会显示供slave连接使用,记录下File和Position的值

3、备份Master原有数据

如果在生产环境中Master服务器已经运行一段时间,或者Master服务器上已经存在数据,为了保证所有数据的一致性,需要先将Master目前已有的数据全部导给Slave服务器。

备份的方法有很多,可以直接备份数据文件,也可以使用mysqldump工具。全新搭建的环境不存在数据备份问题。

mysqldump -uroot --all-databases > /root/my.sql

scp /root/my.sql root@192.168.100.2:/root

scp /root/my.sql root@192.168.100.3:/root

(二)、slave(从)

1.slave1

导入Master的备份脚本

mysql -uroot -p < /root/my.sql

登录mysql查看验证

从库连接主库进行测试,如果连接成功说明主库配置成功

mysql -u myslave -p123456 -h 192.168.100.1

修改MySQL配置文件

vim /etc/my.cnf

server-id=2

log-bin=mysql-binlog

log-slave-updates=true

systemctl restart mariadb

在Slave服务器授权,启动从库,进行主从库数据同步

参数说明:

CHANGE MASTER TO

MASTER_HOST='master_host_name', #主服务器的IP地址

MASTER_USER='replication_user_name', #主服务器授权的用户

MASTER_PASSWORD='replication_password', #主服务器授权的密码

MASTER_LOG_FILE='recorded_log_file_name', #主服务器二进制日志的文件名

MASTER_LOG_POS=recorded_log_position; #日志文件的开始位置

登录mysql

sotp slave;

change master to master_host='192.168.100.1',master_user='myslave',master_password='123456',.master_log_file='mysql-binlog.000001',master_log_pos=pos值;

start slave;

show slave status\G;

两处标黄位置必须都是YES,有一处NO都无法成功

测试复制是否成功

在Master服务器上创建一个数据库或者表,到Slave服务器上查看,如果配置成功就可以成功同步。

报以下错误的解决方法:

数据不同步解决方法:

2.slave2

导入Master的备份脚本

mysql -uroot -p < /root/my.sql

登录mysql查看验证

从库连接主库进行测试,如果连接成功说明主库配置成功

mysql -u myslave -p123456 -h 192.168.100.1

修改MySQL配置文件

vim /etc/my.cnf

server-id=3

log-bin=mysql-binlog

log-slave-updates=true

systemctl restart mariadb

在Slave服务器授权,启动从库,进行主从库数据同步

登录mysql

sotp slave;

change master to master_host='192.168.100.1',master_user='myslave',master_password='123456',.master_log_file='mysql-binlog.000001',master_log_pos=pos值;

start slave;

show slave status\G;

测试复制是否成功

在Master服务器上创建一个数据库或者表,到Slave服务器上查看,如果配置成功就可以成功同步。

三、基于Amoeba读写分离

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

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

目前最常见的MySQL读写分离方案有两种:

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

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

2.基于中间代理层实现

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

(1)mysql-proxy为mysql开发早期开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。

(2)Amoeba(变形虫)该程序由java语言及逆行开发,阿里巴巴将其应用于生产环境,它不支持事物和存储过程。

Amoeba IP:192.168.100.4

 Client IP:192.168.100.5

Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for mysql软件,这个软件致力于mysql的分布式数据库前端代理层,主要为应用层访问mysql的时候充当SQL路由功能,并具有负载均衡,高可用性,SQL过滤,读写分离,可路由到相关的目标数据库,可并发请求多台数据库,通过Amoeba能够完成多数据源的高可用,负载均衡,数据切片的功能,目前Amoeba已经在很多企业的生产线上使用。


总结

今天内容易错率非常高,稍微操作不当就会各种请看的出现,细心一定要细心。在总报错的情况下一定要保持沉着冷静,保持头脑清醒才能完成下面的造作

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一起来学shiny把(3)—-添加控件

什么是shiny&#xff1f;Shiny是一个R包&#xff0c;可让您轻松地直接从 R 构建交互式 Web 应用程序&#xff08;应用程序&#xff09;。本系列是个长教程&#xff0c;带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧&#xff08;2&#xff09;》…

【C++11】——右值引用、移动语义

目录 1. 基本概念 1.1 左值与左值引用 1.2 右值和右值引用 1.3 左值引用与右值引用 2. 右值引用实用场景和意义 2.1 左值引用的使用场景 2.2 左值引用的短板 2.3 右值引用和移动语义 2.3.1 移动构造 2.3.2 移动赋值 2.3.3 编译器做的优化 2.3.4 总结 2.4 右值引用…

开源盛行:为什么学习国产达梦数据库?

开源盛行&#xff1a;为什么学习国产达梦数据库&#xff1f; 武汉达梦数据库股份有限公司成立于2000年&#xff0c;是国内领先的数据库产品开发服务商&#xff0c;国内数据库基础软件产业发展的关键推动者。公司为客户提供各类数据库软件及集群软件、云计算与大数据等一系列数据…

【数据结构】·顺序表函数实现·赶紧学起来呀

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

element-ui使用动态渲染下拉选择框el-select已经选择的下拉框的值不可以重复选择让其disabled

调接口拿到下拉框数据的数据的时候将其disabled全为true 但是如果编辑的时候就需要与详情接口对比&#xff0c;如果有id一致就将disabled为true if (res.code 0) {if (this.dialogtitle "新增合同") {res.data.map((v) > {v.nameUnitVoList.forEach((item) >…

九耶:产品经理面试题 ——请说说工作中你主导的产品上线后你会关注哪些数据指标?

【面试官考察的点】 实际的产品工作中需要通过数据驱动业务&#xff1a;产品经理了解用户对不同功能的使用情况&#xff0c;行为特征和使用反馈&#xff0c;这样可以为产品的改进提供很好的方向。面试官想考察你是否具备数据分析的意识和能力。 【满分回答】 在产品上线后&am…

百度开发者平台API地理编码,根据地址获取经纬度

地理编码 | 百度地图API SDK (baidu.com) 原始csv # encoding:utf-8 import requests import csv import json # 接口地址 url "https://api.map.baidu.com/geocoding/v3"# 此处填写你在控制台-应用管理-创建应用后获取的AK ak "XXXXXXX"# 创建CSV文件并…

vue 实现拖拽效果

实现方式&#xff1a;使用自定义指令可以实现多个面板拖拽互不影响 1.自定义指令 js directives: {// 拖拽drag(el) {el.onmousedown function (e) {let x e.pageX - el.offsetLeftlet y e.pageY - el.offsetTopdocument.onmousemove function (e) {el.style.left e.pag…

掌握Python的X篇_12_如何使用VS Code调试Python程序

本篇将会介绍如何使用VS Code调试Python程序。 文章目录 1. 什么是调试2. 断点3. 如何启动调试4. 监视窗口5. 单步 1. 什么是调试 我们可以利用VS Code对Python代码进行调试。所谓调试&#xff0c;大家可以理解成有能力将程序进行 “慢动作播放”让我们有机会看到程序一步一步…

一文2500字详解如何使用mock.js实现接口测试的自动化

这篇文章主要为大家介绍了如何使用mock.js实现接口测试的自动化详解&#xff0c;有需要的朋友可以借鉴参考下&#xff0c;希望能够有所帮助&#xff0c;祝大家多多进步&#xff0c;早日升职加薪 Mock.js 基础用法介绍 Mock.js是一个常用于生成随机数据和拦截Ajax请求的JavaScr…

linux基础学习

1.day1 1、修改虚拟机的网络&#xff1b; sudo vim /etc/netplan/*.yaml sudo netplan apply 2.day2 1、VIM配置&#xff1b; 2、安装SSH&#xff0c;调用putty接入终端&#xff1b; 3、shell命令&#xff1b; *&#xff1a;匹配任意长度的字符 &#xff1f;&#xff1a;匹…

关于前端框架vue2升级为vue3的相关说明

一些框架需要升级 当前&#xff08;202306&#xff09; Vue 的最新稳定版本是 v3.3.4。Vue 框架升级为最新的3.0版本&#xff0c;涉及的相关依赖变更有&#xff1a; 前提条件&#xff1a;已安装 16.0 或更高版本的Node.js&#xff08;摘&#xff09; 必须的变更&#xff1a;核…

CAN总线开发必看! 如何使用CANlib检测CAN帧溢出情况? Kvaser三招帮你轻松解决

从1980年代&#xff0c;Kvaser就开始CAN产品的研发&#xff0c;在相关产品开发领域有近40多年的经验&#xff0c;对CAN和相关总线技术有着非常深入的研究。广州智维电子科技是KVASER的中国引进者&#xff0c;我们会不定期分享一些有趣的发现和特定情况的技术处理。 在开发严重…

美国过境签证申请也要面签吗?

随着人们出国旅行的增加&#xff0c;美国过境签证成为了一个热门话题。对于许多人来说&#xff0c;了解美国过境签证的流程和要求非常重要。在这篇文章中&#xff0c;知识人网小编将介绍美国过境签证是否需要面签&#xff0c;以及相关的注意事项。 首先&#xff0c;让我们来了解…

Redis7学习笔记01

一、redis7实战教程简洁 1、大纲&#xff1a; ①、适合对象&#xff0c;从小白到熟手&#xff0c;一套全包圆 ②、Redis专题-大厂面试题&#xff0c;含100道 ③、Redis专题-真实需求生产真实案例 ④、Redis7新特性 2、小白篇高阶篇&#xff1a; 3、大厂面试题&#xff1a…

web场景-静态资源规则与定制化

一、SpringBoot默认静态资源路径 1.1 静态资源放在类路径下: /static/public/resources/META-INF/resources 1.2 浏览器访问&#xff1a; 当前项目根路径/ 静态资源名 eg&#xff1a;如上图&#xff0c;要想访问这四张图片&#xff0c;访问路径依次为&#xff1a;localhos…

1400*C. Computer Game

Example input 6 15 5 3 2 15 5 4 3 15 5 2 1 15 5 5 1 16 7 5 2 20 5 7 3 output 4 -1 5 2 0 1 解析&#xff1a; k个电&#xff0c; 第一种为 k>a 时&#xff0c;只玩游戏 k-a; 第二种&#xff0c;k>b,一边玩一边充电 k-b 问完成n轮游戏的情况下&#xff0c;优先第…

被逼无奈在小公司熬了2年,现在我终于进了腾讯测试岗...

其实两年前校招的时候就往腾讯投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里&#xff0c;想着总有一天会再次挑战的。 其实这两年除了工作以外&#xff0c;其余时间基本上都在学习&#xff0c;打磨自己…

基于OpenCV solvePnP函数估计头部姿势

人脸识别 文章目录 人脸识别一、姿势估计概述1、概述2、姿态估计3、在数学上表示相机运动4、姿势估计需要什么5、姿势估计算法6、Levenberg-Marquardt 优化 二、solvePnP函数1、函数原型2、参数详解 三、OpenCV源码1、源码路径 四、效果图像示例参考链接 一、姿势估计概述 1、…

vue中通过JavaScript实现web端鼠标横向滑动触控板滑动效果-demo

JavaScript实现web端鼠标横向滑动&触控板滑动效果 支持鼠标拖动滑动&触控板滑动效果 web端实现滑动&#xff0c;就是对鼠标按下、鼠标松开、鼠标移动事件进行监听 效果图 代码 结构代码 <template><div class"swiper"><div class"co…