따로 정리했던 내용을 이제야 올리네요 :)
ElsaticSearch는 뛰어난 검색능력과 대규모 분산 시스템을 구축할 수 있는 다양한 기능들을 제공하는 플랫폼
Apache Lucene 기반의 오픈소스
(near-) RealTime 분석 시스템
Full Text 검색 엔진 지원
Restful API 지원
멀티테넌시 지원
검색기술을 다루다 보면 검색과 색인이라는 단어를 자주 만나게 됩니다. 특히 아파치 루씬, 그리고 Elasticsearch와 관련해서는 같은 단어가 여러 뜻으로 혼용되어 쉽게 헷갈릴 수 있으므로 혼란을 방지하기 위해 몇가지 중요한 개념의 용어들을 우선 정리하고 가도록 하겠습니다.
ElasticSearch의 실행 환경에 대한 설정 은 elasticsearch.yml
에서 관리합니다.
Brew에서 설치시 : /usr/local/Cellar/elasticsearch-full/7.11.2/libexec/config
<클러스터명>.log
형식의 파일로 저장되며, 날짜가 변경되면 날짜가 추가됨.ES가 실행되는 서버의 ip 주소
Default : 127.0.0.1
주석 처리 혹은, 루프백인 경우 개발모드로 실행
이 설정을 실제 IP 주소로 변경시, 운영 모드 실행되며, 부트스트랩 체크 시작
network.host는 서버의 내/외부 주소를 모두 지정하는데 만약 내부망에서 사용하는 주소와 외부망에서 접근하는 주소를 다르게 설정하고자 하면 아래의 값 들을 이용해서 구분이 가능
network.bind_host
: 내부망network.publish_host
: 외부망다음은 network.host 설정에 사용되는 특별한 변수값
127.0.0.1
과 같습니다. Default값실제로 클러스터를 구성할 때 설정을 network.host: _site_ 로 해놓으면 서버의 네트워크 주소가 바뀌어도 설정 파일은 변경하지 않아도 되기 때문에 편리.
discovery.seed_hosts 옵션은 7.0 이상 부터 추가된 기능
6.x 이전 버전에서는 젠 디스커버리를 사용
cluster.initial_master_nodes 옵션 또한 7.0이상 부터 추가된 기능.
6.x 이전 버전에서는 최소 마스터 후보노드를 지정하기 위해 다음 옵션 사용
discovery.zen.minimum_master_nodes
7.0 버전 부터는 최소 마스터 후보 노드의 크기가 능동적으로 변경
elasticsearch.yml 파일에 설정하는 것 외에도 Elasticsearch 실행 시 커맨드 명령에 -E <옵션>=<값>
을 이용해서 환경 설정이 가능합니다. 예를 들어 클러스터명은 my-cluster 노드명은 node-1로 노드를 실행하기 위해서는 다음과 같이 실행합니다.
# 클러스터명: my-cluster / 노드명: node-1 로 노드 실행
$ bin/elasticsearch -E cluster.name=my-cluster -E node.name="node-1"
환경설정이 elasticsearch.yml 과 커맨드 명령 -E에 모두 있는 경우에는 -E 명령에서 한 설정이 더 우선 설정됨.
cluster.name
설정이 묶여질 노드들 모두 동일해야 합니다. 같은 서버나 네트워크망 내부에 있다 하더라도 cluster.name
이 동일하지 않으면 논리적으로 서로 다른 클러스터로 실행이 되고, 각각 별개의 시스템으로 인식이 됩니다.#[node - 1] config/elasticsearch.yml
cluster.name: es-cluster-1
node.name: "node-1"
#[node - 2] config/elasticsearch.yml
cluster.name: es-cluster-1
node.name: "node-2"
#[node - 3] config/elasticsearch.yml
cluster.name: es-cluster-2
node.name: "node-3"
node-1 과 node-2는 하나의 클러스터로 묶여있기 때문에 데이터 교환이 일어납니다.
Node-1로 입력된 데이터는 node-2에서도 읽을 수 있으며 그 반대도 가능합니다. 하지만 node-3은 클러스터가 다르기 때문에, node-1, node-2에 입력된 데이터를 node-3에서 읽을 수는 없습니다.
노드가 처음 실행될 때 같은 서버, 또는 discovery.seed_hosts: [ ]
에 설정된 네트워크 상의 다른 노드들을 찾아 하나의 클러스터로 바인딩하는 과정을 디스커버리 라고 함.
디스커버리는 다음과 같은 순서로 이루어짐
discovery.seed_hosts
설정에 있는 주소 순서대로 노드가 있는지 여부를 확인
cluster.name
확인주소가 끝날때까지 노드를 찾지 못한 경우.
클러스터에 노드가 무수히 많아도 보통 discovery.seed_hosts 설정에는 처음에 탐색할 노드 3~5개 정도만 설정하면 큰 문제 없이 클러스터가 바인딩 됩니다. 보통은 마스터 후보 노드들을 지정하게 되며 처음 탐색하는 대상 노드는 반드시 먼저 가동중이어야 합니다.
용어 | 뜻 |
---|---|
도큐먼트(Document) | 단일 데이터 단위 |
인덱스(Index) | 도큐먼트를 모아놓은 집합 |
샤드(shard) | 인덱스의 기본 단위 &루씬의 단일 검색 인스턴스 |
인덱스는 기본적으로 샤드(shard)라는 단위로 분리되고 각 노드에 분산되어 저장이 됩니다.
위 이미지는 하나의 인덱스가 5개의 샤드로 저장되도록 설정한 예
인덱스를 생성할 때 별도의 설정을 하지 않으면 7.0 버전부터는 디폴트로 1개의 샤드로 인덱스가 구성됨
클러스터에 노드를 추가하게 되면 샤드들이 각 노드들로 분산되고 디폴트로 1개의 복제본을 생성
처음 생성된 샤드를 프라이머리 샤드, 복제본을 레플리카(Replica) 라고 부릅니다.
예를들어 한 인덱스가 5개의 샤드로 구성되어있고 4개의 클러스터로 구성되어 있다고 가정하면
5개의 프라이머리 샤드와 복제본(Replica), 총 10개의 샤드들이 전체노드에 골고루 분배되어 저장.
노드가 1개만 있는 경우 프라이머리 샤드만 존재하고 복제본은 생성되지 않습니다.
Elasticsearch는 아무리 작은 클러스터라도 데이터 가용성과 무결성을 위해 최소 3개의 노드로 구성할 것을 권장
# 프라이머리 샤드 5, 복제본 1인 books 인덱스 생성
$ curl -XPUT "http://localhost:9200/books" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}'
# books 인덱스의 복제본 개수를 0으로 변경
$ curl -XPUT "http://localhost:9200/books/_settings" -H 'Content-Type: application/json' -d'
{
"number_of_replicas": 0
}'
Elasticsearch 클러스터는 하나 이상의 노드들로 구성
이 중 하나의 노드는 인덱스의 메타 데이터, 샤드의 위치와 같은 클러스터 상태 정보를 관리하는 마스터 노드의 역할을 수행
클러스터 마다 하나의 마스터 노드가 존재하며, 마스터 노드 역할을 수행할 수 있는 노드가 없을 경우 클러스터 정지
elasticsearch.yml
에 디폴트 설정은 node.master: true로 되어 있습니다.
기본적으로 모든 노드가 마스터 후보 노드 입니다.
마스터 노드가 끊어질 경우 다른 마스터 노드 후보중 하나가 마스터 노드로 선출되어 역할을 수행하게 됩니다.
데이터 노드는 색인된 데이터를 저장하고 있는 노드
클러스터에서 마스터 노드와 데이터 노드를 분리하여 설정할 때 마스터 후보 노드들은 node.data:false
로 설정하여 마스터 노드 역할만 하고 데이터는 저장하지 않도록 할 수 있음.
이렇게 하면 마스터 노드는 클러스터 관리만 하게되고, 데이터 노드는 클러스터 관리작업으로부터 자유롭게 되어 데이터 처리에만 집중할 수 있음.
다음은 4개의 노드를 실행하는데 node-1은 마스터 역할만 실행하는 전용노드, node2,3,4는 데이터 노드 입니다.
#[node-1] config/elasticsearch.yml
node.master: true
node.data: false
#[node-2] config/elasticsearch.yml
node.master: false
node.data: true
#[node-3] config/elasticsearch.yml
node.master: false
node.data: true
#[node-4] config/elasticsearch.yml
node.master: false
node.data: true
실제 운영환경에서는 위 예제처럼 마스터 후보를 노드 1개만 설정하면 안되고 최소 3개 이상의 홀수개로 설정해야합니다.
이유는 다음의 Split Brain 문제에서 설명
Split Brain
이라고 합니다.elasticsearch.yml
에서 discovery.zen.minimum_master_nodes
설정을 이용하여 지정가능#elasticsearch.yml
discovery.zen.minimum_master_nodes:2
Minimum_master_nodes 값은 (전체 마스터 후보 노드 /2 ) + 1
개로 설정되어야 합니다.
마스터 후보 노드가 5개인 경우 3으로 설정합니다.
7.0 부터는 discovery.zen.minimum_master_nodes
설정이 사라지고 대신 node.master: true
인 노드가 추가되면서 클러스터가 스스로 minimum_master_nodes 노드 값을 변경하도록 되었습니다.
따라서 사용자는 cluster.initial_master_nodes: [ ]
값만 설정하면 됩니다.