ElasticSearch 트러블 슈팅

Munang·2021년 7월 13일
1

ElasticSearch

목록 보기
5/12

Elasticsearch를 하면서 발생했던 트러블 슈팅에 대해 정리한다.


환경

  • Centos7
  • vmware

1. master_not_discovered

{ "error" : { "root_cause" : [ { "type" : "master_not_discovered_exception", "reason" : null } ], "type" : "master_not_discovered_exception", "reason" : null }, "status" : 503 }

마스터 노드를 찾을 수 없다는 오류였다.
yml 파일에 들어간다.

sudo nano /etc/elasticsearch/elasticsearch.yml

그리고, 파일 내용에서 마스터 노드로 지정할 노드 네임을 기재해준다.

cluster.initial_master_nodes: ["mu-node"]

그리고 나와서 서비스 재시작!!

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

여기서 해결될 수도 있는데, 나는 해결이 안됐다.
해결이 안됐을 경우 취할 수 있는 조치 방법은 2가지

1. 설정 파일 내용 기재할때는 "속성값: 값" 형태여야 한다. -> 띄어쓰기 주의!!!
2. 하나의 속성을 더 기재할 수 있다. 
	node.master: true

이후 서비스 재시작 !!!!

2. "mapper_parsing_exception","reason":"Root mapping definition has unsupported parameters:

인덱스의 속성을 매핑할때 발생하는 오류이다.
대부분 버전대와 맞지않는 속성 명을 기재해서 생긴다. (필자의 경우 그랬다.)

먼저, 본 문서를 참고해서 매핑 가이드를 확인해보자.

  • 매핑할때 확인해야 할 것이 꼭 3가지 있다.
    1) 이미 매핑된 속성이 있는가?
    -> 매핑 속성을 변경하는 것이라면 안된다. Elasticsearch의 데이터 무결성이 깨지는 이유로 지원하지 않는다. 그냥 인덱스 정보를 삭제하고 다시 전체 속성을 매핑해주는게 맞다.
    2) 생성하지 않은 인덱스에 매핑, 생성된 인덱스에 매핑
    -> 명령어가 조금씩 다르다.
    3) 버전대가 다르면, 매핑할때 PUT하는 json의 속성이 조금씩 다르다. 버전대를 반드시 확인하자!!(아래 3,4,5 번 오류도 버전대와 관련된 오류이다.)

지금 문서를 보고있는 읽는 이의 ES버전대가 7.x라면, 아래의 매핑폼을 확인해보고 본인이 불필요한 속성을 넣었는지 확인해보자.

{
  "mappings": {
    "properties": {
      "category": {
        "type": "keyword"
      },
      "pages": {
        "type": "byte"
      },
      "title": {
        "type": "text"
      }
    }
  }
}

3,4,5번 오류는 아직 생성하지 않은 인덱스에 속성과 함께 인덱스 정보를 매핑해주는 과정에서 발생하는 오류이다.

  • 인덱스 생성 후 매핑
  • 인덱스와 속성정보 같이 매핑
    두개는 다르다! 명령어도 다르니까 꼭 확인해보자.

3. "type" : "mapper_parsing_exception","reason" : "No handler for type [string] declared on field

이걸 확인한다면 당신은 바보!!!!!!!!!!!!!!!! 버전을 확인해라
이것도 버전대로인한 오류 중 하나이다. ES에서 이제는 String 타입이 아닌 text타입을 사용함으로, 타입 속성만 변경해서 다시 매핑해주면 된다.

4.Failed to parse value [analyzed] as only [true] or [false] are allowed

이걸 확인한다면 당신은 바보!!!!!!!!!! 버전을 확인해라
이제 analyzed 속성은 없다!!!
본 문서를 참고해서 매핑 가이드를 확인해보자.

5. Indices, types, and parent / child: current status and upcoming changes in Elasticsearch

이걸 확인한다면 당신은 바보다 ... 매핑 커맨드나 put하는 내용에 현재 버전대와 맞지 않는 부분이 반드시 있을 것이다..
본 문서를 참고해서 매핑 가이드를 확인해보자.

6. Rejecting mapping update to [] as the final mapping would have more than 1 type [_doc,line]

인덱스 타입이 원래는 doc이어야 하는데 line으로 들어와서 doc이랑 line 2개가 들어왔다는 말이다.(1개를 초과했다)
5.4에서는 이게 왜 허용되었냐면, 이전 버전대에는 인덱스에 여러 타입이 들어와도 호환이 가능했지만 이로인한 이슈가 많아 엘라스틱 측에서 6.x버전 부터는 하나의 타입만 사용하도록 강제했다.
이렇게 타입이 1개밖에 없어서 7.x대 버전부터는 타입이 아예 사라졌다. 공식문서를 참고해보면, 샘플 데이터에 타입이 없는 것을 확인할 수 있다.

즉, 매핑하려는 데이터의 오류이다. 잘 확인해보시라!!!

7. Elasticsearch error: curl: (7) Failed to connect to localhost port 9200: Connection refused

말 그대로 연결 오류이다. 필자의 경우 3가지 원인으로 이 오류를 만났었다.

일단 연결이 실패한 이유에는 크게 3가지로 무조건 수렴한다.

  • yml 설정 파일 잘못 입력 : 보통 호스트 주소
sudo nano /etc/elasticsearch/elasticsearch.yml
여기서 설정해야 할 속성들은 대부분 이정도...
여기서 제외된 속성이 있나 확인해보셔라.

cluster.name: my-application
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: localhost
http.port: 9200
transport.port: 9300
discovery.seed_hosts: localdamain
cluster.initial_master_nodes: ["node-1"]
  • 무선랜(노트북일경우) 연결이 끊겼다가 다시 연결되어서 중간에 elasticsearch 서버가 다운되었는데 재시작을 안해줬따. 재시작 해주자
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
  • 방화벽 포트 닫혀있음
[irteamsu@localhost ~]$ firewall-cmd --zone=public --permanent --add-port=9300/tcp
success
[irteamsu@localhost ~]$ firewall-cmd --zone=public --permanent --add-port=9200/tcp
success
[irteamsu@localhost ~]$ firewall-cmd --reload

8.Elasticsearch: Job for elasticsearch.service failed

이 오류도 대부분 3가지의 원인 중 하나였다.
일단 이 문서를 먼저 참고해보시고, 여기서 빠트린 내용이 있는지 확인해봐라.

  • 타임 아웃(시간설정)
  • 메모리 설정
    -> 요 2가지 속성은 위의 문서를 참고했다면 해결됐을 것이다.
  • yml파일에 호스트 관련 정보 잘못입력
sudo nano /etc/elasticsearch/elasticsearch.yml
여기서 설정해야 할 속성들은 대부분 이정도...
필자는 로컬 환경에서 실행해서 이 속성을 입력했다.
본인이 로컬환경이라면 참고해보고, 
여러개의 노드로 이뤄진 클러스터를 운영중이라면
공식 가이드 문서를 참고하시길..

cluster.name: my-application
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: localhost
http.port: 9200
transport.port: 9300
discovery.seed_hosts: localdamain
cluster.initial_master_nodes: ["node-1"]

0개의 댓글