HOWTO · MongoDB

Windows 및 Ubuntu에서 MongoDB와 함께 Elasticsearch를 설치하고 사용하는 방법

Windows 10 또는 Ubuntu 20.04에 Elasticsearch를 설치하고, 로컬에서 확인하며, 검색을 위해 MongoDB와 어떻게 조합하는지 이해하세요.

이 페이지의 내용

Elasticsearch는 MongoDB 옆에서 실행되어 선택한 애플리케이션 데이터에 대한 전체 텍스트 검색을 제공할 수 있습니다. MongoDB는 여전히 신뢰할 수 있는 원본이며, 애플리케이션이나 다른 통합 프로세스가 변경 사항을 Elasticsearch 인덱스로 복사해야 합니다. 이 가이드에서는 Windows 10 또는 Ubuntu 20.04에서 Elasticsearch를 시작하는 방법, 로컬 엔드포인트를 확인하는 방법, 그리고 Node.js 통합과 관련된 결정 사항을 다룹니다.

Elasticsearch란 무엇인가

Elasticsearch는 Apache Lucene 위에 구축된 분산 검색 및 분석 엔진입니다. JSON 문서에 인덱스를 만들어 애플리케이션이 텍스트를 검색하고 구조화된 필드를 필터링할 수 있게 합니다. MongoDB는 애플리케이션 문서를 저장하고 범용 쿼리를 지원합니다. Elasticsearch는 검색에 최적화된 별도의 검색 인덱스를 유지합니다. 이는 MongoDB를 대체하는 것이 아니며, 두 저장소가 자동으로 동기화되지 않습니다.

인덱스는 파생 데이터입니다. 처음에 인덱스를 어떻게 채울지, 이후의 삽입, 업데이트, 삭제를 어떻게 전파할지, 그리고 인덱스가 뒤처지거나 매핑이 변경될 경우 어떻게 다시 구축할지를 계획하세요.

Windows 10에 Elasticsearch 설치하기

  1. 해당 릴리스에 명시된 Windows 버전과 Java 런타임 요구 사항을 지원하는 Elasticsearch 배포판을 선택하세요. 공식 아카이브에는 번들된 JDK가 포함될 수 있습니다. Java를 별도로 설치하기 전에 해당 릴리스의 설치 노트를 확인하세요. 오래된 Java 7 또는 Java 8 최소 요구 사항을 일반적인 요구 사항으로 의존하지 마세요.
  2. Elastic의 공식 Elasticsearch 다운로드 페이지에서 Windows 아카이브를 다운로드하고 계정이 쓸 수 있는 디렉터리에 압축을 풀세요. 아카이브 구조와 보안 기본값은 릴리스마다 다릅니다.
  3. 압축을 푼 Elasticsearch bin 디렉터리에서 명령 프롬프트 또는 PowerShell을 열고 elasticsearch.bat를 시작하세요. 포그라운드 프로세스가 실행되는 동안 그 창을 열어 두세요. 영구 서비스의 경우, 포그라운드 창을 서비스 설치로 취급하지 말고 선택한 릴리스에 문서화된 서비스 설정을 사용하세요.
  4. 해당 릴리스의 보안 기능을 활성화한 상태로 유지하세요. Elasticsearch 8 이상은 기본적으로 보안이 활성화됩니다. 생성된 자격 증명을 사용하거나 적절한 사용자와 TLS 설정을 구성하세요. 네트워크로 접근 가능한 인스턴스에서 xpack.security.enabled: false로 설정하지 마세요. 보안을 비활성화하는 것은 신뢰할 수 없는 네트워크 접근이 없는 격리된 로컬 실험에만 적합합니다.
  5. 브라우저에서 http://localhost:9200을 확인하거나 curl로 요청하세요. 정상적인 보안 노드는 자격 증명을 요청하거나 인증 응답을 반환할 수 있습니다. 그래도 엔드포인트에 도달할 수 있음을 보여줍니다. 설정 중에 출력되거나 구성된 자격 증명과 HTTPS 세부 정보를 사용하세요.

엔드포인트가 응답하지 않으면 시작 창에서 부트스트랩 또는 구성 오류를 확인하고, 프로세스가 여전히 실행 중인지 확인하며, 다른 프로세스가 포트 9200을 사용하고 있지 않은지 확인하세요.

Ubuntu 20.04에 Elasticsearch 설치하기

  1. 지원 및 패키지 요구 사항에 Ubuntu 20.04가 포함된 릴리스를 선택하세요. Elastic의 공식 APT 설치 가이드를 열고 선택한 릴리스에 대한 저장소 및 서명 키 단계를 따르세요. 이러한 단계는 APT가 Elastic의 패키지 서명 키를 신뢰하고 Elastic의 저장소에서 패키지를 가져오도록 구성합니다. apt-key를 기반으로 한 오래된 지침은 더 이상 사용되지 않습니다. 가이드에 표시된 키링 방식을 사용하세요. Elasticsearch 패키지에는 일반적으로 적합한 번들 JDK가 포함되므로, 선택한 릴리스의 지침에서 요구하는 경우에만 별도의 Java 패키지를 설치하세요.
  2. 선택한 릴리스에 대한 저장소를 구성한 뒤, sudo apt-get update로 APT의 패키지 인덱스를 새로 고친 다음 sudo apt-get install elasticsearch로 Elasticsearch를 설치하세요. 반복 가능한 배포가 필요한 경우, apt-cache madison elasticsearch로 해당 저장소에서 사용 가능한 버전을 확인하고 sudo apt-get install elasticsearch=<package-version>을 사용하여 정확한 패키지 버전을 설치하세요. APT가 보고한 버전 문자열을 사용하세요. 저장소 줄과 사용 가능한 버전은 Elastic 가이드에서 선택한 릴리스에 따라 달라집니다.
  3. sudo systemctl enable --now elasticsearch.service로 서비스를 시작하고 활성화하세요. sudo systemctl status elasticsearch.service로 확인하세요. 시작에 실패하면 서비스 저널이나 /var/log/elasticsearch/를 살펴보세요.
  4. 주요 구성은 일반적으로 /etc/elasticsearch/elasticsearch.yml입니다. 인증과 전송 보안을 활성화한 상태로 유지하고, 네트워크 노출을 신중하게 구성하세요. 단일 노드 설정이 자동으로 공개 노출해도 안전한 것은 아닙니다.
  5. 사용 중인 릴리스의 자격 증명과 인증서 설정을 사용하여 https://localhost:9200을 확인하세요. 인증서 경고는 로컬 CA를 클라이언트가 신뢰하지 않는다는 의미일 수 있습니다. 검증을 비활성화하는 대신 인증서를 확인하거나 생성된 CA를 신뢰하도록 클라이언트를 구성하세요.

로컬 응답이 성공하면 Elasticsearch가 실행 중임을 확인합니다. MongoDB 레코드가 인덱싱되고 있음을 확인하는 것은 아닙니다.

MongoDB와 함께 Elasticsearch를 사용하는 이유

MongoDB는 일반적으로 애플리케이션 레코드에 대한 권위 있는 저장소이며, Elasticsearch는 별도로 유지 관리되는 인덱스에 대한 검색을 제공합니다. 이 조합은 검색 인덱스를 데이터의 유일한 복사본으로 만들지 않으면서 전체 텍스트 검색을 제공할 수 있습니다. 검색 결과는 MongoDB보다 뒤처질 수 있으므로, 즉각적인 일관성이 필요한 애플리케이션은 그 지연을 고려해야 합니다.

Node.js 통합에는 MongoDB 변경 소스, 선택한 서버 버전과 호환되는 Elasticsearch 클라이언트, 그리고 명시적인 인덱싱 전략이 필요합니다. 일반적인 흐름은 초기 인덱스를 위해 기존 레코드를 읽고, 각 레코드의 MongoDB _id에서 파생된 안정적인 문서 ID를 사용하여 각 레코드를 Elasticsearch에 쓰며, 그런 다음 삽입, 업데이트, 삭제가 발생할 때 이를 적용합니다. 쓰기를 재시도 가능하고 멱등하게 만들고, 실패를 재생을 위해 기록하며, 인덱스를 조정하거나 다시 구축할 수 있는 방법을 제공하세요. MongoDB의 샘플 문서를 확인하고 해당 Elasticsearch 문서를 쿼리하여 양쪽을 검증하세요.

다음 Node.js 예제는 MongoDB 레코드에서 Elasticsearch 문서 ID와 JSON 본문으로의 결정적인 매핑을 보여줍니다. 두 서비스 없이도 실행됩니다. 데이터베이스 쓰기나 동기화가 아니라 페이로드의 형태만 보여줍니다.

const mongoRecord = {
  _id: "product-42",
  name: "Trail shoes",
  category: "footwear"
};

const elasticsearchDocument = {
  id: String(mongoRecord._id),
  document: {
    name: mongoRecord.name,
    category: mongoRecord.category
  }
};

console.log(JSON.stringify(elasticsearchDocument, null, 2));
{
  "id": "product-42",
  "document": {
    "name": "Trail shoes",
    "category": "footwear"
  }
}

이 형태를 애플리케이션에서 사용하려면, 유지 관리되는 Elasticsearch 클라이언트를 통해 id를 Elasticsearch 문서 ID로, document를 그 소스로 전송하세요. 그 쓰기를 애플리케이션의 MongoDB 변경 처리에 연결하고, 재시도와 삭제를 명시적으로 처리하세요. 이 예제는 특정 클라이언트, 플러그인 또는 Elasticsearch 릴리스가 호환된다는 것을 입증하지 않습니다.

원래의 mongoosastic 예제는 레거시 Mongoose 플러그인과 호환되는 Elasticsearch 클라이언트에 의존합니다. 현재 Elasticsearch 릴리스와의 호환성은 여기서 입증되지 않았으므로, 그 스니펫이나 그 성공 메시지를 검증된 통합으로 취급하지 마세요. 이를 채택하기 전에, 플러그인이 프로젝트의 정확한 Mongoose 및 Elasticsearch 버전을 지원하는지 확인하세요. 새로운 통합의 경우, 유지 관리되는 클라이언트를 사용하고 인덱싱 및 변경 스트림에 대한 해당 버전별 지침을 따르세요. 기본적인 저장 콜백만으로는 인덱싱이 완료되었다는 것을 증명하지 않습니다.