在 MongoDB 和 ElasticSearch 之间进行选择 - Scaling/Sharding

Choosing between MongoDB and ElasticSearch - Scaling/Sharding

我目前正在 MongoDB 和 Elasticsearch 之间做出选择,作为日志记录和分析平台的后端。我计划使用一个由 5 个 Intel Xeon 四核服务器组成的集群,每个服务器具有 64GB RAM 和一个 500GB NVMe 驱动器。使用 1 个副本集,我猜它应该支持 1TB+ 的数据。

根据我在 Elasticsearch 上读到的内容,上述服务器的推荐设置是 5-10 个分片,但如果不进行大规模迁移,未来将无法增加分片。所以也许我可以为同一个索引向集群添加 5 个 servers/nodes,但不是 10 或 20,因为我无法创建更多的分片来分布在新的 nodes/servers - 正确吗?

MongoDB 似乎可以根据键值自动管理分片,并在添加更多节点时重新分配这些分片。那么这是否意味着我可以在未来向集群中添加 50 台服务器并且 MongoDB 会愉快地将来自这个索引的数据分布到所有服务器上?

我现在基本上只需要 1TB 的存储空间,但如果这 1 个数据集最终增长到 100TB,我不想把自己逼到墙角。

如果不在一开始就使用 100 个分片启动 Elasticsearch,这似乎是低效和糟糕的做法,它如何能够针对这个单一数据集扩展超过 5/10 个服务器?

  1. 正如 Val 所说,您通常会有基于时间的索引,因此您可以轻松地(以高效的方式)在一定的保留期后删除数据。因此,当您的需求随时间变化时,您会更改分片编号(通常通过索引模板)。
  2. Elasticsearch 的当前版本现在支持 _split API,它完全满足您的要求:最初使用 5 个分片,但可以选择增加到 20 的任意因子(仅作为示例) — 所以 5 -> 10 -> 30 将是选项。
  3. 如果您有 5 个主分片且复制因子为 1,您仍然可以将负载分散到 10 个节点上:写入 5 个主分片和 5 个副本分片;读取将转到其中任何一个。 Elasticsearch 的写/读模型通常与 MongoDB 的不同。

PS 免责声明:我现在在 Elastic 工作,但我在生产中使用 MongoDB 也有 5 年了。