elasticsearch master 후보가 두 개일 때 기존 마스터에서 네트워크 문제가 발생하면, 마스터가 두 개 되는 문제가 발생할까? -> 아니오.
master 후보가 두 개일 때, 기존 마스터에서 네트워크 문제가 발생하더라도, 기존 마스터는 그대로 마스터 자리를 유지한다.
문제가 생긴 노드는 마스터임에도 불구하고, 연락이 끊긴 마스터 후보는 클러스터에서 퇴출당한다.
그리고 퇴출당한 노드는 마스터의 응답을 받을 때까지 무한히 대기한다.
마스터 후보 노드 두 개, 데이터 노드 두 개를 만든다.
마스터 후보 노드 두 개는 마스터 역할만 담당하도록 한다.
마스터 노드에 네트워크 문제를 재현하여, 어떤 현상이 일어나는지 본다.
elasticsearch 다운 방법은 밑 url에 나와 있다.
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-install.html
운영 모드로 실행하기 위해 몇 가지 설정이 필요하다.
위 설정이 없으면 다음과 같은 에러가 뜬다.
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
자세한 내용은 밑 링크를 참고한다.
https://abc2080.tistory.com/entry/%EC%97%90%EB%9F%AC-1-max-virtual-memory-areas-vmmaxmapcount-65530-is-too-low-increase-to-at-least-262144
마스터라면 cluster.initial_master_nodes에서 자기 자신의 노드 이름을 쓰면 된다.
cluster.initial_master_nodes: ["자기_자신_노드의_이름"]
마스터가 아니라면 discovery.seed_hosts에서 자기 자신의 노드 이름과, 마스터 노드의 이름을 쓴다.
discovery.seed_hosts: ["마스터_아이피", "본_서버_아이피"]
만약 위 설정 중 일부를 누락한다면 다음 에러를 만날 수 있다.
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
이 글에서는 마스터 노드는 데이터 역할을 하지 않도록, 데이터 노드는 마스터 역할을 하지 하도록 구성했다.
마스터 역할만 하는 노드는 다음과 같은 설정을 추가한다.
node.data: false
데이터 역할만 하는 노드는 다음과 같은 설정을 추가한다.
node.master: false
machine learning 관련 설정은 끈다.
machine learning 관련 기능을 활성화하면, 네트워크 이상 시 노드가 비정상 종료하는 것을 확인했다.
elasticsearch.yml 속:
xpack.ml.enabled: false
aws ec2를 사용하고 있다면, ip 주소는 ec2 private ip로 설정한다.
ip 주소를 설정하지 않았을 때, 에러가 생기는지는 잘 모르겠다.
network.host: 프라이빗_아이피
노드 이름은 알기 쉽게 하기 위한 용도다. 본인이 원하는대로 설정한다.
node.name: 이름
노드마다 준비과정을 거쳤다.
마스터 노드 두 개, 데이터 노드 두 개 총 네 개의 노드가 정상적으로 떴다.
이제 마스터 노드에서의 네트워크 문제를 재현한다.
iptables 명령어를 사용하여 네트워크 문제를 재현할 수 있다.
iptables 명령어 설명은 밑 링크에 있다.
예시)
sudo iptables -A INPUT -p tcp -s 111.48.111.111 -j DROP
sudo iptables -D INPUT 1
node-1(마스터)에서 다른 노드들에서 오는 요청을 블락한다.
sudo iptables -A INPUT -p tcp -s 마스터_후보_노드-j DROP
sudo iptables -A INPUT -p tcp -s 데이터_노드_1 -j DROP
sudo iptables -A INPUT -p tcp -s 데이터_노드_2 -j DROP
결과는 다음과 같다.
마스터 후보는 마스터가 되지 않는다.
기존 마스터가 마스터 자리를 유지한다.
모든 노드에서 indexing이 실패한다.
search는 가능하다.
단 마스터에서는 인위적으로 모든 네트워크를 끊었으므로, 마스터에서는 검색이 불가능하다.