1

我在某处读过 MongoDB 和 Redis 服务器不应该在同一主机上执行,因为 Redis 管理内存的方式会损坏 MongoDb。这是在 Docker.io 之前。但现在事情似乎完全不同了?在同一台主机上的两个不同容器上运行 Redis 服务器和 MongoDB 是否方便?

4

2 回答 2

2

当今的许多服务,尤其是数据库,都非常消耗资源,并且在设计时认为它们将(或应该)在专用机器上为它们执行。MongoDB 和 Redis 尝试将大量数据保存在内存中,并会尝试为自己占用更多内存。为避免此服务占用主机的所有内存,您可以使用 in 限制容器使用的最大-m="<number><optional unit>"内存docker run。例如:docker run -d -m="2g" -p 27017:27017 --name mongodb dockerfile/mongodb

因此,您可以轻松控制服务的资源限制,并在同一主机上运行它们,并对资源进行细粒度控制。无论如何,重要的是要考虑到这些服务的性能是在设计时考虑到主机的资源将完全可供它们使用的。例如,Cassandra 等其他数据库会消耗大量内存,此外,它们的设计目的是对磁盘进行顺序访问。在这些情况下,Docker 会让你运行限制使用的资源,但是如果你在同一主机上运行多个服务,它们的性能会严重下降。

于 2015-02-02T21:54:35.553 回答
2

Docker 不会更改您的硬件,它也是处理未虚拟化资源的操作系统,因此此处应适用与普通硬件相同的规则。

内存

MongoDB 和 Redis 不共享任何内存。使用同一主机的问题是这两个进程可能会耗尽内存,你可以为 redis 设置一个最大大小,你可能对 MongoDB 也可以这样做,这是强制性的。

如果您的大小合适(MongoDB RAM + Redis RAM < 硬件 RAM),您将不会在磁盘上为 redis 获得任何交换(这绝对是您想要防止的)但也许 mongodb 缓存不会那么好(不够优化的地方)。如果您的数据增长,redis 的内存减少始终是一个挑战:如果数据大小不可预测,请注意内存不足!

如果您将备份与 redis 一起使用,它使用的 RAM 比其数据集更多来生成转储,因此请注意这一点。这也意味着使用 IO。

IO

在这种情况下(更少的 RAM)mongo 会做更多的 IO 来访问数据。Redis,取决于您的备份策略,可以使用或不使用 IO(您的选择)。最坏的情况:如果你在 redis 上使用 AOF,它会产生很多 IO,所以 IO 可能会成为这个架构的瓶颈。如果你不使用 redis 备份:你不会有问题。对于 Mongo 来说,SSD 也是一个不错的选择。

中央处理器

我不知道 MongoDB 是否使用大量 CPU,但 redis 大部分时间都不会,除了在备份期间。如果您使用 redis 备份:尝试为其提供两个 CPU 内核(一个用于 redis,一个用于备份任务)。

网络

这取决于您的客户数量。但是你应该检查你的机器的吞吐量/输入负载,看看你是否没有饱和(例如使用 monit 和警报)。有时是瓶颈,一台机器的吞吐量不够!

于 2015-02-03T10:55:57.963 回答