노드

엘라스틱서치의 인스턴스를 실행할 때는 노드를 실행하는 것과 다름없다. 연결된 노드들의 모음을 클러스터라고 부르며 엘라스틱서치의 단일 노드를 실행시키는 것은 결국 하나의 노드를 가진 클러스터를 실행하는 것이다. (하나의 클러스터를 가지는 것이다.) 


클러스터 내부의 모든 노드들은 기본적으로 HTTP 통신과 전송 트래픽을 처리할 수 있다. 트랜스포트 레이어는 노드와 Java TransportClient 간의 통신에만 사용된다. 결국 노드간의 데이터 교환이 일어나는 경우 트랜스포트 레이어 계층까지만 이용하는 것이다. 반면에 HTTP 통신은 오직 외부 REST API를 이용하는 클라이언트에서만 사용된다. 


모든 노드는 같은 클러스터에 있는 다른 노드들을 알고 있으며 이는 같은 클러스터 명을 가진 노드들간의 바인딩 결과이다. 따라서 외부 클라이언트에서 요청이 오면 요청에 대한 수행을 할 수 있는 적절한 노드에게 해당 요청을 전달한다. 그 외에도 각각의 노드들은 하나 이상의 목적을 수행한다.


노드의 종류에는 엘라스틱서치가 버전업 함에 따라서 여러개가 있는데, 대표적으로 두 가지만 살펴볼 것이다.

  • 마스터 노드 (Master - eligible Node)

    • node.master = true (default) 로 설정된 노드

  • 데이터 노드 (Data Node)

    • node.data = true (default) 로 설정된 노드

엘라스틱 엔진은 분산 검색엔진이고 스케일 아웃(Scale-out)에 대해서 유연하게 할 수 있는데 왜 그런지는 결과적으로 마스터 노드와 데이터 노드의 역할이 명확하게 구분되고 있기 때문이라고 생각한다.

마스터 노드
  • 인덱스 생성 또는 삭제
  • 클러스터의 일부 노드 트랙킹(Tracking)
  • 클러스터에 할당할 샤드 결정 등과 같은 클러스터 전체에 걸친 간단한 작업을 담당
  • 클러스터 상태에 안정적인 마스터노드가 있어야 한다.
마스터 노드에 적합한 모든 노드들은 마스터 선출 프로세스에 의해 마스터 노드가 된다. 마스터 노드는 데이터 노드와 마찬가지로 데이터 / 디렉토리에 대한 액세스 권한을 가지고 있어야 한다. 왜냐하면 노드가 다시 시작될 때까지 클러스터의 상태가 지속되는 곳이기 때문이다.

데이터를 색인하고 검색하는 것은 노드의 리소스에 부담을 주는 CPU, Memory, 집중적인 I/O 작업들이다. 결국 마스터 노드가 안정적이고 부담을 받지 않도록 하기 위해서는 좀 더 큰 클러스터에서 명확하게 목적을 분리하여 역할을 분담하는 것이 좋다. 

예를 들어 마스터 노드에 적합한 노드는 마스터 노드만이 수행할 수 있는 역할만 수행하고 데이터 노드는 데이터 노드만이 수행할 수 있는 역할을 수행하는 것이다.

마스터 노드는 또한 coordinating(조정, 협력) 노드로써 작동하고, 클라이언트에서 데이터 노드로의 색인 및 검색에 대한 요청을 하는 중간의 라우터 역할을 한다. 클라이언트의 요청에 대해서 데이터 노드로 요청을 라우팅해주는 것이다. 결국 클러스터의 안전성을 위해서 마스터 노드는 최대한 적은 일을 수행하는 것이 중요하다.

데이터 노드
  • 데이터를 보유하고 있으면서 CRUD 및 검색과 집계와 같은 데이터 처리 작업을 수행
데이터 노드에는 샤드가 존재한다. 그리고 그 샤드 내부에는 도큐먼트를 포함하고 있으며 해당 도큐먼트에는 색인된 데이터가 존재한다. 데이터 노드는 데이터 처리 작업을 수행하면 CPU, Memory, I/O 등이 많이 사용할 수 밖에 없다. 위의 많은 노드의 리소스 부담 때문에 노드 리소스를 모니터링하며 오버로드되는 경우에 더 많은 데이터 노드를 추가하는 것이 중요하다. 

☞ 마스터 노드와 데이터 노드를 그림으로 나타내면 아래와 같다.

[ 같은 클러스터 명안에 있는 마스터 노드와 데이터 노드 ]



Posted by doubler
,