ElasticSearch 实践过程中遇到的几个小问题

2023-10-31

ulimit “不生效”

有一台机器的在启动 ES 的时候始终报错

1
max file descriptors [65000] for elasticsearch process is too low

但是我已经在/etc/security/limits.conf里增加了如下配置,

1
2
3
4
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536

按理说ulimit -n的时候应该是会到看到 65536 的,但是依旧输出的是 65000。郁闷

最后受这篇文章 ulimit 到底谁说了算? 的启发,我把排查目标放在了 profile 和 bashrc 文件上面。

最终发现原来还真是有人在这台机器的/etc/bashrc的文末加了一句ulimit -n 65000,把这行去掉后就正常了。

如果你也出现了这个问题,建议排查一下以下四个文件:

1
2
3
4
/etc/profile
/etc/bashrc
~/.profile
~/.bashrc

由 X-Pack 的认证机制引起的问题

X-Pack 是一个 Elastic Stack 的扩展,将安全,警报,监视,报告和图形功能包含在一个易于安装的软件包中。在 Elasticsearch 5.0.0 之前,您必须安装单独的 Shield,Watcher 和 Marvel 插件才能获得在 X-Pack 中所有的功能。

ES、Kibana 和 X-Pack 的安装很简单,有需要的可以参看:安装 Elasticsearch、Kibana 和 X-Pack

HTTP REST API

在终端里访问 REST API 的时候

1
curl -XGET 'localhost:9200/_cat/health?v&pretty'

会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "missing authentication token for REST request [/_cat/health?v&pretty]",
        "header": {
          "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
        }
      }
    ],
    "type": "security_exception",
    "reason": "missing authentication token for REST request [/_cat/health?v&pretty]",
    "header": {
      "WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""
    }
  },
  "status": 401
}

解决办法是添加上账号密码就好了

1
curl --user elastic:changeme -XGET 'localhost:9200/_cat/health?v&pretty'

这样就能正常访问了:

1
2
epoch      timestamp cluster  status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1487747024 15:03:44  myClusterName yellow          1         1     19  19    0    0       19             0                  -                 50.0%

这个账号密码实际上是 X-Pack 这个插件附带的认证功能

Java API

使用 X-Pack 后,使用 Java API 获取 Client 的时候会报一个类似这样的错:

1
2
3
4
5
...
NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{pyXJL2PeTtGejUwbpycDUg}{127.0.0.1}{127.0.0.1:9300}]]
...
Caused by: org.elasticsearch.ElasticsearchSecurityException: missing authentication token for action [cluster:monitor/nodes/liveness]
...

其实看到Caused by的时候基本就已经能确定是因为 X-Pack 引入的认证机制而引起的错误。

既然知道了错误原因,那么就加上用户名和密码呗!但是事情却不是想的那么简单,ES 的官方文档里并没有提到在哪里可以加用户名和密码。

那么想必 Google 一下就能解决了吧,但是这个解决的过程其实并不顺利。首先 ES 的版本比较多,如果是 ES5 之前的版本是基本没见到这个问题的,其次也不是每个人都会装 X-Pack 的啊!最后 pass 掉了几种过气了的解决方案后,终于在 ES 的社区找到了个类似的问题,最终解决的办法其实 elastic 已经写到了它的文档中,只不过不是 ElasticSearch 的文档而是 X-Pack 的文档里(唉,其实我应该早想到的 [捂脸])

解决的关键是要引入一个 jar 包 x-pack-transport-5.2.1.jar,在构造 TransportClient 时用这个 jar 包里的 PreBuiltXPackTransportClient 替换掉 PreBuiltTransportClient,然后就可以在 Settings 里定义xpack.security.user了。

解决步骤如下(以使用 Maven 来管理依赖为例):

  1. 首先在 pom.xml 文件里添加仓库和依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<project ...>

   <repositories>
      <!-- add the elasticsearch repo -->
      <repository>
         <id>elasticsearch-releases</id>
         <url>https://artifacts.elastic.co/maven</url>
         <releases>
            <enabled>true</enabled>
         </releases>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </repository>
      ...
   </repositories>
   ...

   <dependencies>
      <!-- add the x-pack jar as a dependency -->
      <dependency>
         <groupId>org.elasticsearch.client</groupId>
         <artifactId>x-pack-transport</artifactId>
         <version>{version}</version>
      </dependency>
      ...
   </dependencies>
   ...

 </project>
  1. 然后在配置里加入xpack.security.user就好了
1
2
3
4
5
6
7
8
9
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
...

TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
        .put("cluster.name", "myClusterName")
        .put("xpack.security.user", "elastic:changeme")
        ...
        .build())
    .addTransportAddress(new InetSocketTransportAddress("localhost", 9300));

正常的话做完上边两步后代码就能顺利执行了。不过我因为用的 Maven 库是公司的私服,在第一步添加依赖的时候始终加不上,而 x-pack-transport-5.2.1.jar 这个包直接以及间接依赖的包多达二十多个,一个个手动添加是不现实的,这时候只能开始处理 Maven 的配置问题。由于 Maven 平时我也只是直接使用,settings.xml 配置文件都是从前辈那里传下来的,没有仔细研究过,这次算是补补课了。

我的 ${HOME}/.m2/settings.xml 里之前 mirrors 节点的配置如下:

1
2
3
4
5
6
7
8
9
10
<mirrors>
  <mirror>
    ...
  </mirror>
  <mirror>
    <id>nexus</id>
    <mirrorOf>*</mirrorOf>
    <url>http://my.host.com/nexus/groups/public</url>
  </mirror>
</mirrors>

问题是由<mirrorOf>*</mirrorOf>这个配置引起的,mirrorOf的含义如下:

mirrorOf:用来表示该 mirror 是关联的哪一个仓库,其值为其关联仓库的 id。当要同时关联多个仓库时,这多个仓库之间可以用逗号隔开;当要关联所有的仓库时,可以使用 “” 表示;当要关联除某一个仓库以外的其他所有仓库时,可以表示为 “,!repositoryId”;当要关联不是 localhost 或用 file 请求的仓库时,可以表示为 “external:*”。

既然找到了问题所在,那么对应的改之即可,即 id 为 elasticsearch-releases 的这个 repository 不再会关联到 nexus 这个镜像上

1
2
3
4
5
6
7
8
9
10
<mirrors>
  <mirror>
  ...
  </mirror>
  <mirror>
    <id>nexus</id>
    <mirrorOf>*,!elasticsearch-releases</mirrorOf>
    <url>http://my.host.com/nexus/groups/public</url>
  </mirror>
</mirrors>

P.S.

You can also add an Authorization header to each request. If you’ve configured global authorization credentials, the Authorization header overrides the global authentication credentials. This is useful when an application has multiple users who access Elasticsearch using the same client. You can set the global token to a user that only has the transport_client role, and add the transport_client role to the individual users.

代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.xpack.security.authc.support.SecuredString;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;

import static org.elasticsearch.xpack.security.authc.support.UsernamePasswordToken.basicAuthHeaderValue;
...

TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
        .put("cluster.name", "myClusterName")
        .put("xpack.security.user", "transport_client_user:changeme")
        ...
        .build())
    .build()
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300))
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9301))

String token = basicAuthHeaderValue("elastic", new SecuredString("changeme".toCharArray()));

client.filterWithHeader(Collections.singletonMap("Authorization", token))
    .prepareSearch().get();

关于 SSL 可以参考 Java Client and Security

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch 实践过程中遇到的几个小问题 的相关文章

  • 如何在 Elasticsearch NEST 中序列化 JToken 或 JObject 类型的属性?

    我正在将 Elasticsearch 引入 C API 项目 我想利用现有的 API 模型作为搜索文档 其中许多模型允许添加自定义数据点 这些是使用JObject https www newtonsoft com json help htm
  • 如何在 Elasticsearch 中同时按父字段和嵌套字段排序?

    我需要同时按父字段和嵌套字段在 Elasticsearch 中排序 我的数据是这样的 id 1 rank 8 price 12 45 offers id 777 rank 12 price 45 75 id 2 rank 35 price
  • Elasticsearch 对字符串排序未返回预期结果

    当对包含多个单词的字符串字段进行排序时 Elasticsearch 会拆分字符串值并使用最小值或最大值作为排序值 即 当对值为 老虎之眼 的字段进行升序排序时 排序值为 Eye 当按降序排序时 排序值为 Tiger 假设我的索引中有 老虎之
  • 使elasticsearch中的所有对象嵌套对象

    是否可以让elasticsearch中的所有嵌套对象自动映射到默认嵌套的类型 而不是对象 是的 您可以使用以下方法来做到这一点动态模板 https www elastic co guide en elasticsearch referenc
  • 分割多重多边形

    我可以直接取出零件并把它们取出来作为它们自己的功能吗 或者这会涉及更复杂的东西吗 我正在尝试将其中一张地图拆分为较小的部分以对它们进行索引 https github com simonepri geo maps https github c
  • 在 ElasticSearch 7+ 中,如何搜索所有文本字段?

    我想在 Elasticsearch 7 3 中存储的文档中搜索单词 我希望在以前版本的 Elasticsearch 上运行的一个示例是 query bool must match all oliver must not should fro
  • Elasticsearch TransportClient NetworkPlugin NoClassDefFoundError

    我期待将 Elasticsearch 集成到 Spring Boot Web 应用程序中 这是创建传输客户端的配置 Configuration public class ElasticsearchConfig private Transpo
  • 使用 KMS 的 AWS RDS 加密是否会影响性能?

    Amazon states https aws amazon com about aws whats new 2015 01 06 amazon rds encryption with kms mysql postgresql that 加
  • 如何在 kibana 中自动配置索引模式

    是否可以在 kibana 中自动配置索引模式 要么通过一些设置文件 要么通过rest api 安装后可以手动完成 Kibana 5 x 公开了这样的 API 来管理索引模式 要创建索引模式 可以发出以下命令来 kibana 访问 url 只
  • 如何使用elasticsearch进行分页?来自 vs 滚动 API

    我使用elasticsearch作为数据库来存储大量日志数据 我知道有两种方法可以进行分页 使用大小并来自 API 使用滚动API 现在我使用 from 进行分页 从前端和后端获取页面和大小参数 Java searchSourceBuild
  • 弹性搜索模糊匹配,精确匹配首先显示

    我想在查询中使用模糊匹配 但精确匹配显示在结果的顶部 我已经尝试过以下方法 return this gt client gt search array index gt self INDEX type gt self TYPE body g
  • elasticsearch查询字符串分析器针对不同字段使用不同的分析器

    当对具有不同分析器 stem ngram等 的多个字段执行查询时 elasticsearch是否对每个字段的查询字符串执行特定的分析 是的 除非您在查询中指定分析器 这请求参数 http www elasticsearch org guid
  • 在 Elastic 搜索中加载示例数据集时出错

    您好 我正在尝试加载示例数据集参考弹性搜索文档 https www elastic co guide en elasticsearch reference current exploring your data html但是当我尝试运行指示
  • 如何编写Elasticsearch多个必须脚本查询?

    我想使用查询来比较多个字段 我有字段 1 到 4 我想搜索字段 1 大于字段 2 的数据 并且下面的查询工作正常 size 0 source field1 field2 field3 field4 sort query bool filte
  • ElasticCloud 的 ElasticSearch 身份验证错误?

    我刚刚在 ElasticCloud 上设置了一个新的 ElasticSearch 集群 我正在尝试遵循帮助文档 https cloud elastic co help 它说您可以按如下方式发布文档 curl https
  • 弹性搜索文档计数

    我正在运行 2 2 版本的 Elastic 搜索 我已经创建了索引并加载了示例文档 我发现其中有些问题 当我给予 GET index type count 我得到了正确的答案 count 9998 shards total 5 succes
  • 如何使用ElasticSearch来实现社交搜索?

    我正在尝试使用 ElasticSearch 创建具有社交功能的商业搜索 我有一个企业目录 用户可以通过不同的方式与这些企业进行交互 通过查看它们 检查它们等 当用户搜索商家时 我希望能够在结果顶部向他们显示他们的朋友与之互动过的商家 或根据
  • search_after 在弹性搜索中如何工作?

    我一直在尝试在我们的应用程序中使用 Elasticsearch 但分页限制为 10k 对我们来说实际上是一个问题 并且由于必须超时问题 滚动 API 也不是推荐的选择 我发现 Elasticsearch 有一个叫做 search after
  • NEST 1.0:请参阅 Fiddler 上的请求

    我刚刚更新到 NEST 1 0 我在远程服务器 不是本地主机 上有 Elastic Search 通常我在使用 Fiddler 发送和接收请求时没有任何问题 更新后 bammm 没有检测到任何请求 但我的应用程序发出这些请求没有任何问题 你
  • Elasticsearch:根据类型对不同字段进行排序

    我的索引中有两种类型 Event and City 我正在尝试按日期将它们全部排序 但是 每种类型的日期字段名称都不同 为了Event该值是在updated at领域和City日期是在update at其嵌套对象之一中的字段city eve

随机推荐