当前位置: 首页 > 面试题库 >

何时启动其他Elasticsearch节点?

傅鸿波
2023-03-14
问题内容

我正在尝试用Elasticsearch替换Solr设置。这是一个新的设置,尚未投入生产,因此我有很大的空间来摆弄各种东西并使它们运转良好。

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

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

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

何时启动其他Elasticsearch节点,以获得最佳索引性能?我是否应该有多个节点,每个节点都运行1个索引1副本,或者更少的节点具有大量索引?为了使单个节点完成更多工作,我的配置中缺少什么吗?

另外:是否有任何度量标准可以知道仅HTTP节点何时过载?现在,我只有一个节点专用于HTTP,但是除了CPU使用率之外,我无法确定它是否运行正常。什么时候启动其他HTTP节点并拆分索引软件以指向各个节点?


问题答案:

首先让我们澄清一下术语:

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

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

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

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

由于每个分片实际上都是Lucene实例,因此每个附加分片都需要付费。每台计算机可以拥有的最大分片数量实际上取决于可用的硬件以及您的数据。很高兴知道,每个分片具有100个索引,或者一个分片具有100个索引,实际上是相同的,因为在两种情况下,您都有100个Lucene实例。

当然,在查询时,如果您要查询由100个分片组成的单个Elasticsearch索引,elasticsearch将需要全部查询它们才能获得正确的结果(除非您为文档使用特定的路由,然后仅查询特定的分片)。这将产生性能成本。

您可以使用“ 群集节点信息”
API轻松检查群集和节点的状态,通过它可以检查很多有用的信息,这是您需要的所有信息,以便知道节点是否运行顺畅。更简单的是,有两个插件可以通过一个不错的用户界面(无论如何内部都使用Elasticsearch API)检查这些信息:paramedic和bigdesk。



 类似资料:
  • 我正在尝试用ElasticSearch替换Solr设置。这是一个新的设置,还没有看到生产,所以我有很多的空间来摆弄东西,使他们工作良好。 我有非常非常大量的数据。我正在索引一些实时数据并将其保存7天(通过使用_ttl字段)。我没有在索引中存储任何数据(并且禁用了_source字段)。我预计我的指数稳定在200亿行左右。我将把这些数据放入2-3个命名索引中。到目前为止,多达几十亿行的搜索性能是完全可

  • 我试图构造一个hadoop集群,它由EC2中的1个namenode、1个secondary namenode和3个DataNode组成。 所以我将secondary namenode的地址写入masters文件并执行start-dfs.sh。 但是,次要名称码并不是从主文件中写入的地址开始的。它只是从执行stat-dfs.sh脚本的节点开始。 :~/hadoop/etc/hadoop$start-

  • 我需要使用以下任何一项对rundeck进行身份验证:curve25519-sha256@libssh.org,diffie-hellman-group18-sha512,曲线25519-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512 但似乎只有以下选项可用:ecdh-sha2-nistp256、ecdh-sha2

  • 其他的细节 java8 bulid: Web3j提供对所有响应类型的安全访问。可选的或null响应java 8都支持。 异步请求包在一个java 8的CompletableFutures。Web3j提供了围绕所有异步请求的打包工具,以确保在执行期间可以捕获任何异常,而不只是丢弃。由于在完全检查中会有很多缺少支持的异常情况,这些异常通常被确定为未检测到的异常,导致检测过程出现问题。有关详细信息,请参

  • 我想直接从我的应用程序运行另一个应用程序(Polaris Office)。但它也应该直接打开PDF文件。 我尝试了以下代码: 知道我该怎么做吗?我当前的代码给出了错误消息: 原因:java。lang.SecurityException:权限拒绝:启动Intent{act=android.Intent.action.MAIN dat=file:///mnt/sdcard/pdf.pdftyp=app

  • 我希望netty服务器A在启动时连接netty服务器B,听起来像代理,所以我尝试了netty代理示例,但它只是在中启动netty客户端,只有一个新的连接处于活动状态,客户端才会被创建。当服务器A启动时,我需要通知服务器B做一些“注册”的事情,我该怎么办?