Docker&MongoDB实战(二)性能与容错

释放双眼,带上耳机,听听看~!

本文讲的是Docker&MongoDB实战(二)性能与容错
【编者的话】在Docker中运行数据库很多人都想过,但是IO方面和在实体机上运行会有差异吗?数据应该怎么存储?映射到主机还是使用一个单独存储数据的容器?哪种方式更好?性能方面呢?本文针对这些问题一一给出了答案。第一篇文章在这里

在前面,我们已经知道怎样创建和运行一个简单的基于CentOS的MongoDB实例。这对于开发或者测试使用来说再好不过了,但是它并没有说明一些性能和容错能力的问题。在本文中,我们会了解Docker相关的磁盘存储选项,以及在其之上运行数据库(如MongoDB)的注意事项。

文件系统分层

Docker最重要的特性(也是我比较喜欢的特性)是分层文件系统
。每个基础层都是只读的,这些基础层相互叠加构成真实的文件系统,最上面的层是读写层(可读可写)。它们非常便于版本管理,同时,也可以缓存(我们不需要每次都从头开始构建)。

相比于传统的镜像方式,这真是一个巨大的改变,之前的整个文件系统镜像或者虚拟机模板都是手工构建的,我们根本不知道其中包含了什么以及为什么要包含。最近我们注意到有很多的配置管理工具,比如Puppet
、 Chef
和Ansible
,但是从头开始构建一个复杂且灵活的镜像非常耗时间。Docker分层的方式可以加快构建时间,因为它只需要重构仅仅做出修改的文件层。

但是,这种方式并不是没有缺点:这样的分层文件系统的运行时性能相当差。这也依赖于Docker使用的存储模块,包括之前一开始使用的AUFS,以及后来的OverlayFS、BTRFS和device mapper。为了获得最佳的I/O性能,我们需要使用Docker的数据卷
。数据卷位于Docker容器之外,因此也绕开了分层文件系统。有两个主要的数据卷类型:主机目录和仅存储数据的容器。

数据卷:主机目录

一个主机目录数据卷是一个被挂载在原始容器的简单的目录。就像我们在第一部分
中介绍的:在Docker主机中创建一个目录,然后使用它作为MongoDB的dbpath(容纳数据和分类文件)。例如:

通过检查日志文件来确认MongoDB容器是否启动成功:

确保数据文件已经在指定的主机目录~/db中创建。

快速衡量(Quick benchmarking)

主机目录数据卷比默认的分层文件系统快了多少?这当然依赖于你的环境,当然,本文也不会过多介绍性能测试的东西。但是,这里有一个快速的方法就是使用mongoperf
来测试。

这里我们使用与第一部分中案例相同的mongodb.repo,为了方便这里再做一次:

使用在你当前的目录如上的两个文件,构建将要运行的镜像:

现在衡量分层的根目录文件系统,通过运行:

你应该看到相似的输出如下:
mongoperf
将一直运行,你可以通过Ctrl+C退出终端。容器将一直运行在后台,因此让我们结束它。

现在再运行下主机目录数据卷:

从我们设置开始,这就有相同的输出:

停止并移除之前的容器。

具有32个并行读写线程结果最后一组比较,我们看到在操作每秒数量提高180%,从1211到3385 ops/s。还有的吞吐量增加了225%,从4到13 MB/s。

容器可移植性

虽然上面的方式中性能得到了提升,但这并不利于容器的迁移,因为现在我们的Docker容器需要依赖外部的Docker主机上的目录,而这个目录却没有通过Docker来管理,所以我们不能简单的运行或者迁移它。最好的解决方案就是使用data-only容器,接下来,我们将详述。

数据卷:仅有数据的容器

仅有数据(data-only)的容器是推荐的Docker数据存储模式,它可以解耦对主机的依赖。

为了创建数据容器来作为衡量标准,我们重新使用已经存在的mongoperf
镜像:

使用数据容器,重新运行测试标准,使用–volume-from mongoperf-data
参数。

这个过程如下面的输出:

性能方面它和主机目录数据卷方式一致。即使引用容器被移除了,仅仅包含数据的容器依然存在。我们继续运行查看:

结束

回顾一下我们的mongod
容器,我们现在使用data-only容器来存储数据以获得更好的性能。

记住,你可以通过运行docker ps
看到映射的本地端口值。例如:

数据卷将最终成为Docker里的头等公民
。同时,考虑使用社区工具,像docker-volume
来更加轻松的管理他们。

接下来

在接下来的部分,我们将研究各种各样的Docker网络参数,并细说哪种更适合多主机的MongoDB副本集。敬请期待!

原文链接:MONGODB & DOCKER – PART 2(翻译:刘红 校对:李颖杰)

===========================

译者介绍

刘红,才毕业的本科小生,平时喜欢业余学习一些自己感兴趣的技术或者框架,目前正在学习Docker,也在着手翻译Docker官方文档,如果对翻译Docker官方文档感兴趣的朋友可以联系译者哟。

原文发布时间为:2015-03-22

本文作者:刚百

本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Docker&MongoDB实战(二)性能与容错

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索