运行 MongoDB 和 Redis 在同一主机的两个不同容器上

Running MongoDB and Redis on two different containers in the same host machine

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

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

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

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

内存

MongoDB 和 Redis 不共享任何内存。使用同一个主机的问题是你可以用这两个进程 运行 超出 RAM,你可以为 redis 设置一个最大大小,你可能可以为 MongoDB 做同样的事情,它是强制性的。

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

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

IO

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

的不错选择

CPU

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

网络

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