티스토리 뷰
이전에 나는 면접에서 'Redis를 캐시로 사용했을 때, Redis가 멈출 수도 있는데 어떻게 대처하겠는가?'에 대한 질문을 받은 적이 있었다. 이 질문은 장애 대처 능력에 대해 물어본 것인데, 지식이 부족해 죄송합니다를 연발했던 기억이 난다. 이 문제를 해결하려면 Redis의 HA를 구성하는 방법에 대해 알아야 한다.
간단하게 위와같이 서비스를 구축하게 된다면, Redis가 고장 났을 때 서비스에도 영향을 줄 수밖에 없다. 하지만, Redis를 여러 개 띄우고, 하나의 Redis처럼 사용할 수 있다면 문제를 해결할 수 있을 것이다.
Redis의 HA(고가용성)을 구성하는 방법은 크게 Sentinel과 Cluster, 2가지가 존재한다. 이번에는 이 두 가지 방식을 비교하는 글을 작성해보려고 한다.
Redis Sentinel
운영환경에서 레디스는 일반적으로 Master와 Slave로 구성된다. 그리고 서비스 운영 중 Master가 다운되었다면 이를 감지해서 Slave를 마스터로 올리고 클라이언트들이 새로운 Master에 접속할 수 있도록 해 주어야 한다. Sentinel은 Mater와 Slave를 감시하고 있다가 Master가 다운되면 이를 감지해서 관리자의 개입 없이 자동으로 Slave를 Master로 올려주는 기법이다.
Sentinel의 주요 기능은 크게 3가지가 존재한다.
- 모니터링 : Master Node와 Slave Node에 문제가 없는지 확인하는 기능
- Fail Over : Master Node에 문제가 생길 경우 새로운 Master Node를 선정하는 기능
- 알림 : 문제가 생길 경우 알림을 전송하는 기능
Redis Sentinel 구성시에는 반드시 따라야 하는 원칙이 한 가지 있다. 바로 Sentinel Node의 개수를 3개 이상의 홀수개의 인스턴스를 구성해야 한다는 것이다. 이는 Sentinel의 Fail Over가 과반수 이상의 Sentinel Node에서 Master Node에 장애가 발생했다고 판단했을 때 수행되기 때문인데, 하나의 Sentinel Node의 오류로 Slave Node가 Master Node로 승격되는 문제를 방지할 수 있다.
Redis Cluster란?
저장 장치를 여러개 동시에 사용하고 마치 하나의 저장소처럼 사용하는 방법이 'Cluster'이다. 동시에 여러개의 서버가 멈출 가능성은 낮기에 'HA(고가용성)'를 제공할 수 있으며, 여러 대의 서버에 데이터가 분산되어 저장되므로 트래픽이 분산되는 효과도 얻을 수 있다. 가장 큰 이점은 특정 서버에 장애가 일어나더라도 백업 서버의 보완을 통해 데이터의 유실 없이 서비스를 계속 이어나갈 수 있다는 점이다.
Redis Cluster는 Sentinel처럼 Fail Over를 지원하고, Data Sharding까지 지원한다.
이때 Sharding은 Master 단위로 수행하기에 Master당 최소 하나의 Slave가 존재하지 않는다면 데이터 유실이 발생할 수 있다.
Sentinel vs Cluster
그러면, 어떤 기법을 사용하는 것이 좋을까?
위에서 살펴본 개념만으로는 Cluster가 Sentinel보다 상대적으로 더 안정적으로 보인다. 데이터 샤딩을 지원하기 때문에 트래픽을 분산해 처리할 수 있다는 장점이 있다.
하지만, 큰 트래픽이 없다면 Cluster는 오버 엔지니어링이 될 가능성이 있다. 따라서 상대적으로 작은 서비스에서는 Sentinel이 좋을 것이고, 대규모 환경에서는 Cluster가 서비스를 안정적으로 유지할 수 있는 기법이라고 보인다.
Ref :
'BackEnd > Redis' 카테고리의 다른 글
[Redis] Redis Sentinel 구성하기 (0) | 2023.01.07 |
---|
- Total
- Today
- Yesterday
- effective
- Effective Java
- GORM
- 공지
- spring
- go
- fiber
- java
- paging
- algorithm
- mmu
- soft delete
- ARP
- network
- Database
- cs
- Operating System
- OS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |