본문 바로가기

독서/개발자를 위한 레디스

[개발자를 위한 레디스] 8장 복제

반응형
SMALL
- 가용성: 일정 기간 동안 서비스를 정상적으로 사용할 수 있는 시간의 비율
- 가용성이 높은 시스템을 고가용성 시스템이라고 한다.

 

레디스에서의 복제 구조

 

복제본 노드를 추가하는 이유

  • 마스터 데이터베이스가 다운되었을 때 대신 사용할 수 있다.
  • 트래픽을 감소시키는 역할을 한다.
  • 백업을 복제본에서 수행하면 백업 작업이 서비스에 미치는 영향을 최소화할 수 있다.

 

복제 구조 구성하기

복제 연결 시작

  • 복제본이 될 노드 B에서 REPLICAOF 커맨드를 입력해 마스터 노드의 정보를 입력하면 복제 연결이 시작된다.

 

레디스에서의 복제 연결 구조

  • 가장 상위의 노드인 마스터 노드만 데이터를 업데이트하는 커맨드를 수행할 수 있다.
  • 하위 복제본은 모두 읽기 전용으로 동작하기 때문에 데이터를 읽어가는 커맨드만 수행할 수 있다.

 

패스워드 설정

복제 연결에서의 패스워드 설정

  • requirepass 옵션을 이용해 패스워드를 설정할 수 있다.
  • 비밀번호가 없으면 master에 연결해 데이터를 받아갈 수 없다.

 

복제 메커니즘

디스크를 사용하는 방식에서의 복제 연결 메커니즘

  1. REPLICAOF 커맨드로 복제 연결을 시도한다.
  2. 마스터 노드에서는 fork로 자식 프로세스를 새로 만든 뒤 RDB 스냅샷을 생성한다.
  3. (2)번 과정 동안 마스터 노드에서 수행된 모든 데이터셋 변경 작업은 레디스 프로토콜 형태로 마스터의 복제 버퍼에 저장된다.
  4. RDB 파일이 생성 완료되면 파일은 복제본 노드로 복사한다.
  5. 복제본에 저장됐던 모든 내용을 모두 삭제한 뒤 RDB 파일을 이용해 데이터를 로딩한다.
  6. 복제 과정 동안 버퍼링됐던 복제 버퍼의 데이터를 복제본으로 전달해 수행시킨다.

 

마스터 노드

디스크에 RDB 파일을 생성하는 로그를 확인할 수 있다.

 

복제본 노드

마스터로부터 RDB 파일을 읽어오고, RDB 파일을 로드하는 과정의 로그를 확인할 수 있다.

 

디스크를 사용하지 않는 방식을 사용할 때의 복제 연결 메커니즘

  1. REPLICAOF 커맨드로 복제 연결을 시도한다.
  2. 마스터 노드는 소켓 통신을 이용해 복제본 노드에 바로 연결하며, RDB 파일은 생성됨과 동시에 점진적으로 복제본의 소켓에 전송된다.
  3. (2)의 과정 동안 마스터 노드에서 수행된 모든 데이터셋 변경 작업은 레디스 프로토콜 형태로 마스터의 복제 버퍼에 저장된다.
  4. 소켓에서 읽어온 RDB 파일을 복제본의 디스크에 저장한다.
  5. 복제본에 저장된 모든 데이터를 모두 삭제한 뒤 RDB 파일 내용을 메모리에 로딩한다.
  6. 복제 버퍼의 데이터를 복제본으로 전달해 수행시킨다.

 

마스터 노드

디스크를 사용하지 않고 RDB 데이터를 보내는 로그를 확인할 수 있다.

 

복제본 노드

마스터로부터 디스크를 사용하지 않는 방식으로 RDB 파일을 읽어오고, RDB 파일을 로드하는 과정의 로그를 확인할 수 있다.

 

비동기 방식으로 동작하는 복제 연결

비동기식으로 동작하는 복제 연결

  • 마스터에서 데이터를 입력하는 커맨드가 수행되면 레디스는 마스터 노드에서 커맨드를 처리한 이후 클라이언트에 OK를 보낸다.

 

복제 ID

  • 모든 레디스 인스턴스는 복제 ID를 가지고 있다.
    • 오프셋과 쌍으로 존재한다.
    • 데이터가 수정되는 모든 커맨드를 수행할 때마다 오프셋이 증가한다.
  • 복제 연결을 시작하면 복제본의 replication id는 마스터의 replication id로 변경된다.
    • 오프셋은 복제본에서 마지막으로 수행된 마스터의 오프셋을 의미한다.
    • 레디스에서 replication id의 오프셋이 같을 때 두 노드는 정확히 일치된 상태라는 것을 의미한다.

 

부분 재동기화

  • 레디스는 부분 재동기화 기능을 사용해 안정적으로 복제 연결을 유지한다.
  • 재연결되면 복제본은 PSYNC 커맨드를 호출해 자신의 replication id와 오프셋을 마스터에 전달한다.

 

Secondary 복제 ID

같은 복제 그룹에서의 ID / 같은 복제 그룹에서 새로운 마스터가 선출되는 경우

  • 마스터 노드와의 복제가 끊어짐과 동시에 복제본은 새로운 복제 ID를 갖게 된다.
  • 레디스가 2개의 복제 ID를 갖는 이유는 마스터로 승격되는 복제본 때문이다.

 

읽기 전용 모드로 동작하는 복제본 노드

  • 버전 2.6 이후 레디스에서 복제를 구성하면 복제본은 기본으로 읽기 전용 모드로 동작한다.
  • 이 설정은 replica-read-only 옵션을 이용해 제어된다.

 

유효하지 않은 복제본 데이터

  • 복제본의 데이터와 마스터의 데이터가 정확하게 일치하지 않은 경우의 데이터를, 유효하지 않은 데이터라고 한다.
  • 복제본의 동작 방식은 replica-serve-stale-data 파라미터를 이용해 제어할 수 있다.
    • yes: 유효하지 않다고 판단될 때에도 클라이언트로부터 들어오는 모든 읽기 요청에 데이터를 반환한다.
    • no: 일부 기본 커맨드를 제외한 모든 커맨드에 대해 SYNC with master in progress라는 오류를 반환한다.

 

백업을 사용하지 않는 경우에서의 데이터 복제

복제 구조에서 백업을 설정하지 않았을 경우

  1. 백업 기능을 사용하지 않는 마스터와 복제본 노드가 존재한다.
  2. 마스터 노드가 장애로 인해 종료됐지만, 레디스 프로세스를 자동 재시작하는 시스템에 의해 노드가 재부팅된다. 이때 메모리의 내용은 초기화된다.
  3. 복제본 노드에는 데이터가 존재하지만, 마스터 노드로의 복제 연결을 시도한다.
  4. 마스터에서 복제본으로 빈 데이터셋을 전달한다.

 

만약 백업을 사용했다면 백업 파일을 자동으로 읽어오기 때문에 데이터가 복원된다.

자동 재시작 기능을 사용하지 않았다면 연결 설정을 마스터에서 복제본 노드로 변경해 데이터를 계속 사용할 수 있다.

데이터의 안정성을 위해 복제 기능을 사용할 경우 백업 기능을 사용하는 것이 좋다.

그렇지 않을 경우, 마스터에서는 인스턴스의 자동 재시작을 활성화하지 않는 것이 권장된다.

반응형
LIST