본문 바로가기

Studying/Data System Design

복제 [데이터 중심 애플리케이션 설계 5장]

  1. 동기식과 비동기식
    1. 동기식: 안정성이 높으니 느림
    2. 비동기식: 내구성이 약하기 때문에 나빠보이지만 분산을 위해선 어쩔 수 없는 선택
  2. 장애 복구
    1. 리더가 장애인 지 판단 → 새로운 리더 선출 → 새로운 리더 사용
    2. 리더가 변경되면서 그 동안의 쓰기를 수신 하지 못 하는 문제 발생
    3. 스플릿 브레인: 리더가 서로 자신이 리더인 줄 아는 상황
  3. 복제 로그
    1. 구문 기반 복제: 실제 사용된 insert, update, delete 등 그대로 사용
      1. 간편하지만 비결정적인 함수 문제나 성능 등에 영향이 있음
    2. 쓰기 전 로그(WAL)
      1. 저수준의 데이터를 기술함으로 엔진이 밀접하게 엮여 버전 등에 의존성이 높음
    3. 논리적 (로우 기반) 로그
      1. 엔진과의 분리를 위해 다른 로그 형식 사용
      2. (RDB) 삽입된 로우는 전체, 삭제된 로우는 식별값, 갱신된 로우는 식별값과 업데이트될 로우
    4. 트리거 기반
      1. 데이터 베이스 변경 시 애플리케이션 코드를 실행하여 외부 프로세스가 처리할 수 있게 한다. 오버헤드, 버그 등이 발생하고 제약사항도 많지만 유연성이 높다.
  4. 복제 지연
    1. 자신이 쓴 내용이 다른 팔로워에는 아직 반영 전일 수도 있어서 쓴 팔로워만 읽을 수 있게 한다.
    2. 팔로워마다 쓰기 시간이 달라 과거로 돌아가는 듯한 현상이 발생할 수 있으므로 한 팔로워에서만 읽게 한다.
    3. 순서가 바뀌는 현상은 인과성이 있는 쓰기는 동일한 파티션에 저장하도록 할 수 있으나 효율적이지 못 하다
  5. 다중 리더
    1. 단일 리더에 비해 장점
      1. 단일 리더보다 쓰기가 빠르다
      2. 데이터센터 중단에 내성이 생긴다
      3. 네트워크 문제에 내성이 생긴다
    2. 오프라인 작업 가능
      1. 클라이언트를 하나의 리더처럼 사용
    3. 쓰기 충돌
      1. 마지막 쓰기를 유지 → 마지막이란 개념이 모호하다.
      2. 사용자에게 선택하게 한다.
  6. 리더 없는 복제
    1. 모든 서버에 쓰기가 가능하므로 노드 다운에 강하나 오래된 데이터를 읽을 위험 증가
      1. 여러 노드에 읽기를 수행하여 오래된 응답 감지
        1. n개의 서버가 있을 때, w개의 노드에서 성공해야 쓰기가 확정되고, 최소 r개의 노드에 읽기를 한다면 w + r > n 이어야 최신 값을 읽을 수 있다.
      2. 백그라운드에서 지속적으로 누락된 데이터 찾기
  7. 동시성
    1. 여러 클라이언트에 동시에 같은 쓰기 가능
      1. 예전 값을 버리고 최신 값으로 덮어씀 → 최신 값이 명확하지 않음
      2. 두 작업의 순서를 정확히 알기 힘들기 때문에 두 작업이 서로 알지 못 하면 동시에 수행됐다고 한다.
    2. 동시에 발생한 값을 모두 저장하는 방식 → 버전 벡터