排查 Elasticsearch 访问问题
- Tier: Premium, Ultimate
- Offering: GitLab Self-Managed, GitLab Dedicated
在使用 Elasticsearch 时,您可能会遇到以下问题。
在 Rails 控制台中设置配置
请参阅 启动 Rails 控制台会话。
列出属性
要列出所有可用的属性:
- 打开 Rails 控制台 (
sudo gitlab-rails console)。 - 运行以下命令:
ApplicationSetting.last.attributes输出包含 Elasticsearch 集成 中所有可用的设置,例如 elasticsearch_indexing、elasticsearch_url、elasticsearch_replicas 和 elasticsearch_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 集成问题最有价值的工具之一。与此集成最相关的日志是:
sidekiq.log- 所有索引操作都在 Sidekiq 中进行,因此 Elasticsearch 集成的大部分相关日志都可以在此文件中找到。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"
]
}
]
}