MySQL之优化服务器设置和复制(一)

优化服务器设置

操作系统状态

CPU密集型的机器

在这里插入图片描述

CPU密集型服务器的vmstat输出通常在us列会有一个很高的值,报告了花费在非内核代码上的CPU时钟;也可能在sy列有很高的值,表示系统CPU利用率,超过20%就足以令人不安了。在大部分情况下,也会有进程队列排队时间(在r列报告的)。如图所示。注意,这里也可能有合理数量的上下文切换(cs列),除非每秒超过100 000次或更多,一般都不用担心上下文切换。当操作系统停止一个进程转而运行另一个进程时,就会产生上下文切换。例如,一查询语句在MyISAM上执行了一个非覆盖索引扫描,就会先从索引中读取元素,然后根据索引再从磁盘上读取页面。如果页面不在操作系统缓存中,就需要从磁盘进行物理读取,着就会导致上下文切换中断进程处理,直到IO完成。这样一个查询可以导致大量的上下文切换。

在这里插入图片描述
如果我们在同一台机器观察iostat的输出(再次剔除显示启动以来平均值的第一行),可以发现磁盘利用率可能低于50%,如图所示。
这台机器不是IO密集型的,但是依然有相当数量的IO发生,在数据库服务器中这种情况很少见。另一方面,传统的Web服务器会消耗大量CPU资源,但是很少发生IO,所以Web服务器的输出不会像这个例子。

IO密集型的机器

在IO密集型工作负载下,CPU花费大量时间在等待IO请求完成。这意味着vmstat会显示很多处理器在非中断休眠(b列)状态,并且在wa这一列的值很高,如果你查询这台机器的iostat输出显示硬盘一直很忙。%util的值可能因为四舍五入的错误超过100%.什么迹象意味着机器是IO密集的呢?只要有足够的缓冲来服务写请求,即使机器正在做大量的写操作,也可能满足,但是却通常意味着可能会无法满足读请求。这听起来好像违反直觉,但是如果思考读和写的本质,就不会这儿认为了:

  • 1.写请求能够缓冲或同步操作。它们可以被任意一层缓冲:操作系统层、RAID控制器层,等等
  • 2.读请求就其本身而言都是同步的。当然程序可以猜测可能需要某些数据,并异步地提前读取(预读)。无论如何,通常程序在继续工作前得到它们需要的数据。这就强制读请求为同步操作:程序必须被阻塞直到请求完成。

想想这种方式:你可以发出一个写请求到缓冲区的某个地方,然后过一会儿完成。甚至可以每秒发出很多这样的请求。如果缓冲区正确工作,并且有足够的空间,每个请求都可以很快地完成,并且实际上写到物理硬盘是被重新排序后更有效地批量操作的。然而,没有办法对读操作这么做——不管多小或多少的请求,都不可能让硬盘响应说"这是你的数据,我等一会儿读它"。这就是为什么读需要IO等待是可以理解的原因

发生内存交换的机器

一台正在发生内存交换的机器可能在swapd列有一个很高的值,也可能不高。但是可以看到si和so列有很高的值,这是我们不希望看到的

空闲的机器

为完整期间,下面也给出一台空闲机器上的vmstat输出。注意,没有在运行或或被阻塞的进程,idle列显示CPU是100%空闲,st列展示了从"虚拟机"偷来的时间
在这里插入图片描述

复制

概述

MySQL内建的复制功能是构建基于MySQL的大规模、高性能应用的基础,这类应用使用所谓的"水平扩展"的架构。我们可以通过为服务器配置一个或多个备库(可能有的地方将会复制备库(replica)称为从库(slave))的方式来进行数据同步。复制功能不仅有利于构建高性能的应用,同时也是提高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。事实上,可扩展性和高可用性通常是相关联的话题。

复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到堕胎备库上,备库背身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。MySQL支持两种复制方式:基于行的复制和基于语句的复制。基于语句的复制(也称逻辑复制)早在MySQL3.23版本中就存在,而基于行的复制方式在5.1版本中才被加进来,这两种方式都是通过在主库上记录二进制日志,在备库重放日志的方式来实现异步的数据复制。这意味着,在同一时间点备库上的数据可能与主库存在不一致,并且无法保证主备之间的延迟。一些大的语句可能导致备库产生几秒、几分钟甚至几个小时的延迟。MySQL复制大部分是向后兼容的,新版本的服务器可以作为老版本服务器的备库,但反过来,将老版本作为新版本服务器的备库通常是不可行的,因为他可能无法解析新版本所采用的新的特性或语法,另外所使用的二进制文件的格式也可能不相同。例如,不能从MySQL5.1复制到MySQL4.0。在进行大的版本升级前,例如从4.1升级到5.0,或从5.1升级到5.5,最好先对复制的设置进行测试。但对于小版本号升级,如从5.151升级到5.1.58,则通常是兼容的。通过阅读每次版本更新的ChangeLog可以找到不同版本间做了什么修改。
复制通常不会增加主库的开销,主要是启用二进制日志带来的开销,但出于备份或及时从崩溃中恢复的目的,这点开销也是必要的。除此之外,每个备库也会对主库增加一些负载(例如网络IO开销),尤其当备库请求从主库读取旧的二进制日志文件时,可能会造成更高的IO开销。另外锁竞争也可能阻碍事务的提交。最后,如果时从一个高吞吐量(例如5 000或更高的TPS)的主库上复制到多个备库,唤醒多个复制线程发送时间的开销将会累加。
通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过复制来扩展写操作。在一主库多备库的架构中,写操作会被执行多次,这时候整个系统的性能取决于写入最慢的那部分。
当使用一主库多备库的架构时,可能会造成一些浪费,因为本质上它会复制大量不必要的重复数据。例如,对于一台主库和10台备库,会有11份数据拷贝,并且这11台服务器的缓存中存储了大部分相同的数据。这和在服务器上有11路RAID 1类似,这不是一种经济的硬件使用方式,但这种复制架构却很常见

复制解决的问题

下面是复制常见的用途。

  • 1.数据分布
    MySQL复制通常不会对贷款造成很大的压力,但在5.1版本引入的基于行的复制会比传统的基于语句的复制模式的带宽压力大,你可以随意地停止或开始复制,并在不同的地理位置来分布数据备份,例如不同的数据中心。即使在不稳定的网络环境下,远程复制也可以工作。但如果为了保持很低的复制延迟,最好有一个稳定的低延迟连接
  • 2.负载均衡
    通过MySQL复制可以将读操作分布到多个服务器上,实现对读密集型应用的优化,并且实现很方便,通过简单的代码修改就能实现基本的负载均衡。对于小规模的应用,可以简单地对机器名做硬编码或使用DNS轮询(将一个机器指向多个IP地址)。当然也可以使用更复杂的方法,例如网络负载均衡这一类的标准负载均衡解决方案,能够很好地将负载分配到不同的MySQL服务器上。Linux虚拟服务器(Linux Virtual Server,LVS)也能很好地工作,
  • 3.备份
    对于备份来说,复制是一项很有意义的技术补充,但复制既不是备份也不能够取代备份
  • 4.高可用性和故障切换
    复制能够帮助应用程序避免MySQL单点失败,一个包含复制的设计良好的故障切换系统能够显著地缩短宕机时间
  • 5.MySQL升级测试
    这种做法比较普遍,使用一个更高版本的MySQL作为备库,保证在升级全部实例前,查询能够在备库按照预期执行。

复制如何工作

在详细介绍如何设置复制之前,让我们先看看MySQL实际上是如何复制数据的。总的来说,复制有三个步骤:

  • 1.在主库上把数据更改记录到二进制日志(Binary Log)中(这些记录被称为二进制日志事件)
  • 2.备库将主库上的日志复制到自己的中继日志(Relay Log)中
  • 3.备库读取中继日志中的事件,将其重放到备库数据之上
    以上只是概述,实际上每一步都很复杂,如图所示在这里插入图片描述

第一步是在主库上记录二进制日志.在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
下一步,备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个共组哦县城,称为IO线程,IO线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程(该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日中的事件。它不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被幻行,贝克IO线程会将接收到的事件记录到中继日志中。
MySQL4.0之前的复制与之后的版本相比改变很大,例如MySLQ最初的复制功能没有使用中继日志,所以复制只用到了两个线程,而不是现在的三个线程。目前大部分人都是使用的最新版本。
备库的SQL线程执行最后异步,该线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新。当SQL线程追赶上IO线程时,终极日志通常已经在系统缓存中,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中。
上图显示了在备库有两个运行的线程,在主库上也有一个运行的线程:和其他普通连接一样,由备库发起的连接,在主库上同样拥有一个线程。
这种复制架构实现了获取事件和重放事件的解耦,允许这两个过程异步进行。也就是说IO线程能够独立于SQL线程之外工作。但这种架构也限制了复制的过程,其中最重要的一点时在主库上并发运行的查询在备库只能串行化执行,因为只有一个SQL线程来重放中继日志中的事件。后面我们将会看到,这是很多工作负载的性能瓶颈所在,虽然有一些针对该问题的解决方案,但大多数用户仍然会受制于单线程

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

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

相关文章

无代码爬虫软件八爪鱼采集器-如何设计判断是、否

我们在设计采集规则的时候,可能会需要判断,比如采集评论的时候“展开更多回复”,就点击这个按钮,像这种情况就可以设计一个判断模块进入 判断模块添加后会自动生成两个,默认都是不判断直接执行,如果我们需要…

网络安全:数据库安全性

文章目录 网络安全:数据库安全性引言数据库安全性的重要性常见的数据库安全威胁数据库安全性的最佳实践数据加密访问控制审计和监控 结语 网络安全:数据库安全性 引言 在前两篇文章中,我们讨论了SQL注入的概念和防范措施。本篇文章将聚焦于…

记一次线上jVM调优

文章目录 问题描述问题分析尝试优化业务代码优化方案修改后代码补充点 问题描述 部门调整,接手一个新项目,为方便后续描述叫user-web,随后推动IT降本,要求根据实际业务量调整服务器实例数量和配置,调整前服务器配置为…

【DevOps】Elasticsearch 数据跨集群同步方案

目录 1、Elasticsearch Cross-Cluster Replication (CCR) 1.1、优点 1.2、缺点 1.3、步骤 1.4、示例 2. Logstash 或其他 ETL 工具 2.1、优点 2.2、缺点 2.3、步骤 3. Apache Kafka 或 RabbitMQ 3.1、优点 3.2、缺点 3.3、步骤 4、使用 Reindex API 进行跨集群同…

基于 Thingsboard 定制开发,国产化企业级、低代码 AIoT 物联网平台

项目源码,文末联系小编 01 ThingsKit 物联网平台 ThingsKit 是基于 Thingsboard 开源物联网平台二次开发,面向中小型企业开箱即用的低代码物联网平台,提供N1N(N个终端产品1个物联网平台N个行业方案)的产品服务矩阵&…

2024爱分析·AI Agent创新成就奖开启申报丨奖项征集

AI Agent正成为企业数字化转型的关键力量。它们不仅提升了工作效率,优化了客户体验,更是在数据分析、决策支持和自动化流程中扮演着至关重要的角色。随着技术的不断进步和应用场景的拓展,AI Agent正以其独特优势,引领企业进入一个…

我的第一个 iOS 程序:iTahDoodle

我的第一个 iOS 程序:iTahDoodle 我的第一个 iOS 程序:iTahDoodle应用功能对象图应用委托对象设置视图为按钮关联动作方法为 UITableView 对象提供数据保存并加载任务数据在模拟器上运行程序下载链接 我的第一个 iOS 程序:iTahDoodle 实现了…

QT——MySQL数据库联用

一、ODBC 1、ODBC简介 ODBC全称为Open Database Connectivity,是一种用于数据库操作的标准接口。要使用ODBC,首先需要安装相应的ODBC驱动程序,然后在系统中配置ODBC数据源。接着,可以通过编程语言(如C++、Java等)或者数据库工具(如SQL Server Management Studio)来连…

深度学习推理显卡设置

深度学习推理显卡设置 进入NVIDIA控制面板,选择 “管理3D设置”设置 "低延时模式"为 "“超高”"设置 “电源管理模式” 为 “最高性能优先” 使用锁频来获得稳定的推理 法一:命令行操作 以管理员身份打开CMD查看GPU核心可用频率&…

AIoT设备新一代高性能处理器瑞芯微RK3576,东胜物联RK3588等核心板定制开发

随着物联网、人工智能和嵌入式技术的不断发展,智能设备应用对芯片处理器的性能需求越来越高,以满足复杂的数据处理需求、实时性要求、复杂的算法运算和多任务处理能力。高性能的芯片可以为智能设备提供更强大的计算能力和更快速的响应速度,从…

通过nginx转发后应用偶发502bad gateway

序言 学习了一些东西,如何才是真正自己能用的呢?好像就是看自己的潜意识的反应,例如解决了一个问题,那么下次再碰到类似的问题,能直接下意识的去找到对应的信息,从而解决,而不是和第一次碰到一样…

新手如何入门Web3?

一、什么是Web3? Web3是指下一代互联网,它基于区块链技术,致力于将各种在线活动变得更加安全、透明和去中心化。Web3是一个广义的概念,涵盖了包括数字货币、去中心化应用、智能合约等在内的多个方面。它的主要特点包括去中心化、…

网络编程--网络理论基础(二)

这里写目录标题 网络通信流程mac地址、ip地址arp协议交换机路由器简介子网划分网关 路由总结 为什么ip相同的主机在与同一个互联网服务通信时不冲突公网ip对于同一个路由器下的不同设备,虽然ip不冲突,但是因为都是由路由器的公网ip转发通信,接…

Apache Paimon系列之:Append Table和Append Queue

Apache Paimon系列之:Append Table和Append Queue 一、Append Table二、Data Distribution三、自动小文件合并四、Append Queue五、压缩六、Streaming Source七、Watermark Definition八、Bounded Stream 一、Append Table 如果表没有定义主键,则默认为…

Vue3基础介绍

文章目录 一、简介1、简介2、性能提升3、源码升级4、拥抱TypeScript5、新特性 二、创建Vue3.0工程1、使用vue-cli创建2、使用vite创建 三、分析工程结构1、main.js2、组件中 一、简介 1、简介 2020年9月18日,Vue.js发布3.0版本,代号(One Piece)海贼王 …

怎么用AI绘画完成设计创作?

AI绘画工具为设计师提供了强大的功能和便利性,用AI绘画进行艺术创作能够使设计师能够更快地迭代和优化设计方案,提高设计效率。那么怎么用AI绘画完成设计创作? 要使用AI绘画完成设计创作,首先需要选择一个合适的工具。目前市场上有很多优秀的…

KVB:怎么样选择最优交易周期?

摘要 在金融交易中,周期的选择是影响交易成败的重要因素之一。不同的交易周期对应不同的市场环境和交易策略,选择合适的周期可以提高交易的成功率。本文将详细探讨交易中如何选择最优周期,包括短周期、中周期和长周期的特点及适用情况&#…

CVE-2023-38836(文件上传+命令执行)

简介 BoidCMS v.2.0.0 存在文件上传漏洞,远程攻击者可通过添加 GIF 头部绕过 MIME 类型检查,执行任意代码。 过程 打开靶场 对网站进行目录扫描 发现后台,登录弱口令账号密码 admin/password 发现文件上传位置 根据简介提示,…

Vue57-组件的自定义事件_解绑

给谁绑的自定义事件,就找谁去触发;给谁绑的自定义事件,就找谁去解绑; 一、解绑自定义事件 1-1、解绑一个自定义事件 到student.vue组件中去解绑。 1-2、解绑多个自定义事件 使用数组来解绑多个。 1-3、解绑所有的自定义事件 二、…

django学习入门系列之第三点《快速了解 CSS》

文章目录 CSS快速了解CSS应用方式在标签上在head标签中写到文件中问题:用Flask框架开发不方便 往期回顾 CSS CSS 专门用来"美化"标签 基础CSS,写简单的界面 &能看懂 &会改就行模块,调整和修改 快速了解 style 这种就叫css样式 &l…