고가용성 Redis 아키텍쳐와, Redis GUI RedisInsight
Redis
Redis는 “Remote Dictionary Server”의 약자로, 오픈소스 인메모리 데이터 구조저장소입니다. 2009년 Salvatore Sanfilippo에 의해 처음 개발되었습니다. Redis는 데이터를 메모리에 저장하여 매우 빠른 읽기 및 쓰기 성능을 자랑합니다. 또한, 다양한 데이터 유형에 매핑되는 키를 저장할 수 있습니다.
인메모리 데이터 구조 저장소
인메모리 데이터 구조 저장소라는 것은 데이터를 메모리에 저장하는 방식을 말합니다. 컴퓨터 용어 중 RAM, HDD, SDD와 같은 용어를 들어보셨을 것입니다. RAM(Random Access Memory)이 메모리를 뜻하며, HDD(Hard Disk Drive), SDD(Solid State Drive)는 디스크입니다.
메모리에 저장하면 왜 더 빠른가?
메모리에 데이터를 저장하면 왜 더 빠를까요? 그것을 이해하기 위해서는 컴퓨터 시스템의 구조를 이해해야 합니다. 메모리는 CPU와의 전기적인 신호를 이용한 통신으로 빠른 데이터 처리가 가능하지만, 디스크는 물리적인 읽기/쓰기 작업이 필요합니다. 따라서 메모리가 읽기/쓰기 작업이 디스크와 비교하면 상대적으로 더 빠릅니다.
다양한 데이터 구조 지원
Redis는 기본적으로 String에서부터, Hash, List, Set, Sorted Sets 등 다양한 데이터 구조를 지원합니다. 이는 데이터를 효율적으로 관리하고 처리할 수 있는 유연성을 제공합니다.
Redis의 단점과 보완법
Redis는 휘발성 저장소인 메모리를 사용하다 보니, 예기치 못한 상황이 발생했을 시 데이터를 유실할 수 있다는 단점이 있습니다. 따라서 Redis 자체에서 데이터를 잃어버리지 않도록 하는 영구보관 기능을 제공하며, 고가용성(HA: High Availability)의 무중단 서비스를 구성하는 방법이 존재합니다. 아래에선 이러한 내용을 더욱 다룹니다.
고가용성의 Redis Architecture
Redis를 사용하며 데이터유실을 최소화 하는 방법으로 먼저 RDB와 AOF를 이용한 백업 방법에 대해 설명합니다.
RDB(Snapshot)을 이용
RDB를 이용하는 백업 방법은 특정 시점에 주 메모리에 있는 모든 Redis 데이터를 Disk에 쓰는 작업입니다. 백업 파일명이 dump.rdb 이기 때문에, RDB라고 부르며 Snapshot을 찍는 기능과 같습니다.
저장 조건을 설정해서 특정 조건이 되면 데이터를 디스크에 기록하게 설정할 수 있습니다. 디스크에 저장해 놓았다가, Redis에 데이터를 복원해야 할 때 디스크로부터 불러와서 복원할 수 있습니다.
AOF(Append Only File)를 이용
연산 중, 조회 연산을 제외한(SET, DEL, INCR 등) 연산이 일어날 때마다 AOF파일에 연산 내역을 쌓는 방식입니다. 예기치 못한 장애 발생 시, Redis 복원이 필요할 때 AOF파일을 읽어서 순차적으로 연산을 재실행해서 DB를 원 상태로 복원합니다.
디스크에 기록하는 시점을 다음 3가지 설정에 따라 변경할 수 있습니다. 성능적으로 가장 베스트인 것은 everysec 기록 방법입니다.
모든 연산마다 기록 (always)
매 초마다 기록 (everysec)
OS(리눅스)가 디스크에 기록 (no)
Redis 서버를 1대만 두어 구성하는 것을 Standalone, 마스터 방식이라고 합니다. 이 경우 마스터 노드가 다운되면 모든 데이터가 유실되는데, 이 때 AOF 또는 RDB 파일을 이용해 복원하고 재시작합니다.
이중화 구성: Master-Slave(Replication)
위와 같은 RDB, AOF 방식의 백업은 완전히 Redis 데이터가 유실되었을 때 복원하기에 적합합니다. 데이터가 유실되지 않도록 고가용성의 무중단 서비스를 하기 위한 Redis 구축 방법으로 Master-Slave 가 있습니다.
총 2대의 서버로 구성되어, Slave는 Master의 데이터를 실시간으로 복사합니다. 서버가 2대이므로, 예상이 가시겠지만 Master가 죽으면 Slave가 Master의 역할을 대신하게 됩니다.
꼭 Master에 1대의 Slave만 존재할 필요는 없고, 여러 Slave를 두어도 됩니다. 또한, Slave에 Slave를 둘 수도 있습니다. 이러한 방식을 Master-Slave이라고 하며 이 방식은 자동으로 Slave가 Master로 승격되지 않습니다. Redis가 지원하는 모니터링 도구를 통해 자동 승격을 하게끔 구성한 것이 바로 Sentinel입니다.
이중화 구성: Sentinel
Master-Slave구성에서 Sentinel을 추가해서 Master 노드를 감시합니다. 감시하는 도중 Master가 다운되었을 때 Slave가 Master로 자동 전환이 됩니다.
일반적으로 Sentinel은 3대를 두고 기동합니다. 이것은 Sentinel 자체가 다운되었을 때를 대비해서 여러 대를 두는 것입니다. 또한, Master 아래에 Slave가 여러 대일 때 어떤 Slave가 Master로 승격될 것인지 Sentinel들이 투표해서 결정합니다. 따라서 홀수 개로 Sentinel을 구성하는 것이 바람직합니다.
Redis Cluster 구성
Cluster 구성을 위해서 Matser가 최소 3노드 이상 필요합니다. 각각의 Master은 1개 이상의 Slave를 가져야 합니다. 아래와 같은 구성으로, 일부가 다운되더라도 무중단 운영이 가능합니다.
또한, Redis Cluster 구성은 샤딩(Sharding)을 사용합니다. 샤딩은 대량의 데이터를 수월하게 처리하기 위해 여러 개의 데이터베이스에 분할하는 기술입니다. 샤딩을 하면, Shard수 만큼 노드가 존재하며 Redis서버가 여러 대 존재하므로 부하를 적절히 분산할 수 있다는 이점이 있습니다.
그 방식은 다음과 같습니다.
3개의 Master 노드가 존재할 때 전체 데이터의 1/3 만큼씩을 나누어 저장합니다.
데이터를 hash 함수에 적용하여 값을 추출하고, 이 값을 각 마스터 서버에 할당합니다.
여기서 Hash 슬롯 개수는 0~16,383 총16,384개이고, Master1,2,3 이 각각 1/3씩 슬롯을 나누어 가집니다.
Redis GUI : RedisInsight
RedisInsight는 Redis Labs에서 제공하는 무료 Redis GUI 툴입니다. 여러 기능을 통해 Redis 데이터를 관리하는 데에 도움을 줍니다. 특별히 유용하게 사용하는 기능은 실시간 서버 Metric 정보를 확인할 수 있는 점과, 특정 key값을 조회하고 update, delete, refresh 할 수 있는 기능입니다.
RedisInsight를 설치하며 설정한 host경로로 진입하면 위와 같이 화면이 뜹니다. 최근 RedisInsight는 GUI가 위 화면과 차이가 있는 것 같은데, 그 이유는 버전차이가 아닐까 싶습니다. 현재 사용 중인 버전은 1.14.0 버전이며, 위 사진의 상단 바에 나타나 있듯이 EOL이 도래하여 조만간 업데이트할 필요가 있을 것 같습니다.
참고로 RedisInsight를 설치할 때 redis.io 공식 홈페이지에서 제공하는 이미지를 사용하였습니다.
가장 처음 페이지에 입장하면 연결된 Redis 정보가 없을 것입니다. ADD REDIS DATABASE를 클릭하여 DB정보를 입력해서 연결합니다.
정보를 정확히 입력하면 목록에 DB명과 IP:Port가 표시됩니다. 클릭해서 들어가면 Redis 서버들의 Metric정보를 한눈에 확인할 수 있습니다. Shard의 개수, Slot 범위, Master와 엮여있는 Slave의 IP와 Port를 확인 가능합니다.
Browser 탭에서는 Key명으로 검색하여 실제 저장된 데이터값을 확인할 수 있습니다. 오른쪽 연필 그림과, X버튼으로 Value를 수정하거나 지울 수 있습니다. 오른쪽 상단에는 Key값의 새로고침, 추가, 삭제 버튼을 확인할 수 있습니다. 직접 CLI 쿼리를 작성하지 않아도 GUI상에서 데이터 조작이 가능합니다. Browser 아래 CLI 탭에서는 Terminal이 보이며, 쿼리로 명령도 가능합니다.
그 외에도 Cluster Management 탭에서 Slave를 Master로 수동 승격시키는 기능, Master에 연결된 Slave 변경하는 기능, 노드 kill 기능, Hash slot 할당 퍼센테이지 변경 기능 등 설정을 변경할 수 있는 공간도 존재합니다. 하지만 명확한 의도 없이 이러한 값을 변경하지는 않는 것이 좋아 보입니다.
마치며
오늘날 수많은 서비스와 개발자들이 시스템의 성능 향상을 위해 Redis를 이용하고 있을 것입니다. Redis가 오픈소스로 제공된 것은 현대 소프트웨어 개발 생태계에 큰 축복이라고 생각합니다. 이 강력한 인메모리 데이터 구조 저장소의 공개로 인해, 오늘날 수많은 서비스들이 놀라운 성능 향상을 경험하고 있습니다.
Redis의 빠른 응답 시간과 유연한 데이터 구조는 다양한 규모의 애플리케이션에서 활용되고 있으며, 이는 전반적인 사용자 경험 개선으로 이어지고 있습니다. 캐싱, 세션 관리, 실시간 분석 등 여러 영역에서 Redis의 적용은 시스템의 효율성을 크게 높이고 있습니다.
Redis의 유용성은 그 자체로도 대단하지만, Redis Labs에서 제공하는 GUI 도구인 RedisInsight를 통해 더욱 빛을 발합니다. 이 도구는 위에서 설명했듯이 Redis를 더욱 접근하기 쉽고 효율적으로 만들어주는 중요한 역할을 합니다. 직관적인 데이터 조작과, 편리한 모니터링 기능은 잠재적인 문제를 사전에 파악하고, 조치를 수월하게 만들어줍니다.
이만큼 강력한 잠재력을 많이 지닌 Redis를 많은 서비스에서 사용하고 있을 것으로 생각합니다. Redis의 진정한 잠재력을 발휘하기 위해서는 이 기술에 대한 깊이 있는 이해를 바탕으로 응용하는 것이 필요할 것으로 생각하여 본 글을 작성하였습니다.
지금까지 읽어주셔서 감사합니다.