Skip to content
isdnetworks
Go back

재초기화 뒤 전수 통과 확인

(수정됨)

OpenSearch 의 products 색인 자료가 깨져서 사백 건 남짓을 고치고 그 건들이 정상인 것만 확인한 뒤 끝냈다. 며칠 뒤 또 깨진 것이 나왔는데 처음에 고친 목록과는 전혀 다른 건들이었다.

Table of contents

Open Table of contents

문제 — 고친 것만 본 확인의 한계

처음부터 다시 만들고 전부 검사하니 이상한 것이 사백 건 넘게 나왔고 처음 고친 목록과 겹치는 것은 두 건뿐이었다. 같은 원인으로 깨진 것이 처음부터 훨씬 더 있었다는 뜻이다.

고친 것만 확인하면 안 고친 것을 볼 방법이 없다. 확인 범위가 수정 범위와 같으면 그 확인은 수정이 반영됐다는 사실만 알려 준다.

원인 — 검사를 먼저 만들었어야 했다

고치기 전에 전수 검사를 먼저 만들었어야 했는데 이번에는 순서가 반대였다. 검사가 있으면 고친 뒤에 돌려 0이 되는지 보면 되고 없으면 눈으로 몇 건 보고 끝낸다.

check-index.php 의 검사 항목은 name 누락과 price 형식 오류와 category_id 누락 세 가지로 잡았다. 항목을 명시해 두면 검사 결과를 이유별로 나눠 셀 수 있게 된다.

이유별 집계가 가리킨 한 곳

이유별로 세어 보니 price 형식 문제가 압도적이었고 나머지 둘은 소수에 그쳤다. 원본에서 "12,000" 같은 문자열로 온 값이 형변환 없이 그대로 _bulk 로 들어가고 있었다.

ProductDocument 한 곳에서 (float) 형변환을 넣으니 그 유형의 이상이 통째로 사라졌다. 전체 건수만 보면 사백 건이 흩어진 문제처럼 보이지만 이유별로 세면 한 곳이 대부분을 만든 것이 드러난다.

조치 — 정기 검사와 유입 차단

다시 만들고 검사해 이상이 0이 된 뒤에 그 검사를 crontab 으로 매일 새벽에 돌려 0이 아니면 알리게 했다. 며칠 뒤 새로 등록된 상품에서 같은 유형이 몇 건 잡혔다.

그래서 색인에 넣기 전에 같은 검증을 돌리고 통과하지 못하면 기록만 남기고 넣지 않게 했다. 들어오는 자리를 막고 나서는 같은 이상이 새로 생기지 않았다.

해결 — 다시 만드는 것과 바꾸는 것의 분리

전부 다시 만드는 동안 검색이 안 되는 문제가 있었는데 옛 색인을 먼저 지우고 새로 넣고 있었기 때문이다. 두 가지 방법이 있었는데 그대로 두고 새벽 시간에만 다시 만드는 것과 products_v2 를 따로 만들고 완성된 뒤에 _aliases 로 별칭만 바꾸는 것이다. 뒤쪽을 골랐다. 이유는 OpenSearch 공식 문서가 remove 와 add 를 한 요청에 담으면 원자적으로 바뀌어 별칭이 두 색인을 동시에 가리키는 순간이 없다고 설명해서다. 대신 다시 만드는 동안 색인 둘이 공존해 디스크를 두 배로 쓰는 것을 감수했다.

만드는 동안은 옛 색인이 서비스하고 교체는 순간에 끝나며 실패하면 새 색인만 버리면 된다. 다만 이 방식이 성립하는 것은 원본이 남아 있어 다시 만들 수 있는 자료이기 때문이라 로그나 결제 기록처럼 재생성이 불가능한 것은 같은 전략을 쓸 수 없다.

정리


Share this post on:

Previous Post
소스로 역추적한 주석의 뜻
Next Post
경유와 참조라는 두 질문