Elasticsearch는 무엇인지?
•
Elasticsearch는 검색 및 분석을 위한 오픈 소스 분산 검색 엔진입니다.
•
JSON 형식의 문서를 저장하고, 강력한 검색 및 분석 기능을 제공합니다.
•
분산 환경에서 운영되며, 대용량 데이터를 효율적으로 색인화하고 검색할 수 있습니다.
Elasticsearch를 이해 하기 위한 주요 키워드
•
노드 : 노드는 간단하게 말하면 Elasticsearch가 설치된 각 서버를 의미합니다.
◦
마스터 노드 : 마스터 노드는 클러스터 관리를 담당합니다. 새로운 노드의 가입, 클러스터 내의 노드 상태 모니터링, 인덱스 생성 및 삭제와 같은 관리 작업을 담당합니다. 하지만 데이터를 저장하거나 검색하는 주된 역할을 하는것은 아닙니다.
◦
데이터 노드 : 이름 그대로, 실제로 데이터를 저장하고 검색하는 데 사용됍니다. 이 노드들은 클러스터의 실질적인 작업을 수행하며, 사용자의 요청에 따라 데이터를 처리하고 반환합니다.
◦
서버 하나에 Elasticsearch를 설치하면 마스터노드이기도 하면서 데이터노드이기도 합니다.
◦
만약 두개의 서버에 Elasticsearch를 설치하면 각각 마스터노드-데이터노드가 있게 되는데, 마스터노드끼리 클러스터로 연결되면 1개의 환경으로 간주되며, 마스터노드간의 통신을 통해 클러스터의 일관성을 유지하고 관리합니다.
•
클러스터 : 클러스트는 간단하게 말하면 여러 노드의 집합체라고 볼 수 있습니다. 이들이 함께 작동해서 데이터를 효율적으로 관리하고 검색할 수 있는 환경이 제공됩니다.
◦
마스터 노드간의 연결은 elasticsearch.yml 라는 설정 파일에서 클러스터 환경을 설정하게 됩니다. 아래와 같이 마스터노드1, 마스터노드2가 있다면 my-cluster 라는 동일한 클러스터 환경에 연결 시킬 수 있게 됩니다.
cluster.name: my-cluster
node.name: master-node-1
node.master: true
node.data: true
discovery.seed_hosts: ["master-node-2"]
cluster.initial_master_nodes: ["master-node-1", "master-node-2"]
Shell
복사
•
샤드 : 샤드는 간단히 데이터의 조각이라고 생각하면 됍니다. Elasticsearch는 대용량의 데이터를 처리할 수 있도록 데이터를 여러 파티션으로 나눠서 저장하는데, 이 작은 조각을 샤드라고 부릅니다.
◦
데이터를 분산해서 효율적으로 처리하고 공유할 수 있는 샤드라는 개념은 비유적으로 유사한 사례를 예를 들면 토렌트에서 여러 사용자가 파일의 조각을 다운로드하고 동시에 업로드하는 것을 생각해보면 파일 조각이라는 개념을 체감 할 수 있습니다.
◦
Elasticsearch에서 각 샤드는 데이터의 일부를 저장하고 검색에 참여하여 전체 클러스터의 성능을 향상시킵니다.
왜 이 프로젝트에서 적용하려 하는지?
•
프로젝트에서 Elasticsearch를 도입하는 주된 이유는 검색성능의 개선입니다.
•
MySQL로부터 가져온 도서 데이터를 Elasticsearch에 적재하면, 특히 텍스트 기반의 검색과 분석이 필요한 경우에 강력한 선택지가 될 수 있습니다.
•
Elasticsearch는 분산 구조로 설계되어 있어, 대용량 데이터셋에 대한 높은 성능을 제공합니다.
기존 MySQL과의 차이점?
구분 | MySQL | Elasticsearch |
데이터 모델 | 관계형 데이터베이스로, 테이블과 스키마를 기반으로 구조화된 데이터를 저장합니다. | 비관계형 데이터 스토리지로, JSON 형식의 문서를 저장하며, 각 문서는 필드 및 값의 집합으로 구성됩니다. |
검색 및 쿼리 | SQL 쿼리를 사용하여 정형화된 데이터에 대한 검색을 수행합니다. | 텍스트 기반의 검색을 강화한 쿼리 언어를 사용하며, 비정형 데이터의 검색에 특화되어 있습니다. |
검색 성능 | 일반적으로 정형 데이터의 인덱싱 및 검색에 효과적이지만, 텍스트 검색 및 다양한 집계 작업에는 제한이 있을 수 있습니다. | 텍스트 기반의 검색에 특화되어 있어, 대용량 텍스트 데이터의 실시간 검색이 빠르게 수행됩니다. |
분산 아키텍처 | 전통적으로 단일 서버에서 실행되는 중앙 집중형 아키텍처를 갖습니다. | 분산 환경에서 운영되며, 여러 노드로 구성된 클러스터를 형성하여 데이터를 저장하고 처리합니다. |
용도 | 트랜잭션 처리 및 정형 데이터의 저장 및 검색에 적합합니다. | 대용량 텍스트 데이터의 검색 및 분석에 특화되어 있으며, 로그 분석, 모니터링, 검색 엔진 등 다양한 용도로 사용됩니다. |
어떤 결과가 예상되는지?
•
Elasticsearch를 도입함으로써 검색 쿼리의 응답 시간이 향상될 것으로 기대됩니다.
•
Elasticsearch의 색인화된 데이터는 빠르게 검색 가능하며, 다양한 쿼리 및 집계 작업을 효과적으로 수행할 수 있습니다.
•
또한, Elasticsearch의 강력한 검색 및 집계 기능을 활용하여 사용자 경험을 향상시킬 수 있습니다.
Elasticsearch로 다룰 수 있을만한 세부 주제는 무엇이 있을까요?
인덱싱 전략 최적화:
도서 정보를 어떤 필드에 어떤 형식으로 인덱싱할지 고려. 예를 들어, 검색이 잘 일어날 만한 필드를 적절히 선택.
쿼리 튜닝:
사용자의 검색 쿼리에 대한 분석 및 최적화. Fuzzy 검색, Wildcard 쿼리 등을 효과적으로 활용.
샤드 및 레플리카 구성:
데이터 양과 검색 부하에 따라 적절한 샤드 수 및 레플리카 수를 조절. 클러스터 구성을 최적화.
인덱스 메모리 최적화:
Elasticsearch의 JVM 설정 및 인덱스 메모리 캐싱을 조정하여 성능 향상을 도모.
분산 검색 활용:
다양한 노드에 데이터를 분산하여 검색 속도를 향상시키는 방법을 고려.
검색 결과 캐싱:
자주 사용되는 검색 결과를 캐싱하여 빠른 응답을 유도.
인덱스 병합 최적화:
Elasticsearch는 주기적으로 인덱스를 병합하는데, 이를 최적화하여 디스크 I/O를 줄이고 성능을 향상시킬 수 있어.
검색 쿼리 로깅 및 분석:
사용자의 검색 쿼리를 로깅하고 분석하여 어떤 검색이 많이 이루어지는지 파악하고 최적화에 활용할 수 있어.
인덱스 리프레시 간격 조절:
인덱스의 리프레시 간격을 조절하여 실시간 검색이 중요한 경우 빠른 반영을 도모하거나, 색인 성능을 높일 수 있어.
필터 및 쿼리 캐싱:
자주 사용되는 필터 및 쿼리를 캐싱하여 빠른 검색 결과를 제공할 수 있어.
하드웨어 최적화:
Elasticsearch가 동작하는 서버의 하드웨어를 최적화하여 CPU, 메모리, 디스크 등의 자원을 효과적으로 활용할 수 있어.
부분 검색 (Partial Field):
필요한 일부 필드만을 검색하는 부분 검색을 활용하여 불필요한 데이터를 덜 가져오고 성능을 향상시킬 수 있어.
스크립트 및 프로세싱 최적화:
검색 쿼리나 업데이트 작업에서 사용되는 스크립트 및 프로세싱을 최적화하여 성능을 향상시킬 수 있어.
인덱스 업데이트 최적화:
대량의 데이터가 업데이트되는 경우, 배치 업데이트를 사용하거나 인덱스 업데이트를 효율적으로 처리하여 성능을 개선할 수 있어.
하이라이팅 및 페이징 최적화:
검색 결과에서 하이라이트를 효과적으로 처리하고, 페이징을 최적화하여 사용자 경험을 향상시킬 수 있어.
레플리카 활용:
레플리카 노드를 활용하여 검색 응답 시간을 줄이고 가용성을 향상시킬 수 있어.
캐싱 전략 최적화:
검색 결과나 집계 결과를 적절히 캐싱하여 불필요한 계산을 줄이고 응답 속도를 향상시킬 수 있어.