Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一主机上的两个不同容器上运行MongoDB和Redis_Mongodb_Redis_Virtual Machine_Docker_Linux Containers - Fatal编程技术网

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

在同一主机上的两个不同容器上运行MongoDB和Redis,mongodb,redis,virtual-machine,docker,linux-containers,Mongodb,Redis,Virtual Machine,Docker,Linux Containers,我在某个地方读到,MongoDB和Redis服务器不应该在同一台主机上执行,因为Redis管理内存的方式会损坏MongoDB。这是在Docker.io之前。但现在情况似乎大不一样了?在同一台主机上的两个不同容器上运行Redis server和MongoDB方便吗?当今的许多服务,特别是数据库,都是非常消耗资源的服务,设计时认为它们将(或应该)在专用机上执行。MongoDB和Redis试图将大量数据保存在内存中,并尝试为自己获取更多内存。为避免此服务占用主机的所有内存,您可以在docker run

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

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


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

当今的许多服务,特别是数据库,都是非常消耗资源的服务,其设计思想是它们将(或应该)在专用机器上执行。MongoDB和Redis试图将大量数据保存在内存中,并尝试为自己获取更多内存。为避免此服务占用主机的所有内存,您可以在
docker run
中使用
-m=”“
限制容器使用的最大内存。例如:
docker-run-d-m=“2g”-p 27017:27017--名称mongodb dockerfile/mongodb


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

Docker不会更改您的硬件,而且是操作系统处理未虚拟化的资源,因此这里应该应用与普通硬件相同的规则

RAM

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)。有时这是瓶颈,而不是一台机器的吞吐量不足

Docker不会更改您的硬件,而且是操作系统处理未虚拟化的资源,因此这里应该应用与普通硬件相同的规则

RAM

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中使用备份:就不会有问题。