MongoDB高平均刷新时间-写重

MongoDB高平均刷新时间-写重,mongodb,Mongodb,我使用的MongoDB有大约400万个文档和大约5-6GB的数据库大小。这台机器有10GB的RAM,仅免费报告使用了大约3.7GB。该数据库用于视频游戏相关的阶梯(排名)网站,按地区分开 这是一个写操作量相当大的操作,但仍然会得到大量的读取。我们使用一个更新程序,每一两个小时查询一次外部源。然后,此更新程序处理记录并更新数据库上的文档。更新程序一次只处理一个区域(参见上一段),因此大约33%的数据库被更新 当更新程序运行时,在其运行期间,平均刷新时间峰值高达35-40秒左右,并且我们在其他查询中

我使用的MongoDB有大约400万个文档和大约5-6GB的数据库大小。这台机器有10GB的RAM,仅免费报告使用了大约3.7GB。该数据库用于视频游戏相关的阶梯(排名)网站,按地区分开

这是一个写操作量相当大的操作,但仍然会得到大量的读取。我们使用一个更新程序,每一两个小时查询一次外部源。然后,此更新程序处理记录并更新数据库上的文档。更新程序一次只处理一个区域(参见上一段),因此大约33%的数据库被更新

当更新程序运行时,在其运行期间,平均刷新时间峰值高达35-40秒左右,并且我们在其他查询中会遇到一般性的缓慢。更新程序在一台单独的机器上运行,当从第三方检索并处理完所有数据后,只在最后查询MongoDB

一些人建议放慢更新的速度,或者只更新已经更换的玩家,但问题在于排名。由于我们支持玩家之间的联系,我们需要预先计算排名-因此,如果只有少数用户实际更改了排名,我们仍然需要相应地更新其余用户的排名。至少,MySQL就是这种情况——我不确定MongoDB是否有一个好的解决方案,可以在支持关系的同时对~800K->120万个文档进行排名

我的问题是:我们如何才能改善我们正在经历的冲水和减速?为什么这么高?禁用日志记录(以减轻i/o的负担)是否会有所帮助,因为数据丢失并不是我担心的事情,因为数据库会频繁更新


服务器状态:

在没有看到任何磁盘统计数据的情况下,我认为您的磁盘已饱和

这可以通过
iostat-xmt2
检查,并检查
%util

请不要禁用日志记录-当您的机器崩溃时,您只会在以后的过程中导致更多问题

分离集合将无效。分离数据库可能会有问题,但如果您是IO绑定的,这将无助于您

选项

如果我的回答是正确的,并且您的磁盘已经饱和,那么在RAID 10配置中添加更多磁盘将极大地提高性能和耐用性—如果您将日志分离到SSD,则更是如此


假设这台机器是一台服务器,您可以设置一个复制集并将读取查询发送到那里。这应该会对您有所帮助,但没有磁盘那么多。

在没有看到任何磁盘统计数据的情况下,我认为您的磁盘已饱和

这可以通过
iostat-xmt2
检查,并检查
%util

请不要禁用日志记录-当您的机器崩溃时,您只会在以后的过程中导致更多问题

分离集合将无效。分离数据库可能会有问题,但如果您是IO绑定的,这将无助于您

选项

如果我的回答是正确的,并且您的磁盘已经饱和,那么在RAID 10配置中添加更多磁盘将极大地提高性能和耐用性—如果您将日志分离到SSD,则更是如此


假设这台机器是一台服务器,您可以设置一个复制集并将读取查询发送到那里。这应该对您有一定的帮助,但没有磁盘那么大。

您使用的工具不正确。MongoDB不是为实时排列大型阶梯而设计的,至少不是快速排列

使用像Redis这样的东西,Redis有一种叫做“排序列表”的东西,专门为这个任务设计,有了它,你可以有1亿个条目,并且仍然以亚毫秒的速度获取5000000到5001000个条目

从官方网站():

排序集

使用排序集,您可以非常快速地添加、删除或更新元素(时间与元素数量的对数成正比)。由于元素是按顺序排列的,而不是按顺序排列的,所以您还可以通过分数或排名(位置)以非常快的方式获得范围<强>访问排序集的中间也是非常快的< /强>,因此您可以使用排序的集合作为非重复元素的智能列表,您可以快速地访问所需的所有元素:顺序元素、快速存在测试、快速访问中间元素;p> 简言之,使用排序集,您可以以优异的性能完成许多任务,而这些任务在其他类型的数据库中很难建模

使用排序集,您可以

在一个大型在线游戏中设置一个排行榜,每次提交一个新分数时,你都会使用ZADD更新它。您可以使用ZRANGE轻松获取顶级用户,也可以在给定用户名的情况下,使用ZRANK返回其在列表中的排名。同时使用ZRANK和ZRANGE,可以向用户显示与给定用户相似的分数。一切都很快。

排序集通常用于索引存储在Redis中的数据。例如,如果有许多表示用户的散列,则可以使用排序集,其中的元素以用户的年龄作为分数,以用户的ID作为值。因此,使用ZRANGEBYSCORE检索具有给定年龄间隔的所有用户既简单又快速

排序集可能是最高级的Redis数据类型,因此请花一些时间检查排序集命令的完整列表,以了解您可以使用Redis做什么


你用错了工具做这项工作。MongoDB不是为实时排列大型阶梯而设计的,至少不是快速排列

使用像Redis这样的东西,Redis有一种叫做“排序列表”的东西,专门为这个任务设计,有了它,你可以有1亿个条目,并且仍然以亚毫秒的速度获取5000000到5001000个条目

从办公室