2024. 11. 10. 17:00ㆍ카테고리 없음
이 글은 팀원의 단순한 한마디 "왜 Elasticsearch 는 C 나 C++ 이 아니고 Java 로 개발했어요?
성능을 고려한다면 Java 보단 다른게 좋지 않나?" 라는 의문에서 시작된 글입니다.
Elasticsearch란?
Elasticsearch is a search engine based on Apache Lucene. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents.
출처 : https://en.wikipedia.org/wiki/Elasticsearch#External_links
Elasticsearch는 Apache Lucene을 기반으로 한 분산형 검색 엔진입니다.
2010년 Shay Banon 에 의해 처음 출시되었으며, 현재 Elastic NV 에서 개발 및 유지보수하고 있습니다.
Elasticsearch는 대규모 데이터를 효율적으로 처리하고, 빠르고 유연한 검색 기능을 제공하기 위한 도구입니다.
Compass: ElasticSearch 의 이전 단계
사실 Elasticsearch 이전에 Shay Banon 은 검색 엔진 프레임워크를 개발했는데, 이는 바로 Compass 라는 프로젝트입니다.
Compass 를 버린 이유
이 Compass 프로젝트는 v2 까지 개발이 된 상태였고, v3 를 개발한 상태였습니다.
하지만 이미 만들었다면 왜 굳이 만들었나? 라는 의문이 들게 됩니다. 다음과 같은 단점들이 존재했습니다.
Compass 의 단점 3가지
1. 확장성 부족 →분산 아키텍처를 지원하지 않아 대규모 데이터 처리에 한계
2. 운영 복잡성 → 클러스터 관리나 고가용성 같은 기능이 부족
3. 언어 종속성 → 주로 Java Application 에만 맞춰짐
분산 아키텍쳐, 클러스터 관리, 고가용성이 검색 엔진에서 필요한 이유?
1. 대규모 데이터와 높은 트래픽 처리
2. 장애 대응과 고가용성 확보
3. 확장성 및 유연한 리소스 관리
4. 복잡한 쿼리와 지리적 분산 처리
정리하자면 Compass 는 확장 가능하지 못한 Archi.를 가져있었지만, 현대 사회는 확장성에 유리한 분산 검색 엔진을 요구했습니다.
그래서 아얘 별도의 프로젝트를 기획하게 되는데, 이 프로젝트가 바로 Elasticsearch 입니다.
Elasticsearch 의 특징
크게 다음과 같은 5가지를 Elasticsearch 의 특징으로 집을 수 있습니다.
특징
==================
1. 분산 처리
2. Multitenancy 지원
3. 풀 텍스트 검색
4. HTTP 인터페이스
5. Schemaless Json 문서 저장
Multitenancy 란?
==================
단일 소프트웨어 인스턴스로 서로 다른 여러 사용자 그룹에 서비스를 제공할 수 있는 소프트웨어 아키텍처
출처 : https://www.redhat.com/ko/topics/cloud-computing/what-is-multitenancy
스키마리스 JSON 문서 저장이란?
====================================
: 데이터 구조를 미리 말하지 않아도, 그냥 넣으면 알아서 저장해주는 기능
즉, 그냥 데이터를 넣으면 Elasticsearch가 알아서 정리
Elasticsearch 는 고로 Compass 의 단점을 보완하여 나오게 된
- 확장에 유리하고(확장성)
- 사용에 용이하고(사용성 / HTTP, JSON 사용)
- 빠른 검색 속도 (Lucene 기반)
라는 특징을 가진 검색 엔진입니다.
Elsticsearch 와 Apache Lucene 의 관계
Elasticsearch 는 Apache Lucene 이라는 프로젝트를 기반으로 해 Lucene 이 제공하는 검색 & 인덱싱 기능을 활용합니다. Elasticsearch 의 빠른 검색 성능은 사실 Lucene 이 빠르기에 가능하다! 라고도 말할 수 있습니다.
그렇다면 Lucene 이란?
Apache Lucene™ is a high-performance, full-featured search engine library written entirely in Java. It is a technology suitable for nearly any application that requires structured search, full-text search, faceting, nearest-neighbor search across high-dimensionality vectors, spell correction or query suggestions.
→ 요약 : 그냥 성능좋고 기능도 많은 Java 로 쓴 검색 엔진이다~
출처 : https://lucene.apache.org/core/
Lucene 은 1999년 Doug Cutting 에 의해 개발된 Java 기반 Text 검색 라이브러리입니다.
Lucene 은 Elasticsearch 뿐만 아니라, 동시에 Solr 등 여러 검색 엔진의 기반 기술이기도 합니다.
Lucene 의 특징
===================
- Scalable, High-Performance Indexing
- Powerful, Accurate and Efficient Search Algorithms
- Cross-Platform Solution
그렇다면 왜 Apache Lucene Project 는 Java 로 이루어져 있을까?
그렇다면 사실 Elasticsearch 가 왜 Java 로 이루어져 있냐? 라는 질문에 대한 대답은 사실
왜 Apache Lucene Project 는 Java 로 이루어져 있을까?
라는 질문에 대답을 해야 합니다.
Elasticsearch 는 Lucene 기반 이기에 Java 로 이루어져 있고, Lucene 은 100% Java 로 이루어져 있습니다.
보통 구글링을 하게 되면 Lucene 왜 Java 로 이루어져 있나 라는 글들을 찾아보면 다음과 특징을 설명합니다.
1. 플랫폼 독립성: Java 는 운영체제와 무관하게 동작할 수 있어 다양한 환경에서 실행 가능.
2. 개발 생산성: 메모리 관리와 표준 라이브러리를 통해 개발 속도가 빠름.
3. 커뮤니티: Java 는 생태계는 풍부한 도구와 라이브러리를 제공합니다.
이러한 이유들은 사실 분산 데이터 처리 프레임워크인 Hadoop 에서도 찾아볼 수 있습니다.
Doug Cutting 은 Hadoop 을 개발하고 나서 한 인터뷰에서 Hadoop 의 개발 언어를 Java 를 선택한 이유에 대해 이렇게 말했습니다 :
"Java offers a good compromise between developer productivity and runtime performance. Developers benefit from a simple, powerful, type-safe language with a wide range of high-quality libraries. Performance is generally good enough.”
출처 : https://zipcodewilmington.com/blog/3-modern-apps-and-companies-that-use-java/
Hadoop 은 대규모 데이터를 분산 환경에서 처리하기 위한 프레임워크로, I/O 작업이 많고 클러스터 환경에서 운영됩니다.
이러한 환경에서는 성능도 중요하겠지만 안정성, 생산성, 그리고 유지보수 용이성이 더 중요한 요소로 작용합니다.
Lucene도 이와 비슷한 맥락에서 Java를 선택했습니다.
Lucene은 텍스트 검색 엔진 라이브러리로, 다양한 환경에서 동작해야 하고 개발자들이 쉽게 활용할 수 있어야 합니다.
고로 다시 한번, Java 를 택한 이유는
- 플랫폼 독립성
- 생산성
- 커뮤니티 지원
측면에서 선택을 했다고 볼 수 있습니다.
결국, "충분히 빠른 성능"과 "개발 생산성" 간의 균형이 Lucene과 Hadoop 모두 Java를 선택하게 만든 핵심 이유라고 볼 수 있습니다.
이는 Elasticsearch 역시 자연스럽게 Java로 개발된 이유를 설명해줍니다.
정리
"왜 Java인가?"라는 의문은 성능이라는 한 가지 관점만으로는 답을 찾기 어렵습니다.
개발 생산성, 커뮤니티, 그리고 다양한 환경에서의 호환성까지 고려해야만 답이 보이는 질문입니다.
그리고 이러한 성능과 생산성 이 2가지의 적절한 합의점이 Java 다!
번외 : 다른 검색 엔진은 무엇이 있고, 어떤 언어를 사용할까?
- Elasticsearch: Java로 개발, Apache Lucene 기반. Java의 플랫폼 독립성과 개발 생산성을 활용.
- Splunk: C++, Python, JavaScript로 작성. 높은 성능과 대규모 데이터 처리를 위해 C++ 사용, 인터페이스 개발에 Python과 JavaScript 활용.
- Apache Solr: Java로 작성. Apache Lucene 기반으로 확장성과 유연성을 제공.
- OpenSearch: Java로 개발. Elasticsearch의 포크로 동일한 기술 스택 사용.
- Algolia: C++로 작성. 빠른 검색과 낮은 지연 시간을 위해 최적화