我已经读过MongoDB和Redis服务器不应该在同一主机上执行的地方,因为Redis管理内存的方式损害了MongoDb。这是在Docker.io之前。但现在看来情况有所不同吗?在同一台主机上的两个不同容器上运行Redis服务器和MongoDB是否方便?
答案 0 :(得分:2)
今天的许多服务,特别是数据库,都是非常积极的消耗资源,并且被设计为认为它们将(或应该)在专用机器中执行。 MongoDB和Redis尝试将大量数据保存在内存中,并尝试为自己获取更多内存。要避免此服务占用主机的所有内存,您可以使用-m="<number><optional unit>"
中的docker run
限制容器使用的最大内存。例如:docker run -d -m="2g" -p 27017:27017 --name mongodb dockerfile/mongodb
因此,您可以轻松控制服务的资源限制,并在对资源进行细粒度控制的同一主机中运行它们。无论如何,考虑到设计这些服务的性能是因为认为主机的资源将完全可用于它们是非常重要的。例如,像Cassandra这样的其他数据库将占用大量内存,而且,它们被设计为具有写入磁盘的顺序访问。在这些情况下,Docker将允许您运行限制所使用的资源,但如果您在同一主机中运行多个服务,它们的性能将严重下降。
答案 1 :(得分:2)
Docker不会更改您的硬件,也是处理未虚拟化资源的操作系统,因此这里应该使用与普通硬件相同的规则。
<强> RAM 强>
MongoDB和Redis不共享任何内存。使用相同主机的问题是你可以用这两个进程耗尽RAM,你可以为redis设置最大大小,你可以为MongoDB做同样的事情,这是强制性的。
如果您的大小调整良好(MongoDB RAM + Redis RAM&lt;硬件RAM),您将无法在磁盘上进行任何交换(这绝对是您想要阻止的),但也许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和警报)。有时它是瓶颈,而不是一台机器的吞吐量!