BigData/ElasticSearch

Elasticsearch 코디네이팅 노드 동작 테스트

kih5893 2023. 3. 25. 07:24
기본 동작이지만 가장 궁금했던 내용에 대해 테스트를 진행했다.
N개의 노드를 구성하고, 마스터 노드를 제외한 나머지 노드에 검색 또는 문서 생성 등을 요청할 경우 잘 생성될까? 이론상으로 알고 있는 내용을 확인하기 위함이다.

 

 

환경 구축

Node는 2개로 구성하고 각자의 역할을 다음과 같이 정의한다.

1번 노드: 마스터 노드, 데이터 노드, 포트: 9200

2번 노드: 데이터 노드, 포트: 9201

 

1번 노드 설정

cluster.name: my-cluster

node.name: node-master
node.master: true
node.data: true
node.ingest: false

http.port: 9200

network.host: [_site_, _local_]
discovery.seed_hosts: ["192.168.0.9"]

cluster.initial_master_nodes: ["node-1"]

 

2번 노드 설정

cluster.name: my-cluster

node.name: node-data
node.master: false
node.data: true
node.ingest: false

http.port: 9201

network.host: [_site_, _local_]
discovery.seed_hosts: ["192.168.0.9"]

cluster.initial_master_nodes: ["node-1"]

 

 

테스트 진행에 앞서 검색, 문서 생성 등 기본 API에 대한 내용은 지난 포스트를 참고.

 

초보자를 위한 Elasticsearch 시작하기: CRUD

본 내용은 윈도우에 설치된 Elasticsearch 7.10.2 버전으로 기준으로 작성되었습니다. 1. Index 생성하기 PUT http://localhost:9200/test_index Header: Content-Type: application/json Body: { "settings": { "index": { "number_of_shards"

inoino9.tistory.com

 

테스트 케이스 정의

Test case 1) 마스터 노드의 포트로 검색 요청

Test case 2) 데이터 노드의 포트로 검색 요청

Test case 3) 마스터 노드의 포트로 문서 생성 요청

Test case 4) 데이터 노드의 포트로 문서 생성 요청

 

 

테스트는 기존에 생성해둔 test_index 인덱스를 활용했다.

 

Test case 1) 마스터 노드의 포트로 검색 요청

조회

GET http://localhost:9200/test_index/_search

응답 (정상 조회 확인)

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "JvwH9YYBZI6tAZLb_kao",
        "_score" : 1.0,
        "_source" : {
          "field1" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field2" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field3" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field4" : "Elasticsearch Basics Test, I like elasticsearch."
        }
      }
    ]
  }
}

 

Test case 2) 데이터 노드의 포트로 검색 요청

조회

 

GET http://localhost:9201/test_index/_search

 응답 (정상 조회 확인)

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "JvwH9YYBZI6tAZLb_kao",
        "_score" : 1.0,
        "_source" : {
          "field1" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field2" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field3" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field4" : "Elasticsearch Basics Test, I like elasticsearch."
        }
      }
    ]
  }
}

 

Test case 3) 마스터 노드의 포트로 문서 생성 요청

문서 생성 요청

POST http://localhost:9201/test_index/_doc/2

문서 정의

{
  "field1": "Example text1",
  "field2": "Example text1",
  "field3": "Example text1",
  "field4": "Example text1"
}

응답

{
    "_index": "test_index",
    "_type": "_doc",
    "_id": "2",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 6,
    "_primary_term": 8
}

 

Test case 4) 데이터 노드의 포트로 문서 생성 요청

문서 생성 요청

POST http://localhost:9201/test_index/_doc/3

문서 정의

 

{
  "field1": "Example text2",
  "field2": "Example text2",
  "field3": "Example text2",
  "field4": "Example text2"
}

응답

{
    "_index": "test_index",
    "_type": "_doc",
    "_id": "3",
    "_version": 1,
    "result": "created",
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 5,
    "_primary_term": 8
}

 

최종 데이터 확인

GET http://localhost:9201/test_index/_search?pretty

 

응답

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "JvwH9YYBZI6tAZLb_kao",
        "_score" : 1.0,
        "_source" : {
          "field1" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field2" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field3" : "Elasticsearch Basics Test, I like elasticsearch.",
          "field4" : "Elasticsearch Basics Test, I like elasticsearch."
        }
      },
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "field1" : "Example text2",
          "field2" : "Example text2",
          "field3" : "Example text2",
          "field4" : "Example text2"
        }
      },
      {
        "_index" : "test_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "field1" : "Example text1",
          "field2" : "Example text1",
          "field3" : "Example text1",
          "field4" : "Example text1"
        }
      }
    ]
  }
}

 

 

결론

http.port로 수신 받는 노드는 코디네이팅 노드의 역할을 수행하기 때문에 어느 노드로 요청을 하든 조회 및 문서 생성 모두 잘 동작하는 것을 확인했다.


★ 테스트 구성 시 특이사항 정리

1. 윈도우에서 실행 시 이슈
- elasticsearch 설치 경로 중간에 공백이 들어가는 경우 실행 안됨.
- 공백 제거 하든지 다른 경로로 옮겨서 실행

2. with the same id but is a different node instance 에러 발생
- 단일 노드로 테스트 하다가 그 디렉토리 그대로 옮겨서 다른 노드 만들어서 실행했더니 에러
- 디렉토리 안에 있는 data 디렉토리까지 다 옮겨서 node는 다른데 id가 같은 현상 발생
- 옮긴 후에 새로 만들 node의 data 디렉토리는 제거함, 또 다른 방법으로는 data 디렉토리를 분리하는 방법도 있음.

 

3. node.name은 수시로 변경 가능

- elasticsearch 재시작만하면 변경된 node.name로 사용 가능

반응형