【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(系统底层优化篇)(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(系统底层优化篇)

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(系统底层优化篇)(一)https://developer.aliyun.com/article/1471062


建议将操作系统和数据分开

"将操作系统和数据分开,既在逻辑上也在物理上进行分离" 这句话的意思是为了获得最佳性能,建议将操作系统和数据库的数据存储位置分开。

在逻辑上分离意味着,操作系统和数据库应该使用不同的目录或分区进行存储。这样可以确保操作系统的文件和数据库的数据文件分开管理,避免混淆和冲突。

在物理上分离意味着,可以将操作系统和数据库安装在不同的物理硬盘上。这样做可以避免操作系统和数据库之间共享磁盘资源导致的性能瓶颈,并提高数据库的读写速度。

通过将操作系统和数据分开,在逻辑和物理上进行分离,可以提高系统的整体性能和灵活性。这种配置使得操作系统和数据库各自专注于其特定的任务,减少了资源竞争和冲突,提升了系统的稳定性和响应能力。

文件系统层优化

调整磁盘Cache mode

理解"调整磁盘Cache mode,启用WCE=1(Write Cache Enable),RCD=0(Read Cache Disable)模式"之前,让我们先了解一下磁盘的缓存。

读写磁盘缓存

磁盘缓存是一种临时存储机制,用于加快磁盘的读写速度。它主要包括读缓存和写缓存。

  • 读缓存(Read Cache)存储最近读取的数据块,当再次访问相同数据时,可以直接从缓存中读取,而不需要再次从磁盘读取数据,提高了读取速度。
  • 写缓存(Write Cache)存储要写入磁盘的数据,当应用程序进行写操作时,数据首先被写入缓存中,然后由磁盘控制器异步地将数据写入磁盘。这可以显著提高写入速度。
解析命令 "sdparm -s WCE=1,RCD=0 -S /dev/sdb":
  • "sdparm" 是一个用于设置磁盘参数的命令行实用工具。
  • "-s WCE=1,RCD=0" 标志将WCE(Write Cache Enable)设置为1(启用写缓存),将RCD(Read Cache Disable)设置为0(禁用读缓存)。
  • "-S /dev/sdb" 标志指定要应用这些参数的磁盘,这里是/dev/sdb。
状态值解析
  • 通过将WCE设置为1,我们启用了磁盘的写缓存功能。这意味着写操作将首先被写入磁盘缓存,然后由磁盘控制器异步地将数据写入实际磁盘。这可以显著提高写入性能,但也带来了一定的数据丢失风险,因为缓存中的数据尚未被持久化到磁盘。
  • 通过将RCD设置为0,我们禁用了磁盘的读缓存功能。这意味着每次进行读取操作时,数据都将直接从磁盘读取,而不会使用读取缓存。这样可以确保读取到的数据是最新的,而不是读取到了缓存中旧的数据。

注意,这些参数的设置可能因磁盘型号和驱动程序而异,因此在应用该命令之前,请确保对应硬件和驱动程序支持这些参数设置。

采用Linux I/O scheduler算法deadline

Linux中的I/O调度器是用来管理和调度磁盘I/O操作的算法。其中,deadline是一种常用的I/O调度算法。

deadline算法

deadline算法的主要目标是通过合理分配磁盘带宽,提高磁盘访问的响应时间和性能。它在处理I/O请求时,将读写请求分成两个队列,分别用于读取和写入操作。它采用了三个重要参数来控制调度行为:

  • read_expire(读取超时时间):它定义了一个读取请求在队列中可以等待的最长时间。当读取请求超过这个时间时,它会被放入写入队列以提高响应时间。一般建议将read_expire设置为write_expire的一半。
  • write_expire(写入超时时间):它定义了一个写入请求在队列中可以等待的最长时间。当写入请求超过这个时间时,它会被强制执行,以保证写入操作的及时性。
  • fifo_batch(批量处理请求数):它定义了一次性处理的最大请求数量。当队列中达到fifo_batch设置的请求数时,调度器会将这些请求作为一个批次处理,以提高效率。

过期时间参数调优

通过设置这些参数,可以根据实际需求来调整磁盘I/O的调度行为。对于CentOS Linux系统,建议将read_expire设置为write_expire的一半,以平衡读取和写入操作的响应时间。

你可以使用以下命令来设置deadline调度器的参数:

bash

复制代码

echo 500 >/sys/block/sdb/queue/iosched/read_expire
echo 1000 >/sys/block/sdb/queue/iosched/write_expire

以上命令将read_expire设置为500毫秒,write_expire设置为1000毫秒。你也可以根据具体情况进行自定义设置。通过调整deadline调度算法的参数,可以优化磁盘I/O性能,提高系统的响应速度和效率。

采用xfs文件系统

如果你使用XFS文件系统,并且希望进行高性能设置,以下是一些调整XFS文件系统日志和缓冲变量的建议:

调整日志大小

日志是XFS文件系统用于记录文件系统操作的关键组成部分。增加日志大小可以提高系统的写入性能和吞吐量。通过以下命令可以调整日志大小(以512字节块为单位):

bash

复制代码

sudo xfs_admin -L <log_size> /dev/<device>

其中,是期望的日志大小,是XFS文件系统所在的设备名称。

调整日志存储位置

XFS文件系统的日志存储在文件系统的起始扇区。如果你的磁盘布局使得起始扇区被频繁访问,你可以将日志存储在其他位置来减少争用。可以使用以下命令将日志存储在指定块设备上:

bash

复制代码

sudo xfs_admin -J device=/dev/<journal_device> /dev/<filesystem_device>

其中,是用于存储日志的设备名称,是XFS文件系统所在的设备名称。

调整日志和数据缓冲区

XFS使用日志和数据缓冲区来提高性能。你可以通过以下方法调整这些缓冲区的大小:

调整日志缓冲区大小

编辑/etc/sysctl.conf文件,在末尾添加以下行,并重新加载sysctl配置:

bash

复制代码

fs.xfs.logbufs=<num_log_buffers>

其中, 是期望的日志缓冲区数目。增加日志缓冲区的大小可以提高写入性能。

调整数据缓冲区大小

编辑/etc/sysctl.conf文件,在末尾添加以下行,并重新加载sysctl配置:

bash

复制代码

vm.dirty_background_bytes=<background_bytes>
vm.dirty_bytes=<dirty_bytes>

其中,是系统进程在触发后台写入操作之前保持的脏数据大小(单位:字节),是系统进程在触发强制写入操作前可以累积的脏数据大小(单位:字节)。增加数据缓冲区的大小可以提高写入性能。

优化TCP协议栈



这些配置参数是用来优化TCP连接性能的。我们逐一解释它们的作用:

优化TCP连接层面

  • net.ipv4.tcp_tw_recycle=1:启用TCP连接的快速回收,即允许在TIME_WAIT状态下的连接被立即回收重用。这可以减少服务器上处于TIME_WAIT状态的连接数量,提高TCP连接的效率。
  • net.ipv4.tcp_tw_reuse=1:启用TCP连接的端口复用,即允许服务器上处于TIME_WAIT状态的本地端口被立即重用。这样可以避免端口耗尽的问题,提高系统对新连接的支持能力。

优化TCP连接时间

  • net.ipv4.tcp_fin_timeout=2:指定了处于FIN-WAIT-2状态的连接最长的保持时间,控制了关闭连接的速度。通过减少这个时间,系统可以更快地处理更多的连接。
  • net.ipv4.tcp_keepalive_time=600:指定了TCP的Keepalive发送间隔时间。Keepalive机制用于检测连接是否存活,通过减少检测时间,系统可以更快地释放闲置连接资源。
  • net.ipv4.tcp_max_syn_backlog=16384:指定了系统支持的最大SYN半连接数。SYN半连接是TCP三次握手中的第一次握手,通过增加这个数值,系统可以处理更多的连接请求。

调整连接重试

  • net.ipv4.tcp_synack_retries=1net.ipv4.tcp_sync_retries=1指定了TCP连接建立过程中的SYN包重试次数,减少重试次数可以加速连接建立的速度

提升连接范围和数量

  • net.ipv4.ip_local_prot_range=450065535:指定了系统可用的本地端口范围。通过增大这个范围,系统可以支持更多的并发连接。

扩展优化方向

  • net.ipv4.tcp_timestamps = 0:将TCP时间戳功能禁用。TCP时间戳用于在网络中识别重复包和计算往返时间(RTT)。禁用时间戳可以减少对服务器的计算负担,但也可能影响某些特定的网络应用。
  • net.ipv4.tcp_max_orphans = 3276800:指定了系统在没有相关的socket文件句柄的情况下所能持有的TCP套接字数量的最大值。TCP套接字是在TIME_WAIT状态下的连接,该参数可以控制套接字的最大数量,避免资源耗尽问题。
  • net.ipv4.tcp_max_tw_buckets = 360000:指定了系统为处理处于TIME_WAIT状态的连接所维护的最大套接字桶的数量。套接字桶用于存储已关闭的连接,以便在TIME_WAIT状态下等待一段时间以确保网络上的数据已传输完毕。这个参数可以控制系统处理TIME_WAIT连接的效率和数量。

注意,修改这些参数可能会对系统性能和网络连接产生影响。在进行修改之前,请确保了解其含义和潜在的影响,并在进行修改之前备份重要的配置文件,并进行测试

网络优化

  • net.core.rmem_max=16777216:设置了最大的套接字读缓冲区大小。套接字读缓冲区用于存储从网络接收的数据。较大的缓冲区大小可以提高系统对数据接收的效率和吞吐量。这里设置为16MB。
  • net.core.wmem_max=16777216:设置了最大的套接字写缓冲区大小。套接字写缓冲区用于存储将要发送到网络的数据。较大的缓冲区大小可以提高系统对数据发送的效率和吞吐量。这里设置为16MB。
  • net.core.wmem_default=8388608:设置了默认的套接字写缓冲区大小。这个值是新创建的套接字写缓冲区的初始大小。这里设置为8MB。
  • net.core.rmem_default=8388608:设置了默认的套接字读缓冲区大小。这个值是新创建的套接字读缓冲区的初始大小。这里设置为8MB。
  • net.ipv4.tcp_rmem=4096 87380 16777216:设置了TCP套接字的读缓冲区大小的参数。它是一个由三个值组成的数组,分别表示最小缓冲区大小、默认缓冲区大小和最大缓冲区大小。在这里,最小缓冲区大小被设置为4KB,默认缓冲区大小为87.38KB,最大缓冲区大小为16MB。
  • net.ipv4.tcp_wmem=4096 65536 16777216:设置了TCP套接字的写缓冲区大小的参数。与tcp_rmem类似,这里最小缓冲区大小为4KB,默认缓冲区大小为64KB,最大缓冲区大小为16MB。
  • net.ipv4.tcp_mem=94500000 915000000927000000:设置了Linux autotuning TCP缓冲区大小的参数。这个参数指定了当前系统中所有TCP缓冲区的最小值、默认值和最大值。在这里,最小值为94.5MB,默认值为915MB,最大值为927MB。这个参数可以让系统根据当前网络环境动态调整TCP缓冲区的大小。
  • net.core.netdev_max_backlog=3000:设置了网络设备接收队列的最大长度。这个参数指定了在网络接口上等待处理的传入数据包的最大数量。较大的队列长度可以缓解瞬时的网络流量高峰。这里设置为3000。

这些配置旨在优化系统的套接字缓冲区大小、TCP接收/发送缓冲区以及网络设备接收队列长度。通过适当调整这些参数,可以提高系统的网络性能和吞吐量。请注意,在进行修改之前,请确保了解其含义和潜在的影响,并在进行修改之前备份重要的配置文件,并进行测试。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
379
分享
相关文章
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
420 66
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
27 1
Docker下Mysql8数据备份与恢复
通过以上步骤,您可以在Docker环境下高效地备份和恢复MySQL 8数据库。备份数据时,使用 `mysqldump`工具生成逻辑备份文件,并存储到指定目录;恢复数据时,使用 `mysql`工具从备份文件中读取数据并恢复到数据库。自动化脚本和定时任务的配置可以进一步简化备份和恢复的管理过程。
152 41
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
消防行业如何借助时序数据库 TDengine 打造高效的数据监控与分析系统
本篇文章来自“2024,我想和 TDengine 谈谈”征文活动的优秀投稿,深入探讨了如何在消防行业中运用 TDengine 进行业务建模。文章重点介绍了如何通过 TDengine 的超级表、标签设计和高效查询功能,有效管理消防监控系统中的时序数据。作者详细阐述了实时监控、报警系统以及历史数据分析在消防行业中的应用,展示了 TDengine 在数据压缩、保留策略和分布式架构下的强大优势。
25 0
2600 万表流计算分析如何做到? 时序数据库 TDengine 助力数百家超市智能化转型
在生鲜超市的高效运营中,实时数据分析至关重要。万象云鼎的“云鲜生”通过智能秤+网关+软件系统的组合,实现了销售数据的精准管理与优化。而在数据处理方面,TDengine 的流计算能力成为了这一方案的核心支撑。本文详细分享了“云鲜生”如何利用 TDengine 高效存储和分析海量销售数据,在优化超市运营、提升用户体验的同时,解决高基数分组、高并发查询等技术挑战。
42 1
71.7万/秒到1.4万/秒!数据库查询优化实战
在现代计算机系统中,程序的局部性原理是优化性能的关键。通过利用时间局部性和空间局部性,可以显著提升数据访问效率,减少高开销的操作如内存访问和网络 I/O。本文将探讨如何利用空间局部性原理,在实际案例中减少数据库查询量,并通过详细的监控和优化措施确保系统的稳定性和高效性。
71.7万/秒到1.4万/秒!数据库查询优化实战
瑶池数据库大讲堂|PolarDB HTAP:为在线业务插上实时分析的翅膀
瑶池数据库大讲堂介绍PolarDB HTAP,为在线业务提供实时分析能力。内容涵盖MySQL在线业务的分析需求与现有解决方案、PolarDB HTAP架构优化、针对分析型负载的优化(如向量化执行、多核并行处理)及近期性能改进和用户体验提升。通过这些优化,PolarDB HTAP实现了高效的数据处理和查询加速,帮助用户更好地应对复杂业务场景。
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
213 1
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等