elasticsearch master 후보가 두 개일 때 마스터에서 네트워크 문제가 발생하면, split brain 문제가 발생할까?

jinwook han·2021년 2월 8일
0

elasticsearch master 후보가 두 개일 때 기존 마스터에서 네트워크 문제가 발생하면, 마스터가 두 개 되는 문제가 발생할까? -> 아니오.

master 후보가 두 개일 때, 기존 마스터에서 네트워크 문제가 발생하더라도, 기존 마스터는 그대로 마스터 자리를 유지한다.
문제가 생긴 노드는 마스터임에도 불구하고, 연락이 끊긴 마스터 후보는 클러스터에서 퇴출당한다.
그리고 퇴출당한 노드는 마스터의 응답을 받을 때까지 무한히 대기한다.

마스터 후보 노드 두 개, 데이터 노드 두 개를 만든다.
마스터 후보 노드 두 개는 마스터 역할만 담당하도록 한다.
마스터 노드에 네트워크 문제를 재현하여, 어떤 현상이 일어나는지 본다.

준비

1. elasticsearch를 다운로드한다.

elasticsearch 다운 방법은 밑 url에 나와 있다.
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-install.html

2. elasticsearch를 실행한다.

운영 모드로 실행하기 위해 몇 가지 설정이 필요하다.

1. sysctl.conf 속 vm.max_map_count 을 262144 이상으로 설정한다.

위 설정이 없으면 다음과 같은 에러가 뜬다.

[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

2. elasticsearch.yml 속 클러스터 설정(discovery.seed_hosts, cluster.initial_master_nodes) 중 하나를 설정한다.

마스터라면 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

3. node의 role에 맞게 elasticsearch.yml을 수정한다.

이 글에서는 마스터 노드는 데이터 역할을 하지 않도록, 데이터 노드는 마스터 역할을 하지 하도록 구성했다.

마스터 역할만 하는 노드는 다음과 같은 설정을 추가한다.

node.data: false

데이터 역할만 하는 노드는 다음과 같은 설정을 추가한다.

node.master: false

4. elasticsearch.yml에서xpack.ml.enabled: false 로 설정한다.

machine learning 관련 설정은 끈다.
machine learning 관련 기능을 활성화하면, 네트워크 이상 시 노드가 비정상 종료하는 것을 확인했다.

elasticsearch.yml 속:

xpack.ml.enabled: false

5. elasticsearch.yml에서 ip 주소 및 노드 이름을 설정한다.

aws ec2를 사용하고 있다면, ip 주소는 ec2 private ip로 설정한다.
ip 주소를 설정하지 않았을 때, 에러가 생기는지는 잘 모르겠다.

network.host: 프라이빗_아이피

노드 이름은 알기 쉽게 하기 위한 용도다. 본인이 원하는대로 설정한다.

node.name: 이름

준비완료

노드마다 준비과정을 거쳤다.

마스터 노드 두 개, 데이터 노드 두 개 총 네 개의 노드가 정상적으로 떴다.

이제 마스터 노드에서의 네트워크 문제를 재현한다.

마스터에서 네트워크 오류를 일으키는 방법?

iptables 명령어를 사용하여 네트워크 문제를 재현할 수 있다.

iptables 명령어 설명은 밑 링크에 있다.

https://linuxstory1.tistory.com/entry/iptables-%EA%B8%B0%EB%B3%B8-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%B0%8F-%EC%98%B5%EC%85%98-%EB%AA%85%EB%A0%B9%EC%96%B4

예시)

  • 52.48.161.231에서 오는 tcp input을 막는다.
sudo iptables -A INPUT -p tcp -s 111.48.111.111 -j DROP
  • 첫 번째 input 룰을 삭제한다.
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는 가능하다.
단 마스터에서는 인위적으로 모든 네트워크를 끊었으므로, 마스터에서는 검색이 불가능하다.

0개의 댓글