Redis의 개념과 Redis에서 고가용성(High Availability)를 확보하는 방법
레디스(Redis)의 개념
Remote Dictionary Server의 줄임말로, key-value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 NoSQL DB다. 타 DB처럼 디스크에 데이터를 저장하는게 아닌 메모리에 데이터를 저장하는 인-메모리 DB이며, 메모리를 통한 빠른 속도 때문에 Cache 용도로 많이 활용되지만 그 외에도 Message Broker나 Streaming engine으로서의 역할도 맡을 수 있다.
Message broker로 쓰인다는 것의 의미 : 분산 시스템에서 메시지 전달 및 이벤트 처리를 관리하기 위한 중요한 역할을 하는 소프트웨어 컴포넌트로 활용된다는 것
Streaming engine로 쓰인다는 것의 의미 : 스트림(Streams)라고 불리는 자료 구조를 활용해 실시간 데이터 처리를 위한 목적으로 활용된다는 것
레디스에서 고가용성을 확보하는 방법
1. Stand alone (No HA)
Redis 서버 1대로 아키텍처를 구성하는 방법을 말하며, 해당 서버가 다운되면 인생 끝나는 것이므로 고가용성이 보장되지 않는다. 서버가 다운될 시 AOF 또는 snapshot을 사용해 재시작한다.
AOF : Append Only File의 줄임말로, Redis의 변경 사항을 기록하는 파일을 말한다. Redis 서버에 새로운 명령(조회는 제외)이나 데이터 변경이 발생하면, 해당 명령 또는 변경 내용을 AOF 파일에 연속적으로 추가한다. 이는 변경 사항을 로그로 남기는 방식이다.
snapshot : 특정 시점에 메인 메모리에 있는 모든 레디스 데이터를 디스크에 쓴 것, 즉 일종의 백업을 말한다.
2. 이중화 (a.k.a Master & Slave, Half HA)
Redis 서버 2대로 아키텍처를 구성하는 것을 말하며, Slave는 Master의 데이터를 실시간으로 전달받아 보관한다. Master가 다운될 시 Slave를 FailOver시킬 수 있으나 수동으로 직접 해줘야 한다. Slave를 하나가 아닌 여러 개를 둘 수도 있다.
3. 이중화 + 센티널 (HA, 무중단 서비스 가능)
Master & Slave 구성에 센티널(Sentinal)을 추가해서 각 서버를 감시하도록 하도록 하는 아키텍처를 구성하는 것을 말한다. 센티널은 Master를 감시하고 있다가 Master가 다운되면 Slave를 Master로 승격시킨다. Redis Client(즉 Application)은 새로운 Master로 접속해서 서비스를 계속한다. 센티널은 데이터 처리는 담당하지 않으며, 센티널 자체가 다운되는 상황을 고려해 일반적으로 3대의 센티널을 운용한다.
센티널이란 : Master와 Slave들을 감시하고 있다가 Master가 다운되면 이를 감지해서 관리자의 개입없이 자동으로 Slave를 Master로 올려주는 감시자(보초)를 말한다. 즉 센티널은 감시, 자동 장애조치(Automatic FailOver)의 역할을 하며 알림(FailOver될 때 관리자한테 메일 보내던가 하는..)의 역할도 맡을 수 있다.
4. 레디스 클러스터 (HA)
샤딩(sharding)을 사용하여 복수의 Redis노드에 데이터를 분할하는 방식으로 아키텍처를 구성하는 것을 말한다. Master가 3대라면, 전체 데이터를 3대에 나누어 저장하는 것이다. (100개가 있다면 1번에 33, 2번에 33, 3번에 34개 이런 식으로). 데이터들의 key에 hash함수를 멕인 값에 따라 어느 Master 서버로 데이터를 둘지 결정하게 된다. 각 Master 서버가 데이터 처리 뿐만 아니라 센티널 역할도 같이 수행하며, 최소 3대의 Master 서버가 필요하다.
샤딩을 통해 데이터들을 분할해서 각 Master 서버에 저장하기 때문에 하나의 서버라도 다운되면 데이터 유실이 생기지 않을까라는 생각을 할 수 있으나, 위 그럼처럼 클러스터를 구성하면 아무리 Master들이 다운되도 하나의 서버만 살아있다면 정상적인 운용이 가능하다.
클러스터 방식을 통해 여러 대의 서버가 하나로 묶여 마치 1개의 시스템처럼 동작하게 되며, 여러 서버에 데이터를 분산하여 저장하기 때문에 부하를 여러 대의 서버로 분산시키므로 더 빠른 속도로 사용자에게 서비스를 제공할 수 있게 된다.
샤딩(Sharding)이란 : 대량의 데이터를 처리하기 위해 여러 개의 데이터베이스에 분할하는 기술 즉 DBMS안에서 데이터를 나누는 것이 아니라 DBMS 밖에서 데이터를 나누는 방식임에 유의하자.
클러스터 vs 센티널
우선 둘 다 고가용성을 챙길 수 있다. 그러나 클러스터는 확장성이 있는 반면, 센티널은 확장성이 없는 아키텍처다. 또한 클러스터는 센티널에 비해 빠른 액세스 속도를 보일 수 있다. 반면 센티널은 클러스터에 비해 배포 및 관리가 용이하다. 따라서, 일반적으로 중소 정도의 규모라면 센티널을, 수평적 확장이 필요한 대규모의 경우는 클러스터를 추천한다고 한다.
참고한 자료
http://redisgate.kr/redis/configuration/redis_overview.php