做完所有正确的事情——选择一个合适的分片键,水平扩展,将我的数据分布在几个分片上,我发现我现在没有真正的方法来确定数据在文档数量和数据大小方面的平衡程度。该sh.status()
命令将告诉我块是如何按计数分布的,但不会告诉我这些块是由什么组成的。
有很多方法可以推断出这些事情——但它们都有缺点。数据库大小计算方式的变幻莫测意味着,如果数据库中有大量删除,则统计数据可能无法准确反映数据分布。如果我查看每个分片的流量,这可能会给我一些线索,但前提是我的流量很好且可预测。
那么,如何确定每个块中文档的分布、每个块的相对大小以及(当然)这些块当前所在的位置?
目前没有内置的方法可以做到这一点,所以需要一个小函数。出于此答案的目的,我按照这些说明创建了一个包含约 100 万个文档的 2 分片集群。接下来我使用这个函数来检查这些文件:
目前它非常基本,但它可以完成工作。我还在github 上添加了它,并且可能会在那里进一步扩展它。但就目前而言,它会做需要做的事情。在开头描述的测试数据集上,输出如下所示(为简洁起见,删除了一些数据):
解释传递给函数的参数:
第一个参数是要检查的名称空间(字符串),第二个参数(布尔值)是是否使用估计选项。对于任何生产环境,建议使用
estimate:true
它——如果不使用,则需要检查所有数据,这意味着将其拉入内存,这将是昂贵的。虽然该
estimate:true
版本不是免费的(它使用计数和平均对象大小),但即使在大型数据集上运行也至少是合理的。如果对象大小在某些分片上存在偏差,则估计版本也可能会有些偏差,因此平均大小不具有代表性(这通常很少见)。这是一个非常好的命令,我经常用于这样的事情。它将显示每个分片的总块、平均块大小、文档计数。它不会像上面的答案那样为您提供每个块的数据,但这非常快,并且可以很好地概述您正在寻找的内容。