관계형 DB | Elasticsearch |
---|---|
Database | Index |
Table | Type |
Row | Document |
Column | Field |
Index | Analyze |
Primary key | _id |
Schema | Mapping |
Physical partition | Shard |
Logical partition | Route |
Relational | Parent/Child, Nested |
SQL | Query DSL |
Elasticsearch Architecture
클러스터는 Elasticsearch의 가장 큰 시스템 단위이며 하나 이상의 노드로 이루어진 노드들의 집합이다. 클러스터는 데이터 접근 및 교환에 있어서 각각의 독립적인 시스템이며, 여러 대의 서버가 하나의 클러스터를 구성할 수도 있다. 물론 하나의 서버에 여러 개의 클러스터가 존재할 수도 있다.
Elasticsearch를 구성하는 하나의 단위 프로세스를 의미한다. 역할에 따라 Master-eligible, Data, Ingest, Tribe 노드로 구분할 수 있다.
** master-eligible node ** Data node
** Ingest node
** Coordination only node
인덱스는 관계형 DB의 database와 대응되는 개념이다.
샤딩(Sharding)은 데이터를 분산해서 저장하는 방법이다. elasticsearch에서 스케일 아웃을 위해 index를 여러 개의 shard로 쪼개어 보관할 수 있습니다. 기본적으로 1개가 존재하며, 검색 성능 향상을 위해 클러스터의 샤드 갯수를 조절하는 튜닝을 하기도 한다.
shard와 유사한 형태로, 노드를 잃었을 경우 데이터의 안정성을 위해 shard를 복사해둔 것이다. 그러므로 replica는 서로 다른 노드에 존재하는 것을 권장하며 아래 그림에서 서로 다른 노드에 replica가 존재하는 것을 알 수 있다.
Elasticsearch의 특징
Schema free - json으로 데이터 검색을 수행하기 때문에 스키마 개념이 존재하지 않음
DB CRUD | Elasticsearch Restful API |
---|---|
SELECT | GET |
INSERT | PUT |
UPDATE | POST |
DELETE | DELETE |
사용
document 생성
$ curl -XPOST 'localhost:9200/indexName/blog/1?pretty' -d '{"postName" : "elasticsearch", "catecory" : "IT"}' -H 'Content-Type: application/json'
# indexName : 인덱스명
# blog : 타입
# id : 1
# -d 옵션 : 데이터를 json포맷으로 전달 -H 옵션 : 헤더 ?pretty : 결과를 예쁘게 보여주기
---------------------------------------------------------------
{
"_index" : "indexName",
"_type" : "blog",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
---------------------------------------------------------------
document 조회
$ curl -XGET 'localhost:9200/indexName/blog/1?pretty'
-------------------------------------------------------
{
"_index" : "indexName",
"_type" : "blog",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"postName" : "elasticsearch",
"category" : "IT"
}
}
Elasticsearch를 능숙하게 사용하기 위해서 Restful API(GET, PUT, POST, DELETE) 사용에 익숙해야 한다. queryDSL을 통해 쿼리를 작성하고 사용자가 원하는 방식으로 사용할 수 있다.
ref) https://victorydntmd.tistory.com/308