mysql集群方案对比_MySQL云原生方案在携程开发测试场景中的实践

一、背景与使用场景

随着Kubernetes平台在容器云计算领域的一统天下,云原生 (Cloud Native) 一词也被提的越来越频繁。各类应用纷纷走上了容器化、云原生化的道路,无状态服务应用在Kubernetes平台上的运行,已经得到了大规模生产级别的实践认可。

相比之下,有状态应用就没有那么顺利了,特别是那些十分重要却又"历史悠久"、不是按照分布式架构理念设计的有状态服务,尤其困难。MySQL就是其中的代表,为此我们做了诸多尝试,从一开始的MySQL单实例容器化使用本地存储,到计算存储分离的方案,走了一些弯路。最终在开发测试场景下找了一个合适的切入点,实现了一套计算和存储分离,以Kubernetes Operator为核心,以CEPH RBD为后端存储,以数据库版本化管理为特性的可行方案。

我们典型的使用场景是这样的:测试人员需要构造一个生产环境批量订单数据异常的测试场景, 他使用安全工具从生产环境拉取大量脱敏后的数据写入测试数据库,但只运行一次测试用例, 数据库就"脏了"。特别是每次上新功能还要回归测试一次这种场景,又要重复耗时在构造新数据库,真的是“构造2小时,运行5分钟”。

而有了这一套完整的MySQL实例服务后,可以快速启动任意版本的数据库实例,前面所述的痛点就彻底消失了。同时有了MySQL实例服务,对CPU 内存资源的使用也可以节省一大笔,毕竟大量的测试数据库都只要以快照的形式存储在集群中即可,实际使用时可以在一两分钟内快速启动。

df63bf11d82f7593392250dfacb7c0ff.png

二、可行性方案分析和性能评估

首先要解决的是计算和存储分离的问题,如果使用容器宿主机本地磁盘存储的话,MySQL实例必须和宿主机绑定,这就丧失了资源的灵活性,而且使用本地存储, 对于磁盘容量的规划会是个不小的问题。

我们团队早在2015就开始使用CEPH存储服务,主要是对象存储和块存储,运维经验和集群稳定性方面相对有保证。结合这一实际情况,我们选择使用了CEPH块存储服务作为MySQL容器实例的存储。

另一个考量则是受益于Kubernetes这个强大的平台基座,社区已经定义好了容器存储接口 (CSI),且实现了CSI driver for CEPH (https://github.com/ceph/ceph-csi),其中RBD 部分早已GA,还有提供了snapshot,resize等功能,完全满足我们的使用场景。

为了验证MySQL实例后端挂载CEPH块存储服务能否满足开发测试环境的数据库基本使用需求,我们基于已有的硬件情况, 做了两个场景的性能压测。主要是对比使用本地SAS磁盘存储的MySQL实例和使用CEPHRBD的MySQL实例,在性能方面是否有明显差异。其次则是测试MySQL实例后端挂载CEPH RDB存储的性能上限。

基本硬件信息如下 :

df5ab029b1e31e2b18fbc22391f13282.png

构造了两个测试场景,使用sysbench执行压测:

sysbench参数如下:

fb53e5228607c178c72d24a3eb0e794d.png

测试场景A:分别压测MySQL docker with CEPH RBD 和MySQL docker with local disk,并发数threads从低到高,8→256,对比QPS。

测试场景B:同时压测五个MySQL docker with CEPH RBD,保持并发数恒定在256,观察CEPH集群IOPS和最终MySQL QPS。

93b577d18e02ee9c4f9ee3dfa69b0831.png

测试场景A结果:

OLTP模式压测MySQL,对于磁盘主要是随机读写操作,CEPH RBD使用了SSD作为缓存盘,随机写速度约110MB/s,而本地机械磁盘随机写速度只有48.6MB/s,所以最终性能指标QPS,使用了CEPH RBD的容器实例反而更好。

测试场景B结果:

压测CEPH RBD集群的磁盘IO上限,约算测试环境的集群能提供的QPS上限为80K。

结论是在开发测试环境使用CEPH RBD为后端存储的MySQL实例服务,不会比使用本地磁盘更差,可以满足应用功能测试的性能需求。

三、MySQL容器化实例方案及实现细节

介绍一下这套方案的简单架构设计和基本工作原理,如下图:

89c67b8610187c8763ccbd3cc82a0e9b.png

所有相关服务都部署在Kubernetes集群上,这里只重点描述我们开发的MySQL-Operator和自定义资源CRD。关于CSI driver 以及provisioner,attacher, snapshotter等组件都是使用原生官方镜像,在这里不做详细表述,可以参考文档(https://kubernetes-csi.github.io/docs/)。

MySQL-Operator作为自定义的控制器,管理两种自定义资源(CRD),通过Kube-api为上层的PAAS平台和CI等系统提供MySQL实例服务。两个CRD分别是MySQLInstance和DatabaseSnapshot。其中MySQLInstance是基于StatefulSet的一层封装,添加了一些metadata,MySQL-Operator只需要根据MySQLInstance的声明来创建对应的StatefulSet和PVC即可, 所以MySQLInstance暴露出来的spec并不多,大致如下:

c1aefeedbc7b6f058f6e7c6789279af6.png

根据spec.init的类型,MySQLInstance既可以是基于生产数据库Schema生成的空数据库实例,也可以是基于已有的DatabaseSnapshot生成的带有基准数据的实例。

在创建的过程中,MySQL-Operator会为这个MySQLInstance申请域名,同步账户密码以及Schema等。一个MySQLInstance的整个生命周期在有限的七个状态之间跳转。需要特别提一下Paused状态,当基于该实例的DatabaseSnapshot创建时,MySQLInstance会进入Paused状态。状态机如下:

f5c19fac5409a30b82660b8980986d92.png

另一个CRD,DatabaseSnapshot则是基于VolumeSnapshot的封装,其中VolumeSnapshot是Kubernetes官方定义的持久卷快照声明(https://kubernetes.io/zh/docs/concepts/storage/volume-snapshots/)。MySQL-Operator根据它的声明来关联MySQLInstance和PVC即可。

6a3a58d55f6722e0cf5ce69a3f81af1b.png

由于CEPH RBD 的读写独占模式 RWO(read write once), 我们为DatabaseSnapshot定义了两个常态InUse和Ready。简单来讲就是一个数据库快照同一时间只允许一个数据库实例使用,并且DatabaseSnapshot在创建过程中需要暂停对应的MySQLInstance,状态机如下:

00d21a0a54452fb0a0d880fa7a575c4a.png

四、小结与展望

在有了MySQLIntance服务之后,数据库的版本管理变得和代码版本管理一样灵活。特别是重复构造测试数据的场景,节省了大量的时间和管理成本。另外用户也不再需要长期占用计算资源,仅在有使用需求时即可快速创建 MySQLInstance,有效提高了整体容器宿主机资源的使用率。除此之外,上层CI/CD平台服务也可以通过Kube API调用的方式来管理这两种CRD,进一步提升测试自动化程度。

一般来说,应用云原生化完成后最重要的是获得两个能力:弹性和分布式,目前我们的这套方案落地于Kubernetes平台,释放出了一部分平台计算和存储的弹性,让用户对于数据库实例有了更多的选择和灵活管理的能力。

何谓云原生(Cloud Native), 字面上早已经有了明确的定义(https://github.com/cncf/toc/blob/master/DEFINITION.md),但是在工程实践中,基于Kubernetes这个巨大的平台,仍然有大量的宝藏等着我们去持续探索挖掘。

【作者简介】Alex,专注于云计算领域数年,目前主要从事容器云平台的建设,推进各类基础设施服务的云原生化。小石川,目前主要从事容器云平台监控系统建设,对分布式、性能以及优化感兴趣。’

更多携程技术人一手干货,请关注“携程技术”微信公众号。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net datagridview数据批量导入sql_【自学C#】|| 笔记 44 ComboBox:组合框控件数据绑定...

一、ComboBox:组合框控件数据绑定在 Windows 应用程序中很多控件都提供了 DataSource 属性,并将 DataSet 或 DataTable 的值直接赋给该属性,这样在控件中即可显示从数据库中查询出来的数据。 常用的数据绑定控件有文本框(TextBox)、标签(L…

【转】C#Socket编程详解(一)TCP与UDP简介

一、TCP与UDP 1、TCP 1.1 定义 TCP(TransmissionControl Protocol)传输控制协议。 是一种可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应…

【精华】掌握Qt调试技术

前言 软件调试,是开发过程中必备的技能。通过调试可以发现软件存在的bug,即缺陷。调试可以帮助开发者窥探到软件运行过程中的详细状态,从而为消除bug提供重要信息。调试的英文是debug,前面的de在英文中表示“反对”,“…

ps海报合成教程_如何利用PS制作海报?详细教程来了!

今天能学长给大家带来一套利用PS做【月满中秋】海报的教程。福利干货到,请大家接住!话不多说,直接上教程【月满中秋-第一课】月满中秋-海报制作教程https://www.zhihu.com/video/1187797197951918080为了方便大家阅读,本篇文章特地…

【转】WebSocket详解(一):初步认识WebSocket技术

1、前言 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大意义。 本文将带您认识WebSocket。也可查看本文的下篇&#x…

【Qt调试技巧】Profile配置使用及一些坑

介绍 不知从哪个版本起,Qt Creator中的构建配置中,增加了一种新型配置,名叫“Profile”,如下图所示: 官方对Profile的描述是:Profile是介于Debug和Release中间的一种配置。具体是什么意思呢?…

【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程

上一篇文章带你玩转Visual Studio——带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途。由于这里包含的工程类型太多,有很多本人也没有接触过,有些可能理解的不太对的地方还请…

如何调整金格电子章服务器印章_重磅!公安部再度认可电子签名、电子印章法律效力!...

近日,公安部发布《关于修改〈公安机关办理刑事案件程序规定〉的决定》,对《公安机关办理刑事案件程序规定》(以下简称规定)进行了全面修改完善,并将于9月1日起施行。修改后的规定共14章388条。其中,新增的第…

【转】带你玩转Visual Studio——04.带你高效开发

上一篇文章带你玩转Visual Studio——带你了解VC各种类型的工程一文中讲了各种类型VC工程的主要功能和用途。现在将带你一起快速开发c程序。 有过Java开发经验的人都知道Java的常用开发工具(如Eclipse、Intellij IDEA等)都有非常强大的关键字高亮、智能提示、快速追踪等的功能…

【信号与线性系统】知识点与学习攻略

知识点理解 关于正交分解可以看这个视频: https://www.bilibili.com/video/BV1qV411C7u6/ 记住两个完备正交函数集: 一个是正余弦三角函数,非零不同频率项乘积为0,非零同频率项乘积积分为T/2,零频率项乘积积分为T。 一…

2020-12-19

逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画…

微软模拟飞行10厦门航空涂装_《微软飞行模拟器》多人游戏模式演示:可组队飞行...

IT之家3月29日消息 《微软飞行模拟器》(Flight Simulator)是2020年最受期待的游戏之一,开发商Asobo Studio现在分享了一段新的视频,详细介绍了《微软飞行模拟器》的多人游戏模式。《微软飞行模拟器》游戏的主模式将看到所有玩家在同一个世界中一起玩。微…

【转】UDP协议格式以及在java中的使用

UDP协议格式以及在java中的使用 UDP是面向无连接的通讯协议,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。 UDP适用于…

python网页填表教程_PythonSpot 中文系列教程 · 翻译完成

原文:PythonSpot Python Tutorials 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。在线阅读ApacheCN 学习资源目录PythonSpot 中文系列教程初学者 介绍Python 字符串字符串&#xff0…

【转】TCP/IP协议到底在讲什么?【乐搏TestPro】

用比喻和漫画给有需要的小伙伴解释下IP、TCP捎带题一下各种协议与HTTP协议的关系; 目录: 负责传输的IP协议 确保可靠性的TCP协议 各种协议与HTTP协议的关系 一、负责传输的IP协议 按照层次分,IP(全称:Internet Prot…

Qt中标绘功能的实现方法对比

使用Qt开发桌面程序,经常会有标绘的需求,一般有以下几点: 新建:圆、矩形、椭圆、文字标注,插入图像等;编辑:指对已标绘内容的属性编辑修改功能;删除:指对已标绘内容的删…

【转】PE文件结构详解--(完整版)

(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,P…

【转】逆变与协变详解

逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画…

【转】GitHub 从单机到联机:玩转 Pull Request

最近在参与一个叫 Exercism 的项目,这是一个由 GitHub 生态工程师 Katrina Owen 发起的编程练习社区,提供了超过50门语言的练习。作为用户,你仅需使用命令行工具即可下载和提交练习,提交后还可以和社区中其他学习者交流讨论。 Exe…

【转】GitHub客户端操作1--仓库相关操作github团队协作流程

1、创建仓库 点击“”,点击Create,然后填写Name为my,点击Create repository,即可创建一个my仓库 2、从本地仓库存放位置,添加test仓库到GitHub客户端 点击“”,点击Add,然后点击Browse,选择仓库存放位置&a…