二进制日志和文件系统是如何影响MySQL的性能的(译自Percona)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 基准测试的设置概览如下

01

基准测试的设置


基准测试的设置概览如下:

  • Percona Server for MySQL 5.7.21
  • InnoDB 存储引擎
  • 启用了外键,使用可重复读取隔离级别,并使用了 UTF8 字符集。
  • 数据集:sysbench-tpcc 有 10 个表和 100个仓库,总共有 1000个仓库,数据集大小约为90GB。
  • 使用 80GB、70GB 和 60GB innodb_buffer_pool_size来模拟不同的 IO 负载,并评估这对二进制日志写入的影响。


02

初步结果


第一次测试,对比没有启用二进制日志与启用二进制日志(设置 sync_binlog=0) :

我们可以看到没有启用二进制日志的性能通常略好。另一个值得注意的现象是,启用二进制日志且 sync_binglog=0 的情况下,每40秒会出现吞吐量下降到0,并持续 1-2 秒,这时基本上任何连接的应用都会停滞。原因是二进制日志文件 (max_binlog_size) 的大小有限制,即 1GB。当达到1GB的限制时,MySQL会执行二进制日志轮换。因为使用 sync_binlog=0 ,以前对二进制日志的所有写入都缓存在操作系统缓存中,在二进制轮换时,MySQL 强制同步刷新所有的更新到磁盘,这导致每 40 秒应用完全停止一次,40秒是在上述测试中填满 1GB 二进制日志所需的时间。我们该如何解决这个问题?显而易见的解决方案是更频繁地进行二进制日志的同步写入,这可以通过将sync_binlog设置为>0来实现。流行的选择是sync_binlog=1,这时每次提交都会写二进制日志,它可以最大限度的保护数据,但伴随着明显的性能下降。我将测试 sync_binlog=1000 和 sync_binlog=10000,这意味着分别每 1000 和 10000 个事务各执行一次二进制日志的同步写入。


03

测试结果

下面用表格的方式列出吞吐量的中位数(tps越多性能越好)


InnoDB缓存/ sync_binlog 0
1
1000
10000
无二进制日志
60GB 4174.945 3598.12 5263.375 4205.165 4277.955
70GB
5053.11
4541.985 4997.87 4997.87 5328.96
80GB 5701.985 5263.375 5303.145 5664.155 6087.925

我们可以得出一些结论:

  • sync_binlog=1 的性能损失最大,但差异最小,这与在没有二进制日志的情况下运行相当。
  • sync_binlog=0 在已启用的二进制日志时提供最佳的性能,但差异很大。
  • sync_binlog=1000 是一个很好的折衷方案,它以最小的差异提供比 sync_binlog=1 更好的性能。
  • sync_binlog=10000 可能不好,显示的差异比sync_binlog=0 少,但仍然很大。

那么我们应该把sync_binlog设置成什么值呢?这可能是在 sync_binlog=1 或 1000 之间做选择。这取决于您的应用和存储,我这里使用的是enterprise SATA SSD SAMSUNG SM86,但在存储性能比较差的情况下,设置sync_binlog=1对性能的影响更大。


04

件系统


以上所有结果都在 EXT4 文件系统上,让我们与 XFS 进行比较。它会显示不同的吞吐量和差异吗?

下面用表格的方式列出吞吐量的中位数(tps越多性能越好)





sync_binlog Buffer pool(GB) EXT4 XFS
0 60 4174.945 3902.055
0 70 5053.11 4884.075
0 80 5701.985 5596.025
1 60 3598.12 3526.545
1 70 4541.985 4538.455
1 80 5263.375 5255.38
1000 60 3950.19 3620.05
1000 70 4714 4526.49
1000 80 5303.145 5150.11
10000 60 4205.165 3874.03
10000 70 4997.875 4845.85
10000 80 5664.155 5557.61
No binlog 60 4277.955 4169.215
No binlog 70 5328.96 5139.625
No binlog 80 6087.925 5957.015

我们可以观察到一个总体趋势,即 XFS 的吞吐量中位数比 EXT4 差一点,差异几乎相同。

吞吐量的差异很小,您可以使用 XFS 或 EXT4中的任意一种。


05

硬件规


Supermicro 服务器:

  • Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz
  • 2 sockets / 28 cores / 56 threads
  • Memory: 256GB of RAM
  • Storage: SAMSUNG  SM863 1.9TB Enterprise SSD
  • Filesystem: ext4/xfs
  • Percona-Server-5.7.21-20
  • OS: Ubuntu 16.04.4, kernel 4.13.0-36-generic
相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
17天前
|
存储 关系型数据库 MySQL
|
14天前
|
SQL JSON 数据处理
5% 消耗,6 倍性能:揭秘新一代 iLogtail SPL 日志处理引擎与 Logstash 的 PK
在本文中,我们将深入探讨为何选择 iLogtail,以及它在 SPL 数据处理方面相较于 Logstash 有何独特优势。通过对比这两款工具的架构、性能以及功能,我们希望能够揭示 iLogtail 如何在日益复杂的日志处理需求中脱颖而出,帮助您做出明智的技术选择。
40186 9
|
12天前
|
SQL 安全 关系型数据库
MySQL的binlog日志的简介与查看
MySQL的binlog日志的简介与查看
26 4
|
13天前
|
关系型数据库 MySQL 数据库
MySQL 启动日志报错: File /mysql-bin.index not found (Errcode: 13 - Permission denied)
MySQL 启动日志报错: File /mysql-bin.index not found (Errcode: 13 - Permission denied)
31 2
|
14天前
|
存储 关系型数据库 MySQL
|
3天前
|
Oracle 关系型数据库 MySQL
【实操记录】MySQL二进制安装包部署
本文详细描述了采用二进制安装的各个步骤,具有较强的参考意义,基本可作为标准步骤实施
12 0
|
9天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
6天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
915 6
Mysql 数据库主从复制
|
7天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
12天前
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了