容器化RDS|计算存储分离架构下的 IO 优化

简介:

计算存储分离架构

架构示意图如下:

f3dbc8e85ab8eb687d952f20a4c721378637aed5

存储层由分布式文件系统组成,以 Provisoner 的方式集成到 Kubernetes.

在我们看来, 计算存储分离的最大优势在于:

将有状态的数据下沉到存储层,这使得 RDS 在调度时,无需感知计算节点的存储介质,只需调度到满足计算资源要求的 Node,数据库实例启动时,只需在分布式文件系统挂载 mapping 的 volume 即可,可以显著的提高数据库实例的部署密度和计算资源利用率。

其他的好处还有很多,譬如架构更清晰,扩展更方便,问题定位更简单等,这里不赘述。

计算存储分离架构的缺点

俗话说的好:

上帝为你关上一扇窗的同时,再关上一扇门。

如下图所示

196be2e580c457167c72b6b22ee824b640e7bdec

相较本地存储, 网络开销会成为 IO 开销的一部分, 我们认为会带来两个很明显的问题:

  • 数据库是 Latency Sensitive 型应用, 网络延时会极大影响数据库能力(QPS,TPS);
  • 在高密度部署的场景, 网络带宽会成为瓶颈, 可能导致计算 & 存储资源利用不充分。

其实还有一个极其重要的问题,由于kubernetes 本身没有提供 Voting 服务和类似 Oracle Rac 的 Fence 机制,在计算存储分离架构下,当集群发生脑裂,并触发 Node Controller 和Kubelet 的驱逐机制时,可能会出现多个数据库实例同时访问一份数据文件导致 DataCorruption 的情况,数据的损失对用户而言是不可估量也不可忍受的。

我们在 kubernetes 1.7.8 下使用 Oracle , MySQL 都可以100%复现这个场景,通过在 Kubernetes 上添加 Fence 机制,我们已解决该问题。如果大家有兴趣,会再做专门的分享。

下面,就需要结合 MySQL 的特性来进行有针对性的优化。

以下测试方案的设计,测试数据的梳理来自于沃趣科技MySQL专家@董大爷 和 @波多野老师。

DoubleWrite

在 MySQL 中我们首先想到了 DoubleWrite. 首先看下官方解释,它是干什么的 :

The InnoDB doublewrite buffer was implemented to recover from half-written pages. 
This can happen when there's a power failure while InnoDB is writing a page to disk. On reading that page, 
InnoDB can discover the corruption from the mismatch of the page checksum. However, in order to recover, 
an intact copy of the page would be needed.

The double write buffer provides such a copy.

Whenever InnoDB flushes a page to disk, it is first written to the double write buffer. 
Only when the buffer is safely flushed to disk will InnoDB write the page to the final destination. 
When recovering, InnoDB scans the double write buffer and for each valid page in the buffer checks if the page in the data file is valid too.

Although data is written twice, the doublewrite buffer does not require twice as much I/O, 
as data is written to the buffer in a large sequential chunk with a single fsync() call. 
There is extra time consumed however, and the effect becomes visible with fast storage and a heavy write load.

简单说 DoubleWrite 的实现是防止数据页写入时发生故障导致页损坏(partial write),所以每次写数据文件时都要将一份数据写到共享表空间中,当启动时发现数据页 Checkum 校验不正确时会使用共享表空间中副本进行恢复,从 DoubleWrite 实现来看这部分会产生一定量的 IO .所以:

最好的优化就是减少 IO, 在底层存储介质或文件系统支持 Atomic Write的前提下, 可以关闭MySQL 的 DoubleWrite 以减少 IO

单机架构 : 关闭 DoubleWrite

MariaDB 已支持该功能(底层存储介质需支持 Atomic Write ),并在单机环境做了相关测试。数据如下:

9d5358096bf908095756833f6615a1933472e2c3

结论:单机环境下,启用Atomic Write(关闭 DoubleWrite )能立即带来30%左右的写性能改善。DoubleWrite

原文地址 : http://blog.mariadb.org/mariadb-introduces-atomic-writes/

计算存储分离架构 : 关闭 DoubleWrite

所以, 重点是我们需要测试一下在计算存储分离架构下(分布式存储必须支持 Atomic Write ), 关闭DoubleWrite Buffer 的收益。

测试场景

  • 采用Sysbench 模拟 OLTP 敷在模型 (跟 MariaDB 相同)
  • 数据库版本选择了更流行的 MySQL 5.7.19 (测试时的最新版本)
  • 由本地存储改为分布式文件系统
  • 测试数据量, 数据文件大写

        1、10GB

        2、100GB

测试结果 : 10GB数据量

Sysbench 指标:

98934f028634e26201c10848fe3dc1ee979ea74b

分布式文件系统指标:

771f957687883bee62ba481d96ec0369016ea01a

在计算存储分离架构下, 启用Atomic Write(关闭 DoubleWrite ), 10GB数据量, 因为大部分数据已经缓存到数据库 buffer cache 中, 所以在 IO 不是瓶颈的情况下:

Sysbench指标, 提升不明显

       tps ↑0.2656%,qps ↑0.2797%,rst ↑14.9651%

分布式文件系统指标

       Throughput 下降53%, 显著优化了网络带宽

测试结果 : 100GB数据量

Sysbench 指标:

1182c9ac6dc6ca60a15d14cb0944e3bbd637d530

分布式文件系统指标:

b96c2e5751b75cd499e1cc0322578f50be844614

在计算存储分离架构下, 启用Atomic Write(关闭 DoubleWrite ), 100GB数据量, 因为大部分数据无法缓存到数据库 buffer cache 中, 所以在 IO 是瓶颈的情况下:

Sysbench指标, 提升明显:

       TPS ↑28.0892%,QPS ↑28.0893%,RST ↓169.2033%

分布式文件系统指标

       IOPS 提升22.3%

       Latency 下降 39%

       在IOPS 提升22.3%的情况下, Throughput 仅多消耗 3.6%


原文发布时间为:2018-01-11

本文作者:熊中哲

本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”微信公众号

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
存储 数据挖掘 BI
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
波司登集团升级大数据架构,采用阿里云数据库 SelectDB 版,实现资源隔离与弹性扩缩容,查询性能提升 2-5 倍,总体成本降低 30% 以上,效率提升 30%,助力销售旺季高效运营。
644 9
|
9月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
691 59
|
存储 运维 Serverless
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
碧桂园服务通过引入 EMR Serverless StarRocks 存算分离架构,解决了海量数据处理中的资源利用率低、并发能力不足等问题,显著降低了硬件和运维成本。实时查询性能提升8倍,查询出错率减少30倍,集群数据 SLA 达99.99%。此次技术升级不仅优化了用户体验,还结合AI打造了“一看”和“—问”智能场景助力精准决策与风险预测。
1355 69
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
850 281
|
12月前
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
492 1
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
362 1