일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 영어
- Es
- 설정
- 구글
- 유니티
- Linux
- MSSQL
- build
- JavaScript
- ChatGPT
- sample
- 엘라스틱서치
- Windows
- elasticsearch
- JS
- docker
- API
- AWS
- Python
- unity
- mariadb
- MySQL
- error
- Ai
- s3
- nodejs
- Kibana
- logstash
- ssh
- Today
- Total
가끔 보자, 하늘.
elasticsearch-js로 인데스가 존재하는지 확인하는 방법 본문
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는 부디 안전하길... ㅠ_ㅜ
'개발 이야기 > 개발 및 서비스' 카테고리의 다른 글
OpenSSL을 이용해 사설 인증서 생성과 사용 방법(간략 정리) (0) | 2021.07.02 |
---|---|
Elasticsearch daily snapshot 예제 코드 (0) | 2021.06.29 |
Nodejs 로 현재 환율 정보 확인 코드 만들기 (0) | 2021.04.06 |
AWS SDK(cpp/c#/js) - Kinesis에 데이터 전송하고 Logstash로 받기 (0) | 2021.04.01 |
최적화 관련 몇 가지 (0) | 2020.07.09 |