什么时候启动其他Elasticsearch节点?

时间:2012-09-13 15:11:13

标签: elasticsearch sharding bigdata

我正在尝试用Elasticsearch替换Solr设置。这是一个新的设置,还没有看到生产,所以我有很大的空间摆弄东西,让它们运作良好。

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

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

此外,我尝试运行同一ES节点的多个副本(来自相同的配置),并且它识别出已经有一个副本在运行并创建自己的工作区。这些新的节点实例似乎也只有一个索引在磁盘上。 - 现在每个节点实际上都在使用多个索引,具有多个索引的单个节点绰绰有余地限制整个系统,所以这个是一个非问题。

何时启动其他Elasticsearch节点,以获得最大的索引性能?我应该有多个节点,每个节点运行1个索引1副本,或更少的节点有多吨索引?为了让单个节点做更多的工作,我的配置是否缺少一些东西?

另外:是否有任何指标可用于了解何时仅HTTP节点过载?现在我只有一个节点专门用于HTTP,但除了CPU使用情况之外,我无法判断它是否正常。什么时候启动其他HTTP节点并将索引软件拆分为指向各个节点?

1 个答案:

答案 0 :(得分:78)

让我们首先澄清术语:

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

创建索引时,您可以指定每个分片的分片数和副本数。默认值为每个分片5个主分片和1个副本。分片自动均匀分布在群集上。永远不会在相关主分片所在的同一台机器上分配副本分片。

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

您使用的碎片和副本实际上取决于您的数据,访问方式以及可用节点/服务器的数量。最佳做法是稍微分配碎片以便在您向群集添加更多节点时重新分配碎片,因为在创建索引后您不能(现在)更改碎片的数量。否则,如果您愿意对数据进行完整的重新索引,则可以随时更改分片数。

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

当然,在查询时,如果要查询由100个分片组成的单个elasticsearch索引,弹性搜索将需要查询所有索引以获得正确的结果(除非您使用特定的路由为您的文档,然后只查询特定的碎片)。这会产生性能成本。

您可以使用Cluster Nodes Info API轻松检查群集和节点的状态,通过该paramedic可以查看大量有用信息,以便了解节点是否正常运行。更简单的是,有一些插件可以通过一个漂亮的用户界面检查这些信息(无论如何内部使用elasticsearch API):bigdesk和{{3}}。