Help us learn about your current experience with the documentation. Take the survey.

排查 Elasticsearch 访问问题

  • Tier: Premium, Ultimate
  • Offering: GitLab Self-Managed, GitLab Dedicated

在使用 Elasticsearch 时,您可能会遇到以下问题。

在 Rails 控制台中设置配置

请参阅 启动 Rails 控制台会话

列出属性

要列出所有可用的属性:

  1. 打开 Rails 控制台 (sudo gitlab-rails console)。
  2. 运行以下命令:
ApplicationSetting.last.attributes

输出包含 Elasticsearch 集成 中所有可用的设置,例如 elasticsearch_indexingelasticsearch_urlelasticsearch_replicaselasticsearch_pause_indexing

设置属性

要设置 Elasticsearch 集成配置,运行如下命令:

ApplicationSetting.last.update(elasticsearch_url: '<your ES URL and port>')

#or

ApplicationSetting.last.update(elasticsearch_indexing: false)

获取属性

要检查是否已在 Elasticsearch 集成 或 Rails 控制台中设置配置,运行如下命令:

Gitlab::CurrentSettings.elasticsearch_url

#or

Gitlab::CurrentSettings.elasticsearch_indexing

更改密码

要更改 Elasticsearch 密码,请运行以下命令:

es_url = Gitlab::CurrentSettings.current_application_settings

# 确认当前的 Elasticsearch URL
es_url.elasticsearch_url

# 设置 Elasticsearch URL
es_url.elasticsearch_url = "http://<username>:<password>@your.es.host:<port>"

# 保存更改
es_url.save!

查看日志

日志是识别 Elasticsearch 集成问题最有价值的工具之一。与此集成最相关的日志是:

  1. sidekiq.log - 所有索引操作都在 Sidekiq 中进行,因此 Elasticsearch 集成的大部分相关日志都可以在此文件中找到。
  2. elasticsearch.log - 还有一些特定于 Elasticsearch 的附加日志会发送到此文件,其中可能包含有关搜索、索引或迁移的诊断信息。

以下是一些常见问题及其解决方法。

验证您的 GitLab 实例是否在使用 Elasticsearch

要验证您的 GitLab 实例是否在使用 Elasticsearch:

  • 执行搜索时,在搜索结果页面的右上角,确保显示“已启用高级搜索”。

  • 管理员 区域,转到 设置 > 搜索,检查是否已选择高级搜索设置。

    如果需要,这些相同的设置也可以从 Rails 控制台获取:

    ::Gitlab::CurrentSettings.elasticsearch_search?         # 搜索是否将使用 Elasticsearch
    ::Gitlab::CurrentSettings.elasticsearch_indexing?       # 内容是否将被索引到 Elasticsearch
    ::Gitlab::CurrentSettings.elasticsearch_limit_indexing? # Elasticsearch 是否仅限于特定的项目/命名空间
  • 通过访问 Rails 控制台 并运行以下命令,确认搜索是否使用 Elasticsearch:

    u = User.find_by_email('email_of_user_doing_search')
    s = SearchService.new(u, {:search => 'search_term'})
    pp s.search_objects.class

    最后一条命令的输出是关键。如果显示:

    • ActiveRecord::Relation,则 没有 使用 Elasticsearch。
    • Kaminari::PaginatableArray,则 正在 使用 Elasticsearch。
  • 如果 Elasticsearch 仅限于特定的命名空间,并且您需要了解 Elasticsearch 是否正在用于特定项目或命名空间,则可以使用 Rails 控制台:

    ::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: Namespace.find_by_full_path("/my-namespace"))
    ::Gitlab::CurrentSettings.search_using_elasticsearch?(scope: Project.find_by_full_path("/my-namespace/my-project"))

错误:User: anonymous is not authorized to perform: es:ESHttpGet

在使用 AWS OpenSearch 或 Elasticsearch 的域级访问策略时,AWS 角色未分配到正确的 GitLab 节点。GitLab Rails 和 Sidekiq 节点需要权限才能与搜索集群通信。

User: anonymous is not authorized to perform: es:ESHttpGet because no resource-based policy allows the es:ESHttpGet
action

要解决此问题,请确保 AWS 角色已分配到正确的 GitLab 节点。

未指定有效的区域

在使用 AWS 授权进行高级搜索时,您指定的区域必须有效。

错误:no permissions for [indices:data/write/bulk]

在使用 IAM 角色或使用 AWS OpenSearch Dashboards 创建的角色进行细粒度访问控制时,您可能会遇到以下错误:

{
  "error": {
    "root_cause": [
      {
        "type": "security_exception",
        "reason": "no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE, backend_roles=[arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE], requestedTenant=null]"
      }
    ],
    "type": "security_exception",
    "reason": "no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE, backend_roles=[arn:aws:iam::xxx:role/INSERT_ROLE_NAME_HERE], requestedTenant=null]"
  },
  "status": 403
}

要解决此问题,您需要在 AWS OpenSearch Dashboards 中 将角色映射到用户

在 AWS OpenSearch Service 中创建其他主用户

创建域时,您可以设置一个主用户。使用此用户,您可以创建其他主用户。有关更多信息,请参阅 AWS 文档

要创建具有权限的用户和角色并将用户映射到角色,请参阅 OpenSearch 文档。 您必须在角色中包含以下权限:

{
  "cluster_permissions": [
    "cluster_composite_ops",
    "cluster_monitor"
  ],
  "index_permissions": [
    {
      "index_patterns": [
        "gitlab*"
      ],
      "allowed_actions": [
        "data_access",
        "manage_aliases",
        "search",
        "create_index",
        "delete",
        "manage"
      ]
    },
    {
      "index_patterns": [
        "*"
      ],
      "allowed_actions": [
        "indices:admin/aliases/get",
        "indices:monitor/stats"
      ]
    }
  ]
}