你什么时候开始额外的Elasticsearch节点?

我正在尝试用Elasticsearch取代Solr设置。 这是一个新的设置,还没有看到生产,所以我有很多空间摆弄东西,让他们工作得很好。

我有非常非常大量的数据。 我将一些实时数据编入索引并保存7天(使用_ttl字段)。 我不在索引中存储任何数据(并禁用_source字段)。 我预计我的指数将稳定在200亿左右。 我将把这些数据放入2-3个命名索引中。 到目前为止search性能高达几十亿行是完全可以接受的,但是索引性能是一个问题。

我对ES如何在内部使用分片有点困惑。 我创build了两个ES节点,每个节点都有一个单独的数据目录,每个目录有8个索引和1个副本。 当我查看群集状态时,我只能看到每个节点有一个分片和一个副本。 不是每个节点都保持多个内部运行的索引吗? (检查磁盘上的存储位置显示肯定只有一个Lucene索引存在)。 – 解决了,因为我的索引设置没有从configuration中正确拾取。 现在使用API​​创build索引并指定碎片和副本的数量,现在已经完全产生了我期望看到的结果。

另外,我尝试运行相同ES节点的多个副本(来自相同的configuration),并且它确认已经有一个副本运行并创build了自己的工作区域。 这些新的节点实例似乎也只有一个磁盘索引。 – 现在每个节点实际上使用多个索引,具有多个索引的单个节点已经足够扼杀整个系统,所以这不是问题。

何时启动额外的Elasticsearch节点,以获得最大的索引性能? 我是否应该有多个节点,每个节点运行1个索引1个副本,或者更less的节点有大量的索引? 有没有我的configuration丢失,为了让单个节点做更多的工作?

另外:是否有任何度量值知道什么时候只有HTTP的节点过载? 现在我有一个节点专门用于HTTP,但除了CPU使用率,我不知道它是否行得通。 什么时候启动额外的HTTP节点,并将索引软件拆分为指向不同的节点?

首先澄清一下术语:

  • Node :运行一个Elasticsearch实例(一个java进程)。 通常每个节点都在自己的机器上运行。
  • 群集 :具有相同群集名称的一个或多个节点。
  • 索引 :或多或less像数据库。
  • types :或多或less像数据库表。
  • 碎片 :有效的lucene索引。 每个索引都由一个或多个碎片组成。 分片可以是主分片(或简称为分片)或副本

创build索引时,可以指定每个分片的分片数量和副本数量。 缺省值是每个分片5个主分片和1个副本。 碎片自动均匀地分布在集群上。 副本分片永远不会分配到相关主分片所在的同一台计算机上。

你在群集状态中看到的是奇怪的,我build议使用get settings API来检查你的索引设置。 看起来你只configuration了一个碎片,但无论如何,如果你有多个索引,你应该看到更多的碎片。 如果您需要更多帮助,可以发布您从elasticsearch获得的输出。

你使用多less个分片和副本真的取决于你的数据,你访问它们的方式以及可用节点/服务器的数量。 最好的做法是稍微过量分配碎片,以便在向群集添加更多节点的情况下重新分配碎片,因为创build索引后无法(现在)更改碎片的数量。 否则,如果您愿意对数据进行完全重新索引,则可以随时更改碎片的数量。

由于每个碎片实际上是一个Lucene实例,所以每个额外的碎片都会带来一定的成本。 每台机器可以拥有的最大数量的碎片实际上取决于可用的硬件和数据。 很高兴知道,每个碎片或100个碎片索引有100个索引是相同的,因为在这两种情况下都有100个lucene实例。

当然,在查询的时候,如果你想查询一个由100个分片组成的elasticsearch索引,那么elasticsearch将需要查询它们以获得正确的结果(除非你使用特定的路由来处理文档,然后只查询特定的分片)。 这会有一个性能成本。

您可以使用Cluster Nodes Info API轻松检查群集和节点的状态,通过它可以检查大量有用的信息,您只需要知道节点是否正常运行即可。 更容易的是,有几个插件可以通过一个不错的用户界面(内部使用elasticsearch API)来检查这些信息: 辅助医疗机构和bigdesk 。