OpenSearch에서 Elasticsearch로 Ruby 앱을 마이그레이션하는 방법

OpenSearch 클라이언트에서 Elasticsearch 클라이언트로 Ruby 코드베이스를 마이그레이션하는 가이드입니다.

Elasticsearch를 직접 체험하려면 당사의 샘플 노트북을 살펴보거나, 무료 클라우드 체험판을 시작하거나, 지금 바로 로컬 기기에서 Elastic을 사용해 보세요.

OpenSearch Ruby 클라이언트는 버전 7.x 에서 Elasticsearch Ruby 클라이언트에서 포크되었으므로 코드베이스가 비교적 유사합니다. 즉, OpenSearch에서 Elasticsearch로 Ruby 코드베이스를 마이그레이션할 때 각 클라이언트 라이브러리의 코드가 매우 친숙하게 보입니다. 이 블로그 포스팅에서는 OpenSearch를 사용하는 예제 Ruby 앱과 이 코드를 Elasticsearch로 마이그레이션하는 단계를 보여드리겠습니다.

두 클라이언트 모두 널리 사용되는 Apache 라이선스 2.0에 따라 출시되었으므로 오픈 소스 및 무료 소프트웨어입니다. Elasticsearch의 라이선스는 최근에 업데이트되었으며, 버전 8.16부터 Elasticsearch와 Kibana의 핵심은 OSI가 승인한 오픈 소스 라이선스 AGPL에 따라 게시되고 있습니다.

Ruby 앱 마이그레이션 시 Elasticsearch 버전 고려하기

마이그레이션할 때 고려해야 할 한 가지 사항은 어떤 버전의 Elasticsearch를 사용할 것인지입니다. 이 글을 작성하는 시점에 최신 안정 릴리스( 8.17.0)를 사용하는 것이 좋습니다. Elasticsearch Ruby 클라이언트 부 버전은 Elasticsearch 부 버전을 따릅니다. 따라서 Elasticsearch 8.17.x 의 경우 Ruby gem 버전 8.17.x 을 사용할 수 있습니다.

OpenSearch는 Elasticsearch 7.10.2에서 포크되었습니다. 따라서 API가 변경되어 다른 기능을 사용할 수 있습니다. 하지만 이는 이 글의 범위를 벗어나므로 예제 앱에서 가장 일반적인 작업만 살펴보겠습니다.

Ruby on Rails의 경우, 공식 Elasticsearch 클라이언트 또는 Rails 통합 라이브러리를 사용할 수 있습니다. 각각 안정적인 최신 버전의 Elasticsearch와 클라이언트로 마이그레이션하는 것이 좋습니다. elasticsearch-rails gem 버전 8.0.0 은 Rails 6.1, 7.07.1 와 Elasticsearch 8.x 를 지원합니다.

코드

이 예제에서는 타르볼에서 OpenSearch를 설치하는 단계를 따랐습니다. 타르볼을 다운로드하고 압축을 푼 후, 나중에 클라이언트를 인스턴스화할 때 사용할 초기 관리자 비밀번호를 설정해야 했습니다.

다음과 같은 Gemfile 디렉터리를 만들었습니다:

bundle install 을 실행하면 내 프로젝트에 젬이 설치됩니다. 이 설치한 opensearch-ruby 버전은 3.4.0 이고 제가 실행 중인 OpenSearch 버전은 2.18.0 입니다. 같은 디렉토리에 있는 example_code.rb 파일에 코드를 작성했습니다. 이 파일의 초기 코드는 OpenSearch 클라이언트의 인스턴스화입니다:

테스트를 쉽게 하기 위해 사용자 가이드에 따라 전송 옵션 ssl: { verify: false} 매개변수를 전달하고 있습니다. 프로덕션 환경에서는 OpenSearch 배포에 따라 설정해야 합니다.

OpenSearch 버전 2.12.0부터 설치 스크립트를 실행할 때 OPENSEARCH_INITIAL_ADMIN_PASSWORD 환경 변수를 강력한 비밀번호로 설정해야 합니다. 타르볼에서 OpenSearch를 설치하는 단계에 따라 콘솔에서 변수를 내보냈고 이제 Ruby 스크립트에서 사용할 수 있습니다.

클라이언트가 OpenSearch에 연결하고 있는지 확인하기 위한 간단한 API는 cluster.health API를 사용합니다:

그리고 실제로 효과가 있습니다:

Elasticsearch Ruby 클라이언트 문서에 있는 몇 가지 일반적인 예제를 테스트해 본 결과 예상대로 작동했습니다:

Ruby 앱을 Elasticsearch로 마이그레이션하기

첫 번째 단계는 젬파일에 elasticsearch-ruby 을 추가하는 것입니다. bundle install 을 실행하면 Elasticsearch Ruby 클라이언트 젬이 설치됩니다. 완전히 마이그레이션하기 전에 코드를 테스트하고 싶다면 처음에는 opensearch-ruby gem을 그대로 두면 됩니다.

다음으로 중요한 단계는 클라이언트 인스턴스화입니다. 이것은 Elasticsearch를 실행하는 방식에 따라 달라집니다. 이 예제에서 유사한 접근 방식을 유지하기 위해, 저는 Elasticsearch 다운로드 및 로컬 실행의 단계를 따르고 있습니다.

bin/elasticsearch 을 실행하면 보안 기능이 자동으로 구성된 상태로 Elasticsearch가 시작됩니다. Elastic 사용자의 비밀번호를 복사해야 합니다(하지만 bin/elasticsearch-reset-password -u elastic)를 실행하여 재설정할 수 있습니다. 이 예제를 따르는 경우, 동일한 포트에서 실행되므로 Elasticsearch를 시작하기 전에 OpenSearch를 중지해야 합니다.

example_code.rb 의 시작 부분에서 OpenSearch 클라이언트 인스턴스화를 주석 처리하고 Elasticsearch 클라이언트에 대한 인스턴스화를 추가했습니다:

보시다시피 이 테스트 시나리오의 코드는 거의 동일합니다. Elasticsearch의 배포와 연결 및 인증 방법에 따라 달라집니다. 여기에서도 보안과 관련하여 OpenSearch와 동일하게 적용되며, SSL을 확인하지 않는 옵션은 테스트 목적으로만 사용되며 운영 환경에서는 사용해서는 안 됩니다.

클라이언트가 설정되면 코드를 다시 실행합니다: bundle exec ruby example_code.rb. 그리고 모든 것이 작동합니다!

마이그레이션 문제 디버깅

애플리케이션에서 사용 중인 API에 따라, OpenSearch의 API가 서로 다른 경우 Elasticsearch에서 코드를 실행할 때 오류가 발생할 수 있습니다. REST API 문서는 API 사용 방법에 대한 자세한 정보를 얻기 위한 필수 참고 자료입니다. 사용 중인 Elasticsearch 버전에 대한 설명서를 확인하시기 바랍니다. Elasticsearch::API 참조를 참조할 수도 있습니다.

Elasticsearch에서 발생할 수 있는 몇 가지 오류는 다음과 같습니다:

  • ArgumentError: Required argument '<ARGUMENT>' missing - 클라이언트 오류이며 요청에 필수 매개변수가 누락된 경우 발생합니다.
  • Elastic::Transport::Transport::Errors::BadRequest: [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/example/_doc] contains unrecognized parameter: [test]"}]... 이 오류는 Elasticsearch에서 발생하며 클라이언트 코드가 사용 중인 API에 대해 Elasticsearch가 인식하지 못하는 매개 변수를 사용하고 있음을 의미합니다.

Elasticsearch 클라이언트는 서버에서 전송한 자세한 오류 메시지와 함께 Elasticsearch에서 오류를 발생시킵니다. 따라서 지원되지 않는 매개변수나 엔드포인트의 경우에도 오류를 통해 무엇이 다른지 알 수 있습니다.

결론

이 예제 코드에서 보여드렸듯이, Ruby 앱을 OpenSearch에서 Elasticsearch로 마이그레이션하는 것은 Ruby 측면에서 볼 때 그리 복잡하지 않습니다. 검색 엔진 간의 버전 관리 및 잠재적으로 서로 다른 API를 알고 있어야 합니다. 그러나 가장 일반적인 작업의 경우 클라이언트를 마이그레이션할 때 주로 변경되는 부분은 인스턴스화입니다. 이 점에서 둘은 비슷하지만 호스트와 자격 증명이 정의되는 방식은 스택이 배포되는 방식에 따라 다릅니다. 클라이언트가 설정되고 Elasticsearch에 연결되는 것을 확인하면 OpenSearch 클라이언트를 Elasticsearch 클라이언트로 원활하게 교체할 수 있습니다.

관련 콘텐츠

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요