Redis를 위한 전문(full-text) 검색 기능을 갖춘 실시간 보조 인덱스인 RediSearch는 Redis 모듈 중 가장 성숙하고 기능이 풍부한 제품 중 하나입니다. 그 인기는 나날이 높아지고 있어, 최근 몇 달간 RediSearch Docker 이미지 다운로드 수가 무려 500%나 급증했습니다. 이러한 폭발적인 관심 덕분에 고객들은 실시간 재고 관리부터 임시(ephemeral) 검색에 이르기까지 다양하고 흥미로운 활용 사례를 만들어내고 있습니다.
이러한 흐름을 한 단계 더 발전시키기 위해, 저희는 개발자 경험을 개선하고 가장 뛰어난 확장성을 제공하는 버전을 목표로 설계된 RediSearch 2.0의 공개 프리뷰(public preview)를 선보입니다. RediSearch 2.0은 Redis의 Active-Active 지리적 분산(geo-distribution) 기술을 지원하며, 가동 중단 없이 확장할 수 있고, Redis on Flash 지원도 포함합니다(현재 비공개 프리뷰 진행 중). 이러한 목표를 성능 저하 없이 달성하기 위해 저희는 RediSearch 2.0을 위한 완전히 새로운 아키텍처를 만들었고, 그 결과물은 성공적이었습니다. RediSearch 2.0은 RediSearch 1.6보다 2.4배 빠릅니다.
RediSearch 2.0의 새로운 아키텍처 들여다보기
Redis 데이터베이스 안에 강력한 쿼리 및 집계 엔진을 갖추면 캐싱을 넘어선 폭넓은 새로운 사용 사례를 구현할 수 있습니다. RediSearch를 사용하면 복잡한 쿼리로 데이터에 접근해야 하는 상황에서도 Redis를 기본 데이터베이스로 활용할 수 있습니다. 더욱이 Redis 특유의 세계 최고 수준의 속도, 안정성, 확장성은 그대로 유지되며, 데이터를 업데이트하고 인덱싱하기 위해 코드에 복잡성을 추가할 필요도 없습니다.
RediSearch 2.0에서는 인덱스와 데이터를 동기화하는 방식을 완전히 새롭게 재설계했습니다. 기존에는 FT.ADD 명령을 통해 인덱스를 경유해 데이터를 작성해야 했지만, 이제 RediSearch는 해시(Hash)에 기록된 데이터를 추적하여 동기적으로 인덱싱합니다. 이러한 재설계에는 API 변경 사항이 여럿 포함되어 있으며, 이는 RediSearch 2.0 첫 번째 마일스톤 소식을 전하면서 이전 게시물에서 다룬 바 있습니다.
새로운 아키텍처가 가져오는 핵심 이점은 두 가지입니다. 첫째, 기존 데이터 위에 보조 인덱스를 생성하는 것이 그 어느 때보다 쉬워졌습니다. 기존 Redis 데이터베이스에 RediSearch를 추가하고, 인덱스를 생성한 뒤, 바로 쿼리를 시작하기만 하면 됩니다. 데이터 마이그레이션이나 인덱스용 별도 데이터 입력 명령이 필요하지 않습니다. 이는 신규 사용자의 학습 곡선을 크게 낮춰주며, 심지어 Redis 데이터베이스를 재시작하지 않고도 기존 데이터베이스에 인덱스를 만들 수 있게 해줍니다.
둘째, 새로운 인덱싱 방식을 도입함과 동시에 인덱스를 키스페이스(keyspace) 밖으로 옮겼습니다. 이를 통해 충돌 없는 복제 데이터 타입(CRDT)에 기반한 Redis Enterprise의 Active-Active 기술을 활용할 수 있게 되었습니다. 두 개의 역방향 인덱스(inverted index)를 충돌 없이 병합하는 것은 매우 어렵지만, Redis는 이미 Hash에 대해 검증된 CRDT 구현체를 갖추고 있습니다. 따라서 새로운 아키텍처의 두 번째 큰 이점은 RediSearch 2.0의 확장성을 한층 더 끌어올렸다는 점입니다. RediSearch가 이제 Hash를 추적하고 인덱스가 키스페이스 밖으로 이동했기 때문에, Active-Active 지리 분산 데이터베이스 환경에서도 RediSearch를 실행할 수 있습니다.
문서는 강력한 결과적 일관성(strong eventual consistency) 방식으로 복제 세트 내 모든 데이터베이스에 복제됩니다. 각 복제본에서 RediSearch는 Hash에 대한 모든 업데이트를 단순히 추적하기만 하면 되므로, 모든 인덱스 역시 강력한 결과적 일관성을 유지하게 됩니다.
오픈소스 Redis를 위한 OSS 클러스터 지원
저희는 확장성 향상을 Redis Enterprise 사용자에게만 국한하고 싶지 않았습니다. 그래서 오픈소스 Redis 클러스터 API를 통해 단일 인덱스를 여러 샤드(shard)에 걸쳐 확장하는 기능을 추가했습니다. 이전에는 단일 RediSearch 인덱스와 그 문서들이 반드시 하나의 샤드에만 존재해야 했습니다. 즉, OSS Redis의 데이터셋 크기와 처리량은 단일 Redis 프로세스가 감당할 수 있는 범위에 묶여 있었습니다. 반면 Redis Enterprise는 클러스터형 데이터베이스에서 문서를 분산 저장하고 쿼리 시점에 결과를 취합하는 기능을 제공해 왔습니다. 이러한 팬아웃(fan-out)과 집계는 '코디네이터(coordinator)'라 불리는 컴포넌트가 담당하며, 이제 이 코디네이터가 Redis Source Available License로 공개되어 오픈소스 Redis 클러스터와 Redis Enterprise 양쪽에서 모두 동작합니다. 그 결과, 지금까지 가장 확장성 높은 RediSearch가 탄생했습니다.
숫자로 확인하는 성능
RediSearch 2.0의 데이터 적재(ingestion) 성능을 평가하기 위해, 저희는 전문 검색 벤치마크(FTSB) 스위트에 공개된 NYC Taxi 데이터셋을 추가했습니다. 이 데이터셋은 텍스트, 태그, 지리, 숫자 등 풍부한 데이터 타입과 방대한 문서 수를 갖추고 있어 업계 전반에서 널리 사용됩니다.
이 벤치마크는 쓰기 성능에 초점을 맞추었으며, 뉴욕의 옐로우캡 운행 기록 데이터를 사용합니다. 구체적으로 이번 벤치마크에는 2015년 1월 데이터셋을 사용했으며, 문서당 평균 500바이트 크기의 문서 1,200만 건 이상을 로드합니다. 전체 벤치마크 사양은 GitHub의 FTSB 문서를 참고하시기 바랍니다.
모든 벤치마크 변형 실험은 저희 벤치마크 테스트 인프라를 통해 프로비저닝한 Amazon Web Services 인스턴스에서 수행되었습니다. 테스트는 RediSearch Enterprise 1.6 및 2.0 버전을 탑재한 3노드 클러스터(15개 샤드)에서 진행되었으며, 벤치마크 클라이언트와 RediSearch가 활성화된 데이터베이스 노드 3대는 서로 다른 c5.9xlarge 인스턴스에서 각각 구동되었습니다.
RediSearch 2.0은 Redis Hash의 변경 사항을 추적해 자동으로 인덱싱하는 기능을 갖추고 있으므로, FT.ADD와 HSET 명령에 대한 변형 테스트도 함께 추가했습니다. 업그레이드를 용이하게 하기 위해, 이제 사용이 중단(deprecated)된 FT.ADD 명령은 RediSearch 2.0에서 HSET 명령으로 매핑됩니다. 아래 두 차트는 밀리초 미만의 지연 시간을 유지하면서 RediSearch 1.6과 2.0의 전체 적재 처리율과 지연 시간을 보여줍니다.
RediSearch는 늘 빠른 속도를 자랑해 왔지만, 이번 아키텍처 변경을 통해 초당 9만 6천 건이던 인덱싱 속도를 초당 13만 2천 건으로 끌어올렸고, 전체 p50 적재 지연 시간은 0.4ms를 기록하며 쓰기 확장성을 획기적으로 개선했습니다.
처리량 향상의 혜택뿐 아니라 개별 적재 작업 자체도 더 빨라졌습니다. 아키텍처 변경에 따른 전반적인 적재 성능 개선에 더해, 이제 OSS Redis Cluster API 기능을 활용해 검색 데이터베이스의 적재 작업을 선형적으로 확장할 수도 있습니다.
처리량과 지연 시간 개선을 종합하면, RediSearch 2.0은 RediSearch 1.6 대비 최대 2.4배의 속도 향상을 제공합니다.
RediSearch 2.0의 다음 계획
정리하자면, RediSearch 2.0은 지금까지 출시된 버전 중 모든 Redis 사용자에게 가장 빠르고 확장성 높은 버전입니다. 또한 새로운 아키텍처는 Redis 내 기존 데이터를 위한 인덱스를 매끄럽게 생성할 수 있는 개발자 경험을 개선하며, Redis 데이터를 별도의 RediSearch 지원 데이터베이스로 마이그레이션할 필요성을 없앴습니다. 이 새로운 아키텍처 덕분에 RediSearch는 Streams나 Strings 같은 다른 데이터 구조도 추적하여 자동 인덱싱할 수 있게 되었습니다. 향후 릴리스에서는 RedisJSON의 중첩 데이터 구조 같은 추가 데이터 구조도 지원할 예정입니다.
저희는 개발자 경험을 한층 더 강화하기 위해 지속적으로 기능을 추가할 계획입니다. 다음으로는 검색 쿼리를 프로파일링하여 쿼리 실행 과정에서 성능 병목이 발생하는 지점을 파악할 수 있는 새로운 명령이 추가될 예정이니 기대해 주세요.
바로 시작해 볼 준비가 되셨나요? Tug Grall의 블로그 'Getting Started with RediSearch 2.0'을 확인해 보세요. GitHub의 튜토리얼 단계를 따라 하거나, Redis Enterprise Cloud Essentials에서 무료 데이터베이스를 생성할 수도 있습니다. (참고로 RediSearch 2.0 공개 프리뷰는 Redis Enterprise Cloud Essentials의 뭄바이와 오리건 리전에서 이용 가능합니다.)