在MayaData,我们喜欢新技术。让我们的数据库运行得更好的技术。无锁环形缓冲器、NVMe-of和Kubernetes等技术。在这篇博客文章中,我们将看到这些技术正在发挥作用,它们以灵活和简单的操作为我们提供了令人惊叹的块存储性能。
Mayastor是一种新技术,速度很快,而且是基于SPDK的。为什么SPDK令人兴奋?这是新一代存储软件,专为超高速低延迟NVMe设备设计。我只想告诉您,我相信Mayastor能够最大限度地提高我在基准测试中使用的NVMe设备的实际吞吐量,从而在单个节点上支持多个高性能(20kqps+)数据库实例。非常适合于Kubernetes的数据库场。
开源关系数据库是应用程序开发人员的主要组件。人们总是在各种软件项目中使用它们。在不同的数据组之间建立关系很容易,语法是众所周知的,而且随着现代计算的发展,它们已经存在了很长时间。当开发人员想要入侵关系数据库时,很可能是Postgres或MySQL。他们是免费的。它们是开源的。它们都已经相当稳定很长一段时间了,而且它们都能在Kubernetes上运行得很好。如果Percona的好员工制作这些数据库的容器化的、可生产的版本,我们将使用他们的Percona发行版MySQL来进行下面的测试。
那么,在Kubernetes中运行关系数据库或一般数据库有什么困难呢?考虑到Kubernetes用于管理高可用性应用程序部署的所有功能:带控制的自动化、通用声明性配置接口和内置可观察性,人们会认为数据库就是要部署到它上的应用程序。
诀窍在于,数据库是出了名的磁盘密集型和延迟敏感型数据库。这对您的Kubernetes部署有影响的原因是,库存设置和未调优的K8S集群中的存储支持充其量是最基本的。这就创建了许多项目,用于在K8S项目中提供存储,当然,包括流行的OpenEBS项目。
在这篇文章中,我将研究构成OpenEBS数据平面的最新存储引擎。作为一项挑战,我希望能够在MySQL数据库中实现每秒20,000个查询,并在底层使用此存储引擎进行块存储。
现在,有了正确的数据集,达到20kqps可能很容易。但我希望使用比可用RAM大得多的数据来实现这一点。在这种情况下,20kqps是相当快的(从它产生的磁盘流量和CPU负载可以看出)。
在Kubernetes中部署MySQL有很多很好的选择,但是对于这个测试,我们真正想要的只是一个好的、高性能的数据库。我真的不需要花哨的DBaaS功能,也不需要操作员来管理备份,或者任何类似的东西。我们将从Percona的MySQL容器开始,并为其构建一个小的部署清单。现在,也许你在想:“你的意思不是一个有状态的集合吗?”但不是的,我们要用部署的方式来解决这个问题。除了容器连接存储外,还可以简单方便地进行配置。
图中的部署引用了外部卷vol2。现在,我们可以在本地系统上为此创建一个PV,但是如果我们的MySQL实例被安排在另一台机器上,存储将不存在。
Mayastor是OpenEBS和MayaData的Kubera产品的最新存储引擎。Mayastor代表了Linux系统功能丰富存储领域的最先进技术。Mayastor创建由快速NVMe磁盘支持的虚拟卷,并通过超高速NVMf协议导出这些卷。它是容器附加存储模型的全新实现。所谓CAS,我的意思是它是专门为云的多租户分布式世界而构建的。CAS意味着每个工作负载都有自己的存储系统,有用于调优的旋钮等等。CAS架构的美妙之处在于,它将您的应用程序与其存储分离。您可以在本地连接到磁盘,也可以通过NVMf或iSCSI连接到磁盘。
Mayastor是CAS,旨在以极小的开销快速支持云本地工作负载。在MayaData,我们用Rust编写了它;我们与Intel合作实现了名为SPDK的新的突破性技术;使其易于与Kubernetes一起使用,并可以与任何东西一起使用;并将其开源,因为它提高了K8中存储的技术水平,并且社区总是(最终)取胜。
如果您想在新的或现有的集群上设置Mayastor,请查看:https://mayastor.gitbook.io/introduction/。
我想做的第一件事是了解数据库每秒最多处理多少个查询(QPS)。我从一开始就怀疑QPS的限制因素通常是存储延迟。我们可以在一个小型测试集群中部署Mayastor池和存储类清单,以确保它们按预期工作,然后调优我们的测试以尽可能地驱动数据库。数据库的性能特征与工作负载和表结构的细节密切相关。因此,这里的第一个挑战是找出哪种工作负载将有效地运行磁盘。
Sysbench是一个很好的工具,可以用来测试Linux系统的各个方面,它包含了一些数据库测试,我们可以用它来获得一些基准。你可以在https://github.com/akopytov/sysbench找到它。我们可以将其放入容器中,然后将MySQL OLTP测试直接指向我们的数据库服务。
在使用sysbench选项为表大小、表数等设置了不同的值之后,我在使用m5ad.xLarge节点的AWS中的一个小集群上得到了非常稳定的结果。我已经确定了10个线程和10个表,每个表中有10M行。在没有对MySQL进行额外调整的情况下,sysbench每秒可以处理大约4300个查询,平均延迟为46ms。对于小型云设置来说,这相当不错。
以此为基准,让我们看看在一个更大的系统上我们可以从中获益多少。英特尔制造高核处理器和非常快的Optane NVMe设备,他们慷慨地允许我们使用他们的基准实验室一段时间进行一些数据库测试。我们没有太多的硬件极客,我们有三个运行在2.2 GHz的96个核心盒,比我需要的更多的RAM和100 Gb的网络将它们串在一起。每个盒都有一个小型Optane NVMe设备,这个小型驱动器通过ext4文件系统至少能够支持400k IOPS和1.7 GB/s。真快啊。发布的这款设备的规格稍高一些(约500K IOPS和2 Gb/s),但出于我们的目的,我们认为这是最高性能。
在第一个测试中,为了描述设置的特点,我在数据库中投入了大约80个内核,并使用大量线程在数据库上运行sysbench。大概300个。
我从一个较小的表开始,只是为了在加载阶段节省一点时间。我花了几次迭代才让测试运行-调整到max_Connections。较小的表大小意味着它可能可以装入内存,但它将快速测试我们的测试框架。果然,运行我们的OLTP测试将使我们接近每秒10万次查询。但是,没有真正的磁盘活动。我们需要更多数据来测试底层磁盘。
我将表的大小提高到每个表20,000,000行,调优Mayastor以在每个表上使用三个内核,并开始调优测试以获得每秒的最大查询数。三个表似乎足以溢出我们分配给容器的8G内存。现在,当我检查节点上的磁盘统计数据时,会发现有大量的存储流量。但仍然不到每秒一千兆字节。该系统的速度稳定在30kqps左右,磁盘吞吐量约为700MB/s,每次查询的延迟约为50ms。奇怪的是,该数据库使用了大约8个内核。显然,我们不需要分配全部80个。
在我们的合成测试中,我们已经看到超过700MB/s的存储速度。这与1.7 Gb/s的峰值测试性能相差甚远。
果然,这个系统足够快,可以在同一个NVMe驱动器上托管两个高性能的关系数据库实例,并且有备用的cpu。如果我在这个盒子…中有另一个NVMe驱动器就好了。。
这大约是1.1 GB/秒,52K IOPS。还不错。如果我们愿意在所有情况下牺牲一点速度,我们甚至可以容纳三分之一的人。
要描述这样的数据库工作负载,还有更多的工作要做。还有机会调查为什么数据库可扩展到20-30K IOPS,但仍有一些存储和系统资源可用。
也许最重要的是-Maystor为Kubernetes卷提供了一个完整的抽象,并允许复制到多个节点、为卷拍摄快照、加密流量,以及您通常希望从企业存储中获得的一切。Maystor在这里展示了LocalPV类性能的前景-至少使我们的数据库的功能达到了最大配置-同时还提供了易用性和增加弹性的能力。
最后,如果你对Percona和OpenEBS感兴趣,这里有很多OpenEBS社区的博客,还有Percona的首席技术官最近写的一篇关于使用OpenEBS LocalPV作为他们首选的LocalPV解决方案的博客:https://www.percona.com/blog/2020/10/01/deploying-percona-kubernetes-operators-with-openebs-local-storage/。
Percona社区论坛、OpenEBS和Kubernetes社区的数据越来越重叠,我希望并期待这篇文章能带来更多的合作。快来看看,自己来看看Mayastor,在下面的评论中让我们知道Mayastor是如何为您的用例工作的!
布莱恩·马西森花了二十年的时间做一些事情,比如支持开发人员、调优网络和编写工具。作为一名专注于客户的连续创业者,布莱恩曾在技术方面帮助过多家初创企业。你可以在https://blog.mayadata.io/author/brian-matheson.上阅读更多布莱恩的博客文章