MySQL主从复制

主从复制概述

如何提升数据库并发能力

在实际工作中,我们常常将 Redis 作为缓存与 MySQL 配合来使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出。如果不存在再访问数据库,这样就 提升了读取的效率,也减少了对后端数据库的访问压力。 Redis的缓存架构是高并发架构 中非常重要的一环。

在这里插入图片描述

此外,一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行 读写分离,这样同样可以提升数据库的并发处理能力。但并不是所有的应用都需要对数据库进行主从架构的设置,毕竟设置架构本身是有成本的。

如果我们的目的在于提升数据库高并发访问的效率,那么首先考虑的是如何 优化SQL和索引,这种方式简单有效,其次才是采用缓存的策略,比如使用 Redis将热点数据保存在内存数据库中,提升读取的效率,最后才是对数据库采用主从架构,进行读写分离。

在这里插入图片描述

主从复制的作用

主从同步设计不仅可以提高数据库的吞吐量,还有以下3个方面的作用。

读写分离

我们可以通过主从复制的方式来 同步数据,然后通过读写分离提高数据库并发处理能力。

在这里插入图片描述

其中一个是Master主库,负责写入数据,我们称之为: 写库。

其它都是Slave从库,负责读取数据,我们称之为: 读库。

当主库进行更新的时候,会自动将数据复制到从库中,而我们在客户端读取数据的时候,会从从库中进行读取。

面对“读多写少”的需求,采用读写分离的方式,可以实现 更高的并发访问。同时,我们还能对从服务器进行负载均衡,让不同的读请求按照策略均匀地分发到不同的从服务器上,让 读取更加顺畅。读取顺畅的另一个原因,就是减少了锁表 的影响,比如我们让主库负责写,当主库出现写锁的时候,不会影响到从库进行 SELECT 的读取。

数据备份

我们通过主从复制将主库上的数据复制到了从库上,相当于是一种 热备份机制,也就是在主库正常运行的情况下进行的备份,不会影响到服务。

是具有高可用性

数据备份实际上是一种冗余的机制,通过这种几余的方式可以换取数据库的高可用性,也就是当服务器出现 故障宕机的情况下,可以 切换 到从服务器上,保证服务的正常运行。

关于高可用性的程度,我们可以用一个指标衡量,即正常可用时间/全年时间。比如要达到全年 99.999% 的时间都可用,就意味着系统在一年中的不可用时间不得超过 365*24*60*(1-99.999%) =5.256 分钟(含系统崩溃的时间、日常维护操作导致的停机时间等),其他时间都需要保持可用的状态。

实际上,更高的高可用性,意味着需要付出更高的成本代价。在现实中我们需要结合业务需求和成本来进行选择。

主从复制的原理

slave 会从 Master 读取 binlog 来进行数据同步。

原理剖析

三个线程

实际上主从同步的原理就是基于 binlog 进行数据同步的。在主从复制过程中,会基于 3 个线程 来操作,一个主库线程,两个从库线程。

在这里插入图片描述

二进制日志转储线程 (Binlog dump thread)是一个主库线程。当从库线程连接的时候,主库可以将二进制日志发送给从库,当主库读取事件 (Event)的时候,会在 Binlog 上加锁,读取完成之后,再将锁释放掉。

从库 I/0 线程 会连接到主库,向主库发送请求更新 Binlog。这时从库的I/O 线程就可以读取到主库的二进制日志转储线程发送的 Binlog 更新部分,并且拷贝到本地的中继日志 (Relay log)。

从库 SQL 线程会读取从库中的中继日志,并且执行日志中的事件,将从库中的数据与主库保持同步。

在这里插入图片描述

注意:

不是所有版本的 MySQL都默认开启服务器的二进制日志。在进行主从同步的时候,我们需要先检查服务器是否已经开启了二进制日志。

除非特殊指定,默认情况下从服务器会执行所有主服务器中保存的事件。也可以通过配置,使从服务器执行特定的事件。

复制三步骤

步骤1:Master 将写操作记录到二进制日志 (binlog )。这些记录叫做二进制日志事件(binary log events);

步骤2:Slave将Master 的binary log events拷贝到它的中继日志 ( relay log );

步骤3:Slave 重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步的且串行化的,而且重启后从 接入点开始复制。

复制的问题

复制的最大问题: 延时

复制的基本原则

  • 每个slave 只有一个Master
  • 每个slave 只能有一个唯一的服务器ID
  • 每个 Master 可以有多个 slave

一主一从架构搭建

一台主机 用于处理所有 写请求,一台 从机 负责所有 读请求,架构图如下:

在这里插入图片描述

准备工作

1.准备2台 Centos 虚拟机

2.每台虚拟机上需要安装好MySQL(可以是MySQL8.0)

说明:前面我们进过如何克降一台Centos。大家可以在一台Centos上安装好MySOL,进而通过克隆的方式复制出1台包含MySQL的虚拟机。

注意: 克隆的方式需要修改新克隆出来主机的: ① MAC地址 ② hostname ③ IP 地址 ④ UUID

此外,克隆的方式生成的虚拟机(包含MySQL Server),则克隆的虚拟机MySQL Server的UUID相同,必须修改否则在有些场景会报错。比如: show slave status\G,报如下的错误:

在这里插入图片描述

修改MySQL Server的UUID方式:

vim /var/lib/mysql/auto.cnf

systemctl restart mysqld

主机配置文件

建议mysql版本一致且后台以服务运行,主从所有配置项都配置在[mysqld] 节点下,且都是小写字母.

具体参数配置如下:

  • 必选

    #[必须]主服务器唯一ID
    server-id=1
    
    #[必须]启用二进制日志,指名路径。比如: 自己本地的路径/var/lib/mysql/binlog
    log-bin=/var/lib/mysql/binlog/doudou-bin
    
  • 可选

    #[可选] 0(默认)表示读写 (主机),1表示只读 (从机)
    read-only=0
    
    #设置日志文件保留的时长,单位是秒
    binlog_expire_logs_seconds=6000
    
    #控制单个二进制日志大小。此参数的最大和默认值是1GB
    max_binlog_size=200M
    
    #[可选]设置不要复制的数据库
    binlog-ighore-db=test
    
    #[可选]设置需要复制的数据库,默认全部记录。比如: binlog-do-db=doudou_master_slave
    binlog-do-db=需要复制的主数据库名字
    
    #[可选]设置binlog格式
    binlog_format=STATEMENT
    

重启后台mysql服务,使配置生效。

注意:

  1. 先搭建完主从复制,再创建数据库。
  2. MySQL主从复制起始时,从机不继承主机数据。

从机配置文件

要求主从所有配置项都配置在my.cnf的[mysqld] 栏位下,且都是小写字母。

  • 必选

    #[必须]从服务器唯一ID
    server-id=2
    
  • 可选

    #[可选]启用中继日志
    relay-log=mysql-relay
    

重启后台mysql服务,使配置生效。

注意:主从机都关闭防火墙

service iptables stop #CentOS 6
systemctl stop firewalld.service #CentOS 7

主机: 建立账户并授权

#在主机MySQL里执行授权主从复制的命令
GRANT REPLICATION SLAVE ON *.* TOslave1'@'从机器数据库IP' IDENTIFIED BY abc123';#5.5,5.7

注意:如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:

CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';

#此语句必须执行。否则见下面。
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

flush privileges;

注意:在从机执行show slave status时报错:

Last_l0_Error: error connecting to master 'slave1@192.168.1.150:3306' - retry-time: 60 retries: 1 message:
Authentication plugin 'caching sha2-password' reported error: Authentication requires secure connection.

查询Master的状态,并记录下File和Position的值。

show master status;

在这里插入图片描述

记录下File和Position的值

从机:配置需要复制的主机

步骤1:从机上复制主机的命令

CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;

举例:

CHANGE MASTER TO
MASTER_HOST='192.168.109.26',
MASTER_USER='slave1',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='doudou-bin.000005',
MASTER_LOG_POS=1137;

在这里插入图片描述

在这里插入图片描述

步骤2:

#启动slave同步
START SLAVE;

在这里插入图片描述

如果报错:

在这里插入图片描述

可以执行如下操作,删除之前的relay_log信息。然后重新执行 CHANGE MASTER TO …语句即可。

reset slave;	#删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

查看同步状态:

SHOW SLAVE STATUS\G

在这里插入图片描述

可能错误的原因有:

  1. 网络不通
  2. 账户密码错误
  3. 防火墙
  4. mysql配置文件问题
  5. 连接服务器时语法
  6. 主服务器mysql权限

停止主从复制

  • 停止主从同步命令

    stop slave;
    
  • 如何重新配置主从

    如果停止从服务器复制功能,再使用需要重新配置主从,否则会报错如下:

在这里插入图片描述

重新配置主从,需要在从机上执行:

stop slave;
reset master;	#删除Master中所有的binlog文件,并将日志索引文件清空,重新开始所有新的日志文件(慎用)

同步数据一致性问题

主从同步的要求

  • 读库和写库的数据一致(最终一致);
  • 写数据必须写到写库;
  • 读数据必须到读库(不一定);

理解主从延迟问题

进行主从同步的内容是二进制日志,它是一个文件,在进行 网络传输 的过程中就一定会 存在主从延迟 (比如500ms),这样就可能造成用户在从库上读取的数据不是最新的数据,也就是主从同步中的 数据不一致性问题。

主从延迟问题原因

在网络正常的时候,日志从主库传给从库所需的时间是很短的,即T2-T1的值是非常小的。即,网络正常情况下,主备延迟的主要来源是备库接收完binlog和执行完这个事务之间的时间差。

主备延迟最直接的表现是,从库消费中继日志 (relay log) 的速度,比主库生产binlog的速度要慢。

造成原因:

  • 从库的机器性能比主库要差
  • 从库的压力大
  • 大事务的执行

一般而言,我们最好这样做:

  • 降低多线程大事务并发的概率,优化业务逻辑;
  • 优化SQL,避免慢SQL,减少批量操作,建议写脚本以update-sleep这样的形式完成;
  • 提高从库机器的配置,减少主库写binlog和从库读binlog的效率差;
  • 尽量采用 短的链路,也就是主库和从库服务器的距离尽量要短,提升端口带宽,减少binlog传输的网络延时。
  • 实时性要求的业务读强制走主库,从库只做灾备,备份。

如何解决一致性问题

如果操作的数据存储在同一个数据库中,那么对数据进行更新的时候,可以对记录加写锁,这样在读取的时候就不会发生数据不一致的情况。但这时从库的作用就是备份,并没有起到 读写分离,分担主库读压力的作用。

在这里插入图片描述

读写分离情况下,解决主从同步中数据不一致的问题,就是解决主从之间 数据复制方式的问题,如果按照数据一致性从弱到强 来进行划分,有以下3 种复制方式

异步复制

异步模式就是客户端提交 COMMIT 之后不需要等从库返回何结果,而是直接将结果返回给客户端,这样做的好处是不会影响主库写的效率,但可能会存在主库宕机,而 Binlog 还没有同步到从库的情况,也就是此时的主库和从库数据不一致。这时候从从库中选择一个作为新主,那么新主则可能缺少原来主服务器中已提交的事务。所以,这种复制模式下的数据一致性是最弱的

在这里插入图片描述

半同步复制

MySQL5.5 版本之后开始支持半同步复制的方式。原理是在客户端提交 COMMIT 之后不直接将结果返回给客户端而是等待至少有一个从库接收到了 Binlog,并且写入到中继日志中,再返回给客户端

这样做的好处就是提高了数据的一致性,当然相比于异步复制来说,至少多增加了一个网络连接的延迟,降低了主库写的效率。

在MySQL5.7 版本中还增加了一个 rpl_semi_sync_master_wait_for_slave_count 参数,可以对应答的从库数量进行设置,默认为 1,也就是说只要有 1个从库进行了响应,就可以返回给客户端。如果将这个参数调大,可以提升数据一致性的强度,但也会增加主库等待从库响应的时间。

在这里插入图片描述

组复制

异步复制和半同步复制都无法最终保证数据的一致性问题,半同步复制是通过判断从库响应的个数来决定是否返回给客户端,虽然数据一致性相比于异步复制有提升,但仍然无法满足对数据一致性要求高的场景,比如金融领域。MGR很好地补了这两种复制模式的不足。

组复制技术,简称 MGR (MySQL Group Replication)。是MySQL在5.7.17 版本中推出的一种新的数据复制技术,这种复制技术是基于 Paxos 协议的状态机复制。

MGR 是如何工作的

首先我们将多个节点共同组成一个复制组,在 执行读写(RW)事务的时候,需要通过一致性协议层(Consensus层)的同意,也就是读写事务想要进行提交,必须要经过组里“大多数人”(对应 Node 节点)的同意,大多数指的是同意的节点数量需要大于 (N/2+1),这样才可以进行提交,而不是原发起方一个说了算。而针对只读(RO) 事务则不需要经过组内同意,直接 COMMIT 即可。

在一个复制组内有多个节点组成,它们各自维护了自己的数据副本,并且在一致性协议层实现了原子消息和全局有序消息,从而保证组内数据的一致性。

在这里插入图片描述

MGR将 MySQL带入了数据强一致性的时代,是一个划时代的创新,其中一个重要的原因就是MGR 是基于 Paxos协议的。Paxos 算法是由2013 年的图灵奖获得者 Leslie Lamport于 1990 年提出的,有关这个算法的决策机制可以搜一下。事实上,Paxos 算法提出来之后就作为分布式一致性算法被广泛应用,比如Apache的 ZooKeeper 也是基于Paxos实现的。

知识延伸

在主从架构的配置中,如果想要采取读写分离的策略,我们可以 自己编写程序,也可以通过 第三方的中间件 来实现。

  • 自己编写程序的好处就在于比较自主,我们可以自己判断哪些查询在从库上来执行,针对实时性要求高的需求,我们还可以考虑哪些查询可以在主库上执行。同时,程序直接连接数据库,减少了中间件层,相当于减少了性能损耗。
  • 采用中间件的方法有很明显的优势, 功能强大, 使用简单 。但因为在客户端和数据库之间增加了中间件层会有一些 性能损耗 ,同时商业中间件也是有使用成本的。我们也可以考虑采取一些优秀的开源工具。

在这里插入图片描述

Cobar 属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema,集群日处理在线SOL请求50亿次以上。由于cobar发起人的离职,Cobar停止维护。

Mycat 是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。

OneProxy 基于MySQL官方的proxy思想利用c语言进行开发的,OneProxy是一款商业 收费 的中间件。舍弃了一些功能,专注在 性能和稳定性上。

kingshard 由小团队用go语言开发,还需要发展,需要不断完善

Vitess 是Youtube生产在使用,架构很复杂。不支持MySQL原生协议,使用 需要大量改造成本。

Atlas 是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定

MaxScale 是mariadb (MySQL原作者维护的一个版本) 研发的中间件

MySQLRoute 是MySQL官方Oracle公司发布的中间件

在这里插入图片描述

在这里插入图片描述

主备切换:

在这里插入图片描述

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

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

相关文章

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…

【简陋Web应用2】人脸检测——基于Flask和PaddleHub

文章目录🚩 前言🌺 效果演示🥦 分析与设计🍉 实现🍬 1. 部署人脸检测模型🍭 2. 使用Flask构建app2.1 目录结构2.2 forms.py2.3 utils.py2.4 app.py2.5 index.html🥝 Bug(s)🚩 前言 本…

V2G模式下含分布式能源网优化运行研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 📋📋📋本文目录如下:🎁🎁🎁 目录 💥1 概述 📚2 运行结果 &am…

手写一个简单的RPC框架

学习RPC框架,由繁化简,了解其本质原理 文章目录项目简介什么是RPC?项目模块项目代码common模块client模块server模块framework模块测试项目简介 什么是RPC? RPC(Remote Procedure Call)即远程过程调用&am…

Cursor:GPT-4 驱动的强大代码编辑器

Cursor (https://www.cursor.so/)是 GPT-4 驱动的一款强大代码编辑器,可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜,如下…

SWA Object Detection随机权重平均【论文+代码】

随机权重平均摘要IntroductionSWA实验部分消融实验摘要 您想在不增加推断成本和不改变检测器的情况下提高对象检测器的1.0 AP吗?让我们告诉您一个这样的秘方。这个秘方令人惊讶地简单:使用循环学习率训练您的检测器额外的12个epoches,然后将…

最强的Python可视化神器,你有用过么?

数据分析离不开数据可视化,我们最常用的就是Pandas,Matplotlib,Pyecharts当然还有Tableau,看到一篇文章介绍Plotly制图后我也跃跃欲试,查看了相关资料开始尝试用它制图。 1、Plotly Plotly是一款用来做数据分析和可视…

【数据结构】Java实现队列与循环队列

目录 1. 概念 2. 队列的使用 3. 自己动手实现队列 3.1 MyQueue接口 3.2 LinkedQueue类 3.3 入队列 3.4 出队列 3.5 获取队头元素 3.6 获取队列中有效元素个数与检测队列是否为空 3.7 toString方法 4. 整体实现 4.1 LinkedQueue类 4.2 Test类 4.3 测试结果 5. 循…

while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-7】while实现1到100相加求和 一、案例描述 考核知识点 while循环语句 练习目标 掌握while循环语句。 需求分析 1-100之间的数相加求和,本案例通过while循环语句来实现。 案例分析 效果如图2-10所示。1-100所有数的和 具体实现步骤如下: 在&l…

【进阶数据结构】——红黑树

🌈感谢阅读East-sunrise学习分享——[进阶数据结构]红黑树 博主水平有限,如有差错,欢迎斧正🙏感谢有你 码字不易,若有收获,期待你的点赞关注💙我们一起进步🚀 🌈我们上一…

SpringCloud之 LoadBalancer和Feign负载均衡

文章目录LoadBalancer 负载均衡一、LoadBalanced 负载均衡🌽①观察负载均衡现象🌽②LoadBalanced 源码剖析二、自定义负载均衡三、OpenFeign 实现负载均衡🍆①添加依赖🍆②启动类添加 EnableFeignClients🍆③创建客户端…

MySQL的COUNT语句,竟然都能被面试官虐的这么惨!?

关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐。不信的话请尝试回答下…

一文了解Jackson注解@JsonFormat及失效解决

背景 项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下: spring:jackson:time-zone: Asia/Shanghaiserialization:WRITE_DATES_AS_TIMESTAMPS: true尝试是否关于时间的注解是否会生效,使用JsonForma和JsonFiled均失效。 常…

【Docker】CAdvisor+InfluxDB+Granfana容器监控

文章目录原生命令 docker stats容器监控3剑客CIGCAdvisorInfluxDBGranfanacompose容器编排,一套带走新建目录新建3件套组合的 docker-compose.yml检查配置,有问题才有输出 docker-compose config -q启动docker-compose文件 docker-compose up -d测试浏览…

HTML5 Canvas

HTML5 Canvas <canvas>元素是HTML5中的新元素&#xff0c;通过使用该元素&#xff0c;你可以在网页中绘制所需的图形。 标签定义图形&#xff0c;比如图表和其他图像&#xff0c;您必须使用脚本来绘制图形。在画布上&#xff08;Canvas&#xff09;画一个红色矩形&#…

Java基础知识之HashMap的使用

一、HashMap介绍 HashMap是Map接口的一个实现类&#xff08;HashMap实现了Map的接口&#xff09;&#xff0c;它具有Map的特点。HashMap的底层是哈希表结构。 Map是用于保存具有映射关系的数据集合&#xff0c;它具有双列存储的特点&#xff0c;即一次必须添加两个元素&#xf…

5个高清/4K视频素材网站,免费下载。

本期跟大家分享5个超好用的视频素材网站&#xff0c;4K质量&#xff0c;免费可商用。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库主要提供设计素材为主&#xff0c;自媒体相关素材也很多&#xff0c;像商用图片、背景图、视频素材、音频素材都很齐…

算法刷题总结 (二) 回溯与深广搜算法

算法总结2 回溯与深广搜算法一、理解回溯算法1.1、回溯的概念1.2、回溯法的效率1.3、回溯法问题分类1.4、回溯法的做题步骤二、经典问题2.1、组合问题2.1.1、77. 组合 - 值不重复2.1.2、216.组合总和III - 值不重复且等于目标值2.1.3、17. 电话号码的字母组合 - 双层回溯2.1.4、…

KafKa知识汇总

前言 汇总相关知识 Kafka快速实战与基本原理详解

LeetCode:215. 数组中的第K个最大元素

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;215. 数组中的第K个最大元素 题目描述&#xff1a;给定整数数组nums和整…