起因是需要往MongoDB 的Shard 分片集群导入两个T(十亿文档)级别的数据。其中遇到了各种很严重的性能问题,在这里做一下记录。
0x01 索引
在导入数据时,尽量不提前建立索引,仅建立必须的shard_key
。
0x02 批量写入
在进行大批量导入时,尽量使用insert_many
进行批量写入。若写入顺序不重要的话,可以设置ordered=False
来提高速度。
0x03 SHARD_FILTER问题
若从一个Shard 集群读取数据,并且读取的规则为Secondary Preferred ,在查询时会缺少SHARD_FILTER
阶段。
在项目中遇到一个问题:集群中两个分片都保有同一条数据。
在这种情况下,若是没指定Primary Preferred ,则可能造成一条数据返回两次的情况。而经过了SHARD_FILTER
阶段,会自动过滤掉多余的数据。
0x04 其他问题
-
假若分片不均 ,可以使用hashed索引作为分片索引
-
假若导入的集合已存在使用过的 索引,那么这个索引存在缓存,可能会导致分片不均。此时删除重建即可。
-
使用insert_many 批量导入完成之后,可能会存在文档数量过多的情况,这是正常的,等待数据库自动平衡去重即可