InfoGrab Docs

Elasticsearch 마이그레이션 문제 해결

요약

Elasticsearch 마이그레이션을 사용할 때 다음과 같은 문제가 발생할 수 있습니다. elasticsearch.log에 오류가 포함되어 있고 실패한 마이그레이션을 다시 시도해도 작동하지 않으면 GitLab 지원에 문의하세요.

Elasticsearch 마이그레이션을 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

elasticsearch.log에 오류가 포함되어 있고 실패한 마이그레이션을 다시 시도해도 작동하지 않으면 GitLab 지원에 문의하세요. 자세한 내용은 고급 검색 마이그레이션을 참조하세요.

오류: Elasticsearch::Transport::Transport::Errors::BadRequest#

유사한 예외가 발생하면 올바른 Elasticsearch 버전을 사용하고 시스템 요구 사항을 충족하는지 확인하세요. sudo gitlab-rake gitlab:check 명령을 사용하여 버전을 자동으로 확인할 수도 있습니다.

오류: Faraday::TimeoutError (execution expired)#

프록시를 사용하는 경우 Elasticsearch 호스트의 IP 주소로 no_proxy라는 사용자 정의 gitlab_rails['env'] 환경 변수를 설정합니다.

단일 노드 Elasticsearch 클러스터 상태가 yellow에서 green으로 변경되지 않음#

단일 노드 Elasticsearch 클러스터의 경우 기능적 클러스터 상태는 yellow입니다(green이 아님). 그 이유는 기본 샤드가 할당되지만 Elasticsearch가 레플리카를 할당할 수 있는 다른 노드가 없기 때문에 레플리카를 만들 수 없기 때문입니다. 이는 Amazon OpenSearch 서비스를 사용하는 경우에도 적용됩니다.

Warning

레플리카 수를 0으로 설정하는 것은 권장되지 않습니다(이는 GitLab Elasticsearch 통합 메뉴에서 허용되지 않음). Elasticsearch 노드를 추가할 계획이 있다면(총 Elasticsearch가 1개 이상) 레플리카 수를 0보다 큰 정수 값으로 설정해야 합니다. 그렇지 않으면 중복성이 부족해집니다(노드 하나를 잃으면 인덱스가 손상됨).

단일 노드 Elasticsearch 클러스터에서 green 상태를 원한다면 위험을 이해하고 다음 쿼리를 실행하여 레플리카 수를 0으로 설정합니다. 클러스터는 더 이상 샤드 레플리카를 만들려고 시도하지 않습니다.

curl --request PUT localhost:9200/gitlab-production/_settings --header 'Content-Type: application/json' \
     --data '{
       "index" : {
         "number_of_replicas" : 0
       }
     }'

오류: health check timeout: no Elasticsearch node available#

인덱싱 프로세스 중 Sidekiq에서 health check timeout: no Elasticsearch node available 오류가 발생하는 경우:

Gitlab::Elastic::Indexer::Error: time="2020-01-23T09:13:00Z" level=fatal msg="health check timeout: no Elasticsearch node available"

Elasticsearch 통합 메뉴의 "URL" 필드 값에 http:// 또는 https://를 사용하지 않았을 가능성이 높습니다. Go용 Elasticsearch 클라이언트가 URL 접두사를 유효한 형식으로 허용하기 위해 필요하므로 이 필드의 URL 형식을 확인합니다. URL 형식을 수정한 후 인덱스를 삭제하고 인스턴스 콘텐츠를 다시 인덱싱합니다.

Elasticsearch가 일부 타사 플러그인과 작동하지 않음#

특정 타사 플러그인은 클러스터에 버그를 도입하거나 통합과 호환되지 않을 수 있습니다.

Elasticsearch 클러스터에 타사 플러그인이 있고 통합이 작동하지 않으면 플러그인을 비활성화해 보세요.

Elasticsearch 워커가 Sidekiq를 과부하#

경우에 따라 다음과 같은 이유로 Elasticsearch가 더 이상 GitLab에 연결할 수 없습니다:

  • 한쪽에서만 Elasticsearch 비밀번호가 업데이트된 경우(Unauthorized [401] ... unable to authenticate user 오류).
  • 방화벽 또는 네트워크 문제로 연결이 손상된 경우(Failed to open TCP connection to <ip>:9200 오류).

이 오류는 gitlab-rails/elasticsearch.log에 기록됩니다. 오류를 검색하려면 jq를 사용합니다:

$ jq --raw-output 'select(.severity == "ERROR") | [.error_class, .error_message] | @tsv' \
    gitlab-rails/elasticsearch.log |
  sort | uniq -c

이전 job이 실패하면 Elasticsearch가 자주 재인덱싱을 시도하기 때문에 Elastic 워커와 Sidekiq job이 훨씬 더 자주 나타날 수도 있습니다. fast-stats 또는 jq를 사용하여 Sidekiq 로그에서 워커를 집계할 수 있습니다:

$ fast-stats --print-fields=count,score sidekiq/current
WORKER                            COUNT   SCORE
ElasticIndexBulkCronWorker          234  123456
ElasticIndexInitialBulkCronWorker   345   12345
Some::OtherWorker                    12     123
...

$ jq '.class' sidekiq/current | sort | uniq -c | sort -nr
 234 "ElasticIndexInitialBulkCronWorker"
 345 "ElasticIndexBulkCronWorker"
  12 "Some::OtherWorker"
...

이 경우 과부하된 GitLab 노드에서 free -m을 실행하면 예상외로 높은 buff/cache 사용량도 표시됩니다.

오류: Couldn't load task status#

재인덱싱 시 Couldn't load task status 오류가 발생할 수 있습니다. Elasticsearch 호스트에서 sliceId must be greater than 0 but was [-1] 오류도 나타날 수 있습니다. 해결 방법으로 처음부터 재인덱싱하거나 GitLab 16.3으로 업그레이드하는 것을 고려하세요.

자세한 내용은 이슈 422938을 참조하세요.

오류: migration has failed with NoMethodError:undefined method#

GitLab 15.11에서 BackfillProjectPermissionsInBlobs 마이그레이션이 elasticsearch.log에 다음 오류 메시지와 함께 실패할 수 있습니다:

migration has failed with NoMethodError:undefined method `<<' for nil:NilClass, no retries left

BackfillProjectPermissionsInBlobs가 유일한 실패한 마이그레이션인 경우 수정 사항이 포함된 GitLab 16.0의 최신 패치 버전으로 업그레이드할 수 있습니다. 그렇지 않으면 고급 검색 기능에 영향을 미치지 않으므로 오류를 무시할 수 있습니다.

ElasticIndexInitialBulkCronWorkerElasticIndexBulkCronWorker job이 중복 제거에서 멈춤#

GitLab 16.5 이전 버전에서는 ElasticIndexInitialBulkCronWorkerElasticIndexBulkCronWorker job이 중복 제거에서 멈출 수 있습니다. 이 문제는 새 인덱스를 만든 후에도 고급 검색이 문서를 제대로 인덱싱하지 못하게 할 수 있습니다. GitLab 16.6에서 인덱싱을 수행하는 bulk cron 워커에 대해 idempotent!제거되었습니다.

Sidekiq 로그에는 다음과 같은 항목이 있을 수 있습니다:

{"severity":"INFO","time":"2023-10-31T10:33:06.998Z","retry":0,"queue":"default","version":0,"queue_namespace":"cronjob","args":[],"class":"ElasticIndexInitialBulkCronWorker",
...
"idempotency_key":"resque:gitlab:duplicate:default:<value>","duplicate-of":"91e8673347d4dc84fbad5319","job_size_bytes":2,"pid":12047,"job_status":"deduplicated","message":"ElasticIndexInitialBulkCronWorker JID-5e1af9180d6e8f991fc773c6: deduplicated: until executing","deduplication.type":"until executing"}

이 문제를 해결하려면:

  1. Rails 콘솔 세션에서 다음 명령을 실행합니다:

    idempotency_key = "<idempotency_key_from_log_entry>"
    duplicate_key = "resque:gitlab:#{idempotency_key}:cookie:v2"
    Gitlab::Redis::Queues.with { |c| c.del(duplicate_key) }
    
  2. <idempotency_key_from_log_entry>를 로그의 실제 항목으로 교체합니다.

Elasticsearch 마이그레이션 문제 해결

Tier: Premium, Ultimate
Offering: GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

Elasticsearch 마이그레이션을 사용할 때 다음과 같은 문제가 발생할 수 있습니다. elasticsearch.log에 오류가 포함되어 있고 실패한 마이그레이션을 다시 시도해도 작동하지 않으면 GitLab 지원에 문의하세요.

Elasticsearch 마이그레이션을 사용할 때 다음과 같은 문제가 발생할 수 있습니다.

elasticsearch.log에 오류가 포함되어 있고 실패한 마이그레이션을 다시 시도해도 작동하지 않으면 GitLab 지원에 문의하세요. 자세한 내용은 고급 검색 마이그레이션을 참조하세요.

오류: Elasticsearch::Transport::Transport::Errors::BadRequest#

유사한 예외가 발생하면 올바른 Elasticsearch 버전을 사용하고 시스템 요구 사항을 충족하는지 확인하세요. sudo gitlab-rake gitlab:check 명령을 사용하여 버전을 자동으로 확인할 수도 있습니다.

오류: Faraday::TimeoutError (execution expired)#

프록시를 사용하는 경우 Elasticsearch 호스트의 IP 주소로 no_proxy라는 사용자 정의 gitlab_rails['env'] 환경 변수를 설정합니다.

단일 노드 Elasticsearch 클러스터 상태가 yellow에서 green으로 변경되지 않음#

단일 노드 Elasticsearch 클러스터의 경우 기능적 클러스터 상태는 yellow입니다(green이 아님). 그 이유는 기본 샤드가 할당되지만 Elasticsearch가 레플리카를 할당할 수 있는 다른 노드가 없기 때문에 레플리카를 만들 수 없기 때문입니다. 이는 Amazon OpenSearch 서비스를 사용하는 경우에도 적용됩니다.

Warning

레플리카 수를 0으로 설정하는 것은 권장되지 않습니다(이는 GitLab Elasticsearch 통합 메뉴에서 허용되지 않음). Elasticsearch 노드를 추가할 계획이 있다면(총 Elasticsearch가 1개 이상) 레플리카 수를 0보다 큰 정수 값으로 설정해야 합니다. 그렇지 않으면 중복성이 부족해집니다(노드 하나를 잃으면 인덱스가 손상됨).

단일 노드 Elasticsearch 클러스터에서 green 상태를 원한다면 위험을 이해하고 다음 쿼리를 실행하여 레플리카 수를 0으로 설정합니다. 클러스터는 더 이상 샤드 레플리카를 만들려고 시도하지 않습니다.

curl --request PUT localhost:9200/gitlab-production/_settings --header 'Content-Type: application/json' \
     --data '{
       "index" : {
         "number_of_replicas" : 0
       }
     }'

오류: health check timeout: no Elasticsearch node available#

인덱싱 프로세스 중 Sidekiq에서 health check timeout: no Elasticsearch node available 오류가 발생하는 경우:

Gitlab::Elastic::Indexer::Error: time="2020-01-23T09:13:00Z" level=fatal msg="health check timeout: no Elasticsearch node available"

Elasticsearch 통합 메뉴의 "URL" 필드 값에 http:// 또는 https://를 사용하지 않았을 가능성이 높습니다. Go용 Elasticsearch 클라이언트가 URL 접두사를 유효한 형식으로 허용하기 위해 필요하므로 이 필드의 URL 형식을 확인합니다. URL 형식을 수정한 후 인덱스를 삭제하고 인스턴스 콘텐츠를 다시 인덱싱합니다.

Elasticsearch가 일부 타사 플러그인과 작동하지 않음#

특정 타사 플러그인은 클러스터에 버그를 도입하거나 통합과 호환되지 않을 수 있습니다.

Elasticsearch 클러스터에 타사 플러그인이 있고 통합이 작동하지 않으면 플러그인을 비활성화해 보세요.

Elasticsearch 워커가 Sidekiq를 과부하#

경우에 따라 다음과 같은 이유로 Elasticsearch가 더 이상 GitLab에 연결할 수 없습니다:

  • 한쪽에서만 Elasticsearch 비밀번호가 업데이트된 경우(Unauthorized [401] ... unable to authenticate user 오류).
  • 방화벽 또는 네트워크 문제로 연결이 손상된 경우(Failed to open TCP connection to <ip>:9200 오류).

이 오류는 gitlab-rails/elasticsearch.log에 기록됩니다. 오류를 검색하려면 jq를 사용합니다:

$ jq --raw-output 'select(.severity == "ERROR") | [.error_class, .error_message] | @tsv' \
    gitlab-rails/elasticsearch.log |
  sort | uniq -c

이전 job이 실패하면 Elasticsearch가 자주 재인덱싱을 시도하기 때문에 Elastic 워커와 Sidekiq job이 훨씬 더 자주 나타날 수도 있습니다. fast-stats 또는 jq를 사용하여 Sidekiq 로그에서 워커를 집계할 수 있습니다:

$ fast-stats --print-fields=count,score sidekiq/current
WORKER                            COUNT   SCORE
ElasticIndexBulkCronWorker          234  123456
ElasticIndexInitialBulkCronWorker   345   12345
Some::OtherWorker                    12     123
...

$ jq '.class' sidekiq/current | sort | uniq -c | sort -nr
 234 "ElasticIndexInitialBulkCronWorker"
 345 "ElasticIndexBulkCronWorker"
  12 "Some::OtherWorker"
...

이 경우 과부하된 GitLab 노드에서 free -m을 실행하면 예상외로 높은 buff/cache 사용량도 표시됩니다.

오류: Couldn't load task status#

재인덱싱 시 Couldn't load task status 오류가 발생할 수 있습니다. Elasticsearch 호스트에서 sliceId must be greater than 0 but was [-1] 오류도 나타날 수 있습니다. 해결 방법으로 처음부터 재인덱싱하거나 GitLab 16.3으로 업그레이드하는 것을 고려하세요.

자세한 내용은 이슈 422938을 참조하세요.

오류: migration has failed with NoMethodError:undefined method#

GitLab 15.11에서 BackfillProjectPermissionsInBlobs 마이그레이션이 elasticsearch.log에 다음 오류 메시지와 함께 실패할 수 있습니다:

migration has failed with NoMethodError:undefined method `<<' for nil:NilClass, no retries left

BackfillProjectPermissionsInBlobs가 유일한 실패한 마이그레이션인 경우 수정 사항이 포함된 GitLab 16.0의 최신 패치 버전으로 업그레이드할 수 있습니다. 그렇지 않으면 고급 검색 기능에 영향을 미치지 않으므로 오류를 무시할 수 있습니다.

ElasticIndexInitialBulkCronWorkerElasticIndexBulkCronWorker job이 중복 제거에서 멈춤#

GitLab 16.5 이전 버전에서는 ElasticIndexInitialBulkCronWorkerElasticIndexBulkCronWorker job이 중복 제거에서 멈출 수 있습니다. 이 문제는 새 인덱스를 만든 후에도 고급 검색이 문서를 제대로 인덱싱하지 못하게 할 수 있습니다. GitLab 16.6에서 인덱싱을 수행하는 bulk cron 워커에 대해 idempotent!제거되었습니다.

Sidekiq 로그에는 다음과 같은 항목이 있을 수 있습니다:

{"severity":"INFO","time":"2023-10-31T10:33:06.998Z","retry":0,"queue":"default","version":0,"queue_namespace":"cronjob","args":[],"class":"ElasticIndexInitialBulkCronWorker",
...
"idempotency_key":"resque:gitlab:duplicate:default:<value>","duplicate-of":"91e8673347d4dc84fbad5319","job_size_bytes":2,"pid":12047,"job_status":"deduplicated","message":"ElasticIndexInitialBulkCronWorker JID-5e1af9180d6e8f991fc773c6: deduplicated: until executing","deduplication.type":"until executing"}

이 문제를 해결하려면:

  1. Rails 콘솔 세션에서 다음 명령을 실행합니다:

    idempotency_key = "<idempotency_key_from_log_entry>"
    duplicate_key = "resque:gitlab:#{idempotency_key}:cookie:v2"
    Gitlab::Redis::Queues.with { |c| c.del(duplicate_key) }
    
  2. <idempotency_key_from_log_entry>를 로그의 실제 항목으로 교체합니다.