—
시작하며
안녕하세요. 아이나비시스템즈에서 검색엔진을 담당하고 있는 석정재입니다. 이번 글에서 오픈서치(OpenSearch) 기반의 검색엔진을 개발하고 운영하면서 경험했던 이슈를 공유하고자 합니다.
이슈
아이나비시스템즈의 검색엔진은 2022년에 오픈서치 기반으로 새롭게 개발되었습니다. 새롭게 개발된 오픈서치 기반의 검색엔진은 점차 여러 서비스에 사용되면서 다음과 같은 데이터 인덱싱 관련 이슈가 생겼습니다.
: 여러 서비스에서 사용되는 오픈서치 클러스터가 많아지면서, 각 클러스터에 데이터를 인덱싱하는 작업이 복잡해집니다.
: 서비스 중인 클러스터에 대량의 데이터를 인덱싱하거나 포스머지(Forcemerge)를 수행하는 경우, 클러스터에 큰 부하가 발생하여 성능이 저하되는 문제가 발생합니다.
기존에는 서비스에 사용되는 오픈서치 클러스터가 하나뿐이었기 때문에, 대량의 데이터를 인덱싱해야 하는 경우 예비 클러스터에 데이터를 먼저 인덱싱한 후, 기존 클러스터와 교체하는 방식으로 운영했습니다. 서비스 중인 오픈서치 클러스터에 대량의 데이터 인덱싱과 포스머지는 부하가 너무 크다고 판단했기 때문입니다.
하지만, 여러 서비스에 걸쳐 오픈서치 클러스터가 추가됨에 따라 기존의 운영 방식을 더 이상 유지할 수 없었습니다. 기존 방식을 유지할 경우, n*2개의 오픈 서치 클러스터를 유지해야 하고 데이터 인덱싱과 포스머지를 n번 수행해야 해 운영 비용이 크게 증가하는 상황이었습니다.
이에 따라, 위의 두 가지 주요 이슈를 해결하여 운영 비용을 절감하고자 했습니다. 먼저, 다수의 오픈서치 클러스터에 동일한 데이터를 효율적으로 인덱싱해 소요 시간을 단축하고자 했고, 서비스 중인 오픈서치 클러스터에 대량의 데이터를 인덱싱하여 필요한 클러스터 수를 줄이고자 했습니다.
해결방안
이슈를 해결하기 위해 먼저 오픈서치의 기능 중 활용할 수 있는 기능을 확인해 보았고, 그 중 오픈서치의 CCR(Cross-cluster replication) 기능을 찾게 되었습니다.
먼저 CCR이 무엇인지 간단하게 살펴보겠습니다.
CCR은 오픈서치 클러스터 간의 인덱스를 복제하는 기능입니다. 이는 리인덱싱과는 다른 개념으로, CCR은 팔로워 인덱스(복제본)가 리더 인덱스(원본)를 끌어가는(Pull) 방식으로 동작합니다. CCR은 팔로워 인덱스와 리더 인덱스 간의 동기화 기능을 제공합니다. 팔로워 인덱스가 리더 인덱스의 변경 사항을 지속적으로 반영할 수 있도록 하며, 동기화 상태를 유지하면 팔로워 인덱스는 리더 인덱스의 변경을 실시간으로 동기화할 수 있습니다. 그러나, 동기화 상태의 팔로워 인덱스는 읽기 전용으로, 개별적인 변경이 불가능합니다. 즉, 인덱스의 설정, 매핑, 문서의 변경 등이 불가능합니다.
CCR의 동작은 인덱스 단위로 복제하는 것처럼 보이지만, 실제로는 인덱스의 샤드 단위로 복제가 이루어집니다. 리더 인덱스의 문서 생성, 수정, 삭제와 같은 변경 사항은 샤드 단위로 복제되며, 초기 팔로워 인덱스 복제 시에는 리더 인덱스의 프라이머리 샤드를 팔로워에 리커버리하는 방식으로 동작합니다. 샤드의 세그먼트 파일들이 전송되고 전송이 완료되면 샤드를 활성화하는 식으로 동작합니다.
이러한 CCR 기능을 활용하면 데이터 인덱싱 효율을 높이고 운영 비용을 절감할 수 있을 것이라 예상했습니다.
이제 CCR을 활용해 데이터 인덱싱 및 클러스터 관리 문제를 어떻게 해결하고자 했는지 자세히 살펴보겠습니다.
CCR에서 가장 주목할 만한 점은 초기 팔로워 인덱스 복제 시 리더 인덱스의 프라이머리 샤드를 팔로워에 리커버리 하는 방식으로 동작한다는 것입니다. 리커버리 동작은 샤드의 세그먼트 파일들을 전송하여 사용하기 때문에, 세그먼트가 유지됩니다. 따라서 데이터 인덱싱과 포스머지를 여러 오픈서치 클러스터에 각각 수행할 필요가 없습니다. 데이터 인덱싱과 포스머지를 클러스터 수에 상관없이 한 번만 수행하면 되므로, 작업의 효율성을 크게 향상시킬 수 있습니다.
물론, 복제는 클러스터 수만큼 수행해야 하지만, 인덱싱과 포스머지에 비해 소요 시간과 부하가 훨씬 적습니다. 따라서 서비스 중에도 복제를 수행할 수 있다고 판단했으며, 이는 시스템의 안정성과 성능을 동시에 향상시키는 효과를 가져옵니다.
개선
이처럼, 아이나비시스템즈는 CCR을 활용하여 데이터 인덱싱 및 클러스터 관리 프로세스를 개선했습니다. 기존에는 예비 오픈서치 클러스터에 데이터 인덱싱과 포스머지를 수행했으나, 현재는 메인 오픈서치 클러스터를 추가하여 데이터 인덱싱과 포스머지를 한 번만 수행하고, 이후 서비스에 사용되는 오픈서치 클러스터에 메인 오픈서치 클러스터의 인덱스를 복제하는 방식으로 전환하였습니다.
이러한 개선을 통해 오픈서치 클러스터 수를 약 30% 줄일 수 있었으며, 데이터 인덱싱에 소요되는 시간을 약 60% 단축할 수 있었습니다. 이를 통해 운영 비용 절감과 시스템 성능 향상에 크게 기여할 수 있었음은 물론입니다.
또한, CCR을 통해 데이터 인덱싱과 포스머지 작업을 효율화함으로써, 서비스 중인 오픈서치 클러스터에 대한 부하를 최소화하고 안정성을 높였습니다. 개선 시도를 통해 사용자 경험과 서비스 신뢰성 강화 성과를 이루었습니다.
마치며
이 글을 작성하면서 당시 상황을 회고해 보는 귀중한 시간을 가졌습니다. 저의 경험이 이 글을 읽는 분들의 오픈서치 클러스터의 데이터 인덱싱 및 클러스터 관리에 대한 이해를 높이는 데 도움이 되었기를 바랍니다. 감사합니다.
—
by 아이나비시스템즈 선행기술Lab Dev.1팀 석정재
#CCR #오픈서치 #오픈서치클러스터 #데이터인덱싱 #지도데이터 #지도 #내비게이션 #아이나비지도 #아이나비시스템즈