관리 메뉴

가끔 보자, 하늘.

elasticsearch-js로 인데스가 존재하는지 확인하는 방법 본문

개발 이야기/개발 및 서비스

elasticsearch-js로 인데스가 존재하는지 확인하는 방법

가온아 2021. 5. 18. 12:51

nodejs에서  elasticsearch-js를 이용해 데이터 분석, 취합을 할 때, 잘못된 인덱스 이름, 혹은 존재하지 않는 인덱스 이름으로 인해 문제가 발생하는 경우가 있습니다. 

 

이 경우 검색이 중단되고 404 에러가 발생하며 중단됩니다.

 

에러를 막기위해 검색 시 아래 예제와 같이 ignore키워드를 지정할 수 있습니다.

const result = await client.search({
  index: 'my-index',
  from: 20,
  size: 10,
  body: { foo: 'bar' }
}, {
  ignore: [404],
  maxRetries: 3
})

이 방법은 에러를 막을 수 있지만, 검색이 중단되는 것은 동일합니다. 

 

예를들어 ['seoul', 'busan', 'jeju']라는 인덱스들에서 어떤 정보를 검색하길 원했는데 'busan'이라는 인덱스가 없다면 'seoul'과 'jeju'인덱스도 검색하지 않고 중단됩니다. 

 

그래서 검색 시 해당 인덱스가 실제로 존재하는지 확인 후 검색 대상에 등록하는게 좋습니다. 이를 위해 elasticsearch-js에서는 exists 라는 함수를 지원합니다. 아래 예제와 같이 사용할 수 있습니다. 

const bExists  = async(client, myIndex) => {
	await client.indices.exists({index:myIndex}, (err, res, status) {
    	....
        return res.body; // true or false
    });
}

이를 통해 존재하지 않는 'busan'이라는 인덱스를 제외 후 검색 대상 인덱스에 등록하면 정상적인 결과를 확인할 수 있습니다.

 

위 코드의 결과로 403 에러가 발생한다면 client 계정의 권한 문제입니다.

 

Kibana -> Stack Management -> Roles 에서 수정할 수 있으며, "view_index_metadata" 권한을 할당하면 정상적으로 확인이 가능합니다.

 

사실 검색할 인덱스 이름이 대부분 존재하기 때문에 이런 경우가 거의 없는데 최근 오래된 장비'들'에서 문제가 발생해 몇몇 인덱스가 영구손실되는 문제가 발생했습니다.

 

그래서 어쩔 수 없이 경험한 사례였네요. 모든 노드에 소스 데이터를 복제할 수도 없어서 이런 경우는 참 난감하네요.  이런 경우는 또 어떻게 손실이 발생하지 않을 수 있는지 방법을 찾아봐야 겠습니다. 

 

여러분의 ES는 부디 안전하길... ㅠ_ㅜ

 

 

반응형