And Brain said,
Elasticsearch Cluster, 거대한 데이터 군체 본문
다들 알다시피 Elasticsearch는 대용량 데이터의 실시간 검색과 분석에 탁월한 검색엔진이다.
오늘은 이 Elasticsearch의 핵심 아키텍처 클러스터(Cluster)와 노드(Node)를 알아보고 실습까지 해보자.
IT에서 클러스터와 노드는 Elasticsearch에서만 사용되는 개념은 아니고 예시를 Elasticsearch로 드는 것뿐이다.
먼저 Node는 분산 처리 시스템의 독립적인 단위로, 노드가 곧 하나의 Elastic 서버다.
Cluster내에 이러한 노드를 여러 개 둔다면 각 노드는 데이터를 복제하고 검색 요청을 분산 처리하며, 또 클러스터 내 다른 노드들과 통신 가능하여 클러스터의 성능과 안정성을 보장한다.
노드는 Master-eligible 노드와 Data 노드, Ingest 노드 등의 역할별로 분류된다.
Master-elgible 노드는 Master 역할을 수행할 수 있는 노드로 Cluster 관리를 위한 역할을 수행한다.
Data Node는 실제 데이터를 저장하고 검색 요청을 처리한다.
Ingest Node는 데이터를 전처리하는 역할을 한다.
이런 노드들을 역할 별로 적절하게 구성한다면 클러스터의 고가용성과 높은 성능을 보장할 수 있다.
클러스터는 이러한 노드들이 모여 이루어진 거대한 군체이다.
기본 개념은 익혔으니 이제 본격적으로 엘라스틱서치의 거대한 데이터 군체를 구성해 보자.
먼저 대략적으로 설명하자면, 서버는 총 4개를 사용하며 3개의 서버에 엘라스틱서치를 둘 것이고 다른 하나에는 가장 무거운 로그스태시를 둘 것이다.
노드가 3개밖에 되지 않기에 각각은 data이자 ingest 노드가 될 것이며 동시에 마스터 후보 노드가 되어 고가용성을 보장할 것이다.
이렇게 되면 쿼럼(Quorum)이 충족되는 순간(아래에 설명), 그 즉시 마스터를 선출하기 위한 투표가 시작된다.
이후 투표 알고리즘에 의해 마스터가 선출될 것이다.
이후엔 다시 마스터 노드가 죽더라도 클러스터 내부에서 마스터 후보 노드들의 투표가 시작되며, 엘라스틱 서치 내부의 Zen Discovery 알고리즘에 의해 다시 최종적으로 마스터 노드가 선출될 것이다.
이는 설정만 제대로 한다면 알아서 작동하는 일련의 과정이니 모든 것을 이해하려 하지 않아도 된다.
시작하자.
먼저, 자바가 설치되어 있어야 한다.
$ sudo apt update
$ sudo apt install openjdk-11-jdk
꼭 11 버전이 아니어도 된다.
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
$ sudo apt update
$ sudo apt install elasticsearch=7.17.8
// systemctl 명령어를 이용해 실행하고 재부팅 시에 자동 재시작할 수 있다
$ sudo systemctl start elasticsearch
$ sudo systemctl enable elasticsearch
// 구동 확인
$ curl http://localhost:9200/
엘라스틱서치는 7.17.8 버전으로 설치했다.
자 이것을 세 개의 노드에 각각 해주면 된다.
로그스태시 설치도 이와 크게 다르지 않으므로 생략하겠다.
로그스태시 설정은 어렵지 않으니 추가적으로 설정할 것은 각각의 노드에 분산 아키텍처를 구축해야 하므로 output config를
output {
elasticsearch {
hosts => ["http://yourNodeIP1:port", "http://yourNodeIP2:port", "http://yourNodeIP3:port"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-*"
}
}
이런 식으로 배열 안에 넣어야 한다는 것이다. (혹시 Logstash 설정을 못하겠다면 댓글을 달아달라)
틀은 잡혔으니 노드들을 역할 별로 구분해 보자.
설정 파일은 Ubuntu 기준 /etc/elasticsearch/elasticsearch.yml이다.
vi 혹은 nano를 사용하여 파일을 수정하자.
파일 안에 들어가 보면 주석들을 풀어가며 설정하거나 아예 맨 밑에다 적는 것도 괜찮은 방법이다.
클러스터 이름은 달라선 안되며, 기본값은 elasticsearch이므로 바꾸지 않는다면 같은 클러스터 이름으로 설정될 것이다.
핵심적으로 설정해야 할 것은 이거다.
## elasticsearch 7.00 부터는 discovery.zen.ping.unicast.hosts 대신 discovery.seed_hosts 사용 권장
# node-1.yml
node.name: node-1
node.master: true
node.data: true
node.ingest: true
network.host: yourIP1
discovery.zen.ping.unicast.hosts: ["yourIP1", "yourIP2", "yourIP3"]
discovery.zen.minimum_master_nodes: 2
# node-2.yml
node.name: node-2
node.master: true
node.data: true
node.ingest: true
network.host: yourIP2
discovery.zen.ping.unicast.hosts: ["yourIP1", "yourIP2", "yourIP3"]
discovery.zen.minimum_master_nodes: 2
# node-3.yml
node.name: node-3
node.master: true
node.data: true
node.ingest: true
network.host: yourIP3
discovery.zen.ping.unicast.hosts: ["yourIP1", "yourIP2", "yourIP3"]
discovery.zen.minimum_master_nodes: 2
각각의 노드 yml 파일에 하나씩 적어준다.
여기서 discovery.zen.ping.unicast.hosts를 통해 클러스터에 참여할 노드들을 찾는다.
만약 포트포워딩을 했다면 포트포워딩한 IP와 포트를 적어주면 된다.
그렇다면, discovery.zen.minimum_master_nodes는 무엇이냐, 좀 전에 말한 마스터 후보 노드들 중에서 마스터 노드로 선출될 수 있는 최소한의 노드 수이다.
즉, 이 값이 바로 엘라스틱서치 클러스터의 쿼럼(Quorum)이다.
https://theworldaswillandidea.tistory.com/113
엘라스틱서치 투표 알고리즘인 Zen Discovery에 의해 마스터 노드가 선출되기 위해선 이 값을 마스터 후보 노드 수의 과반수 이상으로 설정해야 한다.
이 경우엔 2로 설정하면 된다.
여기까지 설정하고 노드들을 재실행시킨다면 간단하게 거대한 데이터 군체가 완성된 것이다.
curl 명령어를 통해 클러스터가 잘 완성되었는지 어떤 노드가 마스터가 되었는지 확인해보자.
앞으로 이 클러스터를 이용해 몇 가지 재밌는 것들을 해 볼 것이다.
Thanks for watching, Have a nice day.
References
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/deb.html
https://gist.github.com/t0mst0ne/256c2ade9fb05d6ebe71
'IT > ELK Stack' 카테고리의 다른 글
Kibana, 데이터 파이프라인의 화가 (0) | 2023.04.02 |
---|---|
Logstash, 데이터 파이프라인의 마술사 (0) | 2023.03.09 |
Cluster의 Quorum, 군체의 성립 요건 (0) | 2023.02.25 |
ELK Stack의 삼두마차, ELK (0) | 2023.01.13 |
ELK Stack, 완성된 시스템의 화룡점정 (0) | 2023.01.13 |