忘记数据库类比。弹性搜索中没有表格之类的东西,类比只是在多个层次上中断。架构与索引并不完全相同。类型与表无关。行在 Lucene 等中的任何地方都不存在。
正如@monkjack 建议的那样,最好考虑分片的数量。索引、类型和别名基本上是组织分片的逻辑手段。分片是一个或多或少独立的一组 lucene 索引(对于每个字段),它们作为一个整体进行管理。给定一个索引类型的文档集合,该集合将被分成 n 个分片,每个分片都有自己的文件集(每个字段)。
集群必须处理的分片数量会对内存、文件句柄数量等产生影响。平衡良好的集群会为每个节点分配足够少的分片,以便它可以有效地利用其 RAM。因此,如果您有 10 个索引,每个索引有 10 个分片,那么您就有 100 个分片。如果它们被复制一次,你实际上有 200 个分片。因此,如果您有 4 个节点,则每个节点有 50 个分片。取决于碎片有多大,这可能是也可能不是问题。弹性搜索非常有效地处理多个分片并执行诸如在分片上同时索引或跨分片搜索之类的事情。因此,每个节点 1 个分片可能不是那么好,每个节点 1000 个分片可能会导致一些开销。更多分片意味着您可以利用更多节点。如果你只有 2 个分片和 10 个节点,您将有一些机器空转。反过来可能是一个更好的主意。等等。
索引:分片组。具有复制和分片设置。这些很重要。创建索引后就无法更改它们。解决方案,如果您必须:使用别名,创建新索引,重新索引数据,切换别名,删除旧索引。
类型:文档组。属于一个索引。一个索引可以有多种类型,但它们都共享相同的分片。创建类型时,分片的数量不会改变。类型可以出现在多个索引中,您可以创建跨越多个类型和索引的查询。
别名:一个或多个索引的替代名称。这是一个非常强大的功能,它允许您实现例如模式迁移或每天创建一个新索引,只需将别名更改为指向新索引即可。
因此,在您的情况下,拥有数千个租户,每个租户都有自己的索引,这将导致大量分片。可能不是最好的主意。您不希望分片数量和租户数量之间存在直接联系。仅当每个租户的负载微不足道且每个租户的文档数量微不足道时,您才可能侥幸逃脱。
如果您希望每个索引具有不同的服务质量,那么在单个索引或多个索引下为每个租户提供自己的类型可能是一个更好的主意。通过这种方式,您可以控制分片的数量并在类型级别保持租户隔离。