jowoohyeong / TIGENSOFT

0 stars 0 forks source link

22.12.29목<Redis 구조> #7

Open jowoohyeong opened 1 year ago

jowoohyeong commented 1 year ago

Redis 구조

1. Redis 접속

jowoohyeong commented 1 year ago

2. Redis 구조

img1 daumcdn

AOF는 데이터 유실이 발생하지 않지만, 매 명령어마다 File과 동기화가 필요하기 때문에 처리 속도가 현격히 줄어든다. 이를 해소하기 위해 File Sync옵션(appendfsync)이 존재하며, 해당 옵션에 따라 Sync주기를 조절할 수 있으나 그만큼 데이터 유실이 발생할 수 있다.

반면 RDB는 특정 시점의 메모리 내용을 복사하여 파일에 기록하는 방법으로 RDBMS Full Backup에 해당. 따라서, 정기적 혹은 비정기적으로 저장이 필요할 시점에 데이터 저장이 가능합니다.

RDB의 장점으로는 AOF에 비해 부하가 적으며, LZF 압축을 통해 파일 압축이 가능하다. 또한 덤프 파일을 그대로 메모리에 복원하므로 AOF에 비해 빠르다. 반면 덤프를 기록한 시점 이후 데이터는 저장되지 않으므로 복구 시에 데이터 유실이 발생할 수 있는 문제점이 있다. img1 daumcdn AOF와 RDB를 사용할 때는 유의해야 할 점 Copy On Write AOF를 백그라운드로 수행하거나 RDB를 수행할 때 Redis-server에서 자식 프로세스를 fork하여 처리를 위임한다. 만약 이 과정에서 redis-server의 데이터에 쓰기 작업을 수행한다면, 기존 페이지를 수정하는 것이 아닌 이를 별도 공간에 저장 후 처리한다. 따라서 해당 작업을 수행 도중에 쓰기 작업이 증가한다면, 메모리 사용량이 급격히 증가될 수 있으므로 유의해야 함. (최대 2배)

jowoohyeong commented 1 year ago

3. Redis 복제(Replication)

이번에는 Redis 복제에 대해서 알아보겠다. 먼저 복제가 필요한 이유 img1 daumcdn Redis는 충분히 빠르고 안정적이다. 하지만 서비스가 갑자기 잘되어 트래픽이 몰린다면 어떻게 될까? 서버의 한계점을 넘어간다면, 인스턴스 장애가 발생할 수 있다. 이 때 만약 단일 인스턴스로만 구성되었다면, Redis의 장애가 모든 Application에 영향을 미친다.

한편, Redis를 운영하는 입장에서 버전 업그레이드 혹은 서버 PM 작업이 필요하나 Application 영향도로 인해 섯불리 작업할 수 없는 문제가 생긴다.

마지막으로, 캐시 목적으로 사용하는 Redis는 쓰기 작업보다는 읽기 작업이 주로 발생한다. 따라서 읽기 작업성능을 높힐 수 있는 아키텍처 구성이 필요할 수 있다.

이를 위해 Redis에서는 어느 정도 고가용성을 확보 및 쓰기/읽기 작업 성능을 개선할 수 있는 Master/Replica topology를 제공한다.

jowoohyeong commented 1 year ago

1. Master/Replica 구조

img1 daumcdn 위 그림은 Master/Replica의 구조를 나타냅니다. 최초 Master/Replica 구성 시 Master의 데이터는 모든 Replica에 복사한다. 따라서 어느 Redis 인스턴스에서 데이터를 조회해도 원하는 결과를 얻을 수 있다.

만약 데이터의 변경이 발생한다면, 변경 작업은 Master에서만 가능하다. 이후 변경된 데이터는 비동기적으로 모든 Replica에게 전달되어 반영됩니다. (* replica-read-only 옵션을 no로 설정하면, Replica 상태를 변경할 수 있으나 전체 동기화가 발생하면 모두 유실되므로 추천하지 않는다.)

이러한 과정은 Oracle Data Guard의 SQL Apply 서비스와 유사하다. 데이터가 아닌 문장(Statement)이 전달되므로 LuaScript가 적용된 문장이라면 Master와 Replica의 결과가 다를 수 있다.

2. Master/Replica 동기화 과정

Master/Replica 동기화 과정에 대해서 살펴보겠다. Replica에는 Master 노드에 적재된 데이터가 하나도 존재하지 않으므로 최초 구성 시에는 전체 동기화가 발생한다. 전체 동기화 과정은 다음과 같다. img1 daumcdn

  1. Master와 Replica 인스턴스를 별도로 구성.
  2. Replica 인스턴스에서 ReplicaOf 명령어를 통해 Master 인스턴스와의 동기화 명령을 수행.
  3. Master에서는 fork를 통해 자식 프로세스를 생성
  4. 자식 프로세스에서는 Master 메모리에 있는 모든 데이터를 Disk로 dump
  5. dump가 완료되면, 이를 Replica에 전달하여 반영
  6. Master에서는 복제가 진행되는 동안 변경 데이터를 Replication Buffer에 저장
  7. Dump 전송이 완료되면, Replication Buffer의 내용을 Replica에게 전달하여 데이터를 최신 상태로 만듦
  8. 작업이 완료되면, 이후에는 데이터 변경 발생 부분만 비동기 방식으로 전달

최초 구성 시에는 전체 동기화(Full Syncronization)이 발생하고, 이때 fork가 발생하므로 메모리 사용량이 증가할 수 있다. 따라서 이를 유의해야 한다.

만약 Master/Replica 구성이 완료된 이후에 네트워크 지연이 발생되면 동기화는 어떻게 처리가 될까? img1 daumcdn ReplicaOf 명령어를 통해 Master/Replica 구조가 되면, Master 인스턴스에서는 내부적으로 repl-backlog-size 옵션 만큼의 Backlog Buffer가 만들어진다. 이후 Replica와의 단절이 발생하게 되면, Master 인스턴스에서는 변경 데이터를 Backlog Buffer에 저장. Backlog Buffer는 유한한 크기를 지녔으므로, 지연이 오랫동안 발생한다면 Buffer가 넘칠 수 있다. img1 daumcdn 단절 이후 다시 재연결 되었을 때 과정

  1. Replica에서 Master와 동기화를 위해 부분 동기화를 시도
  2. 만약 Backlog Buffer에 네트워크 단절 이후의 데이터가 모두 존재하면, Buffer에 있는 데이터를 전달받아 최신 상태로 만듦
  3. 만약 오랜 시간 네트워크 단절로 인해 Backlog Buffer에 데이터가 유실되었을 경우에는 전체 동기화 과정을 진행

ADB, RDB를 설명할 때도 살펴봤지만, 프로세스 fork가 일어나게 되면 메모리 사용률이 급격하게 증가할 수 있으므로 전체 동기화 작업 혹은 Replica 추가 작업 시에는 모니터링과 메모리 조정 등이 필요하다.

jowoohyeong commented 1 year ago

3. Master/Replica 장단점

img1 daumcdn Master/Replica 장점 우선 Master 인스턴스와 Replica 인스턴스간 데이터가 공유되어있다. 따라서 Replica 중 어느 인스턴스가 다운되더라도 Application의 영향을 최소화할 수 있다. 또한, 데이터 조회를 위해 굳이 Master에게 요청하지 않아도 되므로 Read 작업에 대한 부하를 여러 인스턴스로 분산시킬 수 있는 장점이 있다.

Master/Replica 구성했을 경우 발생되는 문제점 img1 daumcdn Master 인스턴스에 장애가 발생해도 다른 Replica에 데이터가 모두 복제되어 있으므로 읽기 연산은 무제가 없다. 하지만 쓰기 작업은 Master를 통해 이루어지므로 더이상 쓰기 작업이 수행될 수 없는 문제가 있다. img1 daumcdn 따라서 단순 Master/Replica 구성을 했을 경우에는 관리자가 모니터링을 통해 장애 여부를 감지하고, 수동으로 Replica인스턴스 중 하나를 Master로 선정하고, 나머지 Replica에서 새로 변경한 Master를 바라보도록 설정을 변경해야함.

즉 다시말해 Master 인스턴스 Crash 발생 시, 자동으로 Failover 해주지 않는다. Master/Replica를 구성하는 이유 중 하나는 고가용성을 달성하기 위함인데, Failover를 자동으로 해주지 않는 것은 운영자 입장에서는 많이 불편할 수 밖에 없다. (*Failover 장애 극복 기능) 이러한 이슈를 해결하기 위해 Redis Sentinel 기능을 제공한다. Sentinel은 별도의 프로세스로 Master 인스턴스 다운 시, 이를 감지하여 Replica 중 하나를 Master 인스턴스로 Failover 및 이를 Application에게 통지하는 기능을 포함하고 있다.

jowoohyeong commented 1 year ago

4. Master/Replica/Sentinel 구조

img1 daumcdn 위 그림은 Master/Replica/Sentinel의 구조이다. 여기서 녹색으로 연결된 선이 Sentinel과 연결된 네트워크 Path 의미 Sentinel은 다른 Sentinel을 포함한 모든 Redis 인스턴스와 연결한다. 이후 1초마다 HeartBeat 통신을 통해 Master 및 Replica 서버가 정상적으로 작동 중인지 여부 확인하고 이상 발생 시 자동으로 Failover 및 Application에 알림을 전송한다.

그렇다면, Sentinel을 통해 Failover는 어떤 방식으로 이루어 질까? img1 daumcdn Sentinel과 연결된 노드 중 HeartBeat에 일정 시간동안 응답하지 않는 경우 해당 Sentinel은 장애가 발생한 것으로 간주하고 해당 노드를 주관적 다운(Subjectively Down)으로 인지

주관적 다운으로 별도 지정한 이유는 해당 Sentinel과의 일시적인 네트워크 연결이 끊긴 것일 수도 있기 때문에 정확한 장애 여부는 아직 확정할 수 없기 때문이다. img1 daumcdn 만약 장애가 발생한 인스턴스가 Master일 경우에는 모든 Sentinel에게 Master Down 여부를 묻는다. Master Down 여부를 전달받은 Sentinel들은 실제 Master 인스턴스가 죽었는지를 확인 후 이를 응답

이때 Master 인스턴스에 장애가 발생했다고 응답하는 비율이 정족수(Quorum)를 넘게 되면 이를 객관적 다운(Objectively Down)이라고 인지하게됩니다. 위 구조에서는 2개의 Sentinel 인스턴스가 Master 장애를 인지하게되면, 정족수를 넘게되는 것이므로 객관적 다운으로 인지하게 됩니다. (*정족수: 여러 사람의 합의로 운영되는 의사기관에서 의결을 하는데 필요한 최소한의 참석자 수)

객관적 다운이 발생하게 되면, 다른 Sentinel 인스턴스와 통신하여 장애 조치 작업을 시작합니다.

Master 장애가 발생하게 되면 더 이상 쓰기 작업이 안되므로 가장 먼저 해야 할 작업은 새로운 Master를 선출하는 일입니다. 이를 위해서 Sentinel 프로세스는 새로운 Master 선출 권한이 있는 Sentinel 리더를 뽑는 작업을 합니다. img1 daumcdn Sentinel 리더가 선출되면, 리더는 Replica 인스턴스 중 하나를 Master로 승격합니다. 이후 나머지 Replica에서 Master 인스턴스를 모니터링할 수 있도록 명령을 수행하고 장애 복구 작업을 종료

만약 기존 Master 인스턴스가 다시 살아난다면, 이미 Master가 바뀌었으므로 기존 Master는 Replica로 자동으로 변경

이로써, 운영자의 개입없이 자동으로 Failover 하여 고가용성을 어느 정도 확보할 수 있게 되었다.

여기서 어느 정도인 이유는 Master/Replica/Sentinel 구조에서도 데이터 유실이 발생할 수 있기 때문 img1 daumcdn 위 그림은 기존 Master 인스턴스와 나머지 Redis 인스턴스 사이 네트워크가 단절된 모습입니다. 네트워크 이슈이므로 Master 인스턴스는 현재 정상적으로 Client와 통신이 가능하며, 데이터 쓰기 작업이 발생하면 Master 인스턴스에 데이터가 저장

하지만 Sentinel과 연결이 끊겼기 때문에 Sentinel은 Master가 죽은 것으로 판단하고 Replica 중 하나를 Master로 선출하게 됨

만약 이러한 상황에서 네트워크 단절 이슈가 해결된다면 기존 Master 인스턴스는 Sentinel에 의하여 Replica로 변경이 될 것이고, 이때 기존 Master 인스턴스에 새롭게 수정된 데이터는 유실

https://cla9.tistory.com/101