Mongodb 分片和索引

标签 mongodb indexing sharding

我一直在努力部署一个大型数据库。 我已经部署了 3 个分片集群并开始索引我的数据。 然而,已经 16 天了,我才完成了一半。

问题是,我是否应该将所有数据导入非分片集群,然后在原始数据进入数据库后激活分片,然后附加更多集群并开始索引?这会自动平衡我的数据吗?

或者我应该再等 16 天才能使用当前的方法...

*编辑: 以下是对正在导入的设置和数据的更多说明...

所以我们有 1.6 亿个这样的文档

"_id" : ObjectId("5146ae7de4b0d58a864bcfda"),
"subject" : "<concept/resource/propert/122322xyz>",
"predicate" : "<concept/property/os/123ABCDXZYZ>",
"object" : "<http://host/uri_to_object_abcdy>"

索引:主语、谓语、宾语、主语 > 谓语、宾语 > 谓语 分片键:主语、谓语、宾语

设置: AWS 上的 3 个集群(每个集群有 3 个副本集),每个节点有 8 GiB RAM (配置服务器在每个集群中,Mongos 在单独的服务器中)

数据由 Java 程序导入到 Mongos。 导入此数据、索引和分片的理想方式是什么。 (无需等待一个月才能完成该过程)

最佳答案

如果您正在执行大量的批量插入,那么在没有索引的情况下执行插入然后索引集合通常会更快。这与 Mongo 动态管理索引更新的方式有关。

此外,MongoDB 在索引时对内存特别敏感。检查 db.stats() 中索引的大小并将您的数据库连接到 Mongo Monitoring Service .

根据我的经验,每当 MongoDB 花费的时间比预期的多很多时,这是由于以下两种情况之一:

  1. 它耗尽了物理内存或使自己陷入糟糕的 I/O 模式。 MMS 可以帮助诊断两者。尤其要查看页面错误图。

  2. 对未索引的集合进行操作,这不适用于您的情况。

关于Mongodb 分片和索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15733885/

相关文章:

c# - Mongo .Net Driver PipelineStageDefinitionBuilder.Project 会自动忽略所有带有 facet 的 Id 值

lucene - 选择 solr/lucene 提交策略

python - 如何从数据集中提取n个 block ?

mongodb 分片键哈希算法

javascript - 在node.js进程之间读取-共享巨大的哈希值

mongodb - 使用聚合框架对每个组进行分组并取前 K

用于刷卡式应用程序的 Mongodb 模式设计

python - 在Python中计算较小的数字

sql - 在 Postgres 中使用按位运算符获取分片 ID

bash - 在centos7 docker镜像上连接到mongodb