분산 데이터
기술이 성공하기 위해서 홍보보다 현실이 우선돼야 한다. 자연을 속일 수는 없기 때문이다 - Richard Feynman
여러 장비 간 분산된 데이터베이스를 필요로 하는 이유
확장성
내결함성/고가용성
지연시간
고부하로 확장
- 수직확장, 용량확장, 공유메모리 아키텍처
- 비공유 아키텍처
- 수평확장
- 복제 대 파티셔닝
- 여러 노드에 데이터 분산 방법
- 복제
- 파티셔닝
- 여러 노드에 데이터 분산 방법
참고 문헌
05장: 복제
잘못될 수 있는 것과 잘못될 수 없는 겂 사이의 주된 차이점은 잘못될 수 없는 겂이 잘못됐을 때는 잘못을 파악하거나 고치는 것은 거의 불가능하다 - 더글라스 애덤스
복제란 네트워크로 연결된 여러 장비에 동일한 데이터의 복사본을 유지한다는 의미다
- 지리적으로 사용자와 가깝게 데이터를 유지해 지연 시간을 줄인다
- 시스템의 일부에 장애가 발생해도 지속적으로 동작할 수 있게 해 가용성을 높인다
- 읽기 질의를 제공하는 장비의 수를 확장해 읽기 처리량을 늘린다
노드간 변경을 위한 인기 있는 알고리즘
- 단일 리더
- 다중 리더
- 리더 없는
리더와 팔로워
데이터베이스의 복사본을 저장하는 각 노드를 복제서버 라고 한다
- 동기식 대 비동기식 복제
- 동기식 복제
- 팔로워와 리더가 일관성이 있다
- 하지만 비현실적
- 비동기식 복제
- 보통의 리더기반 복제는 완전히 비동기식으로 구성된다
- 동기식 복제
- 새로운 팔로워 설정
- 새로운 팔로워가 리더의 데이터 복제본을 정확히 가지고 있는지 어떻게 보장?
- 스냅샷을 일정 시점에 가지고 옴
- 스냅숏을 새로운 팔로워 노드에 복사
- 팔로워는 리더에서 연결해서 스냅숏 이후에 데이터를 동기화
- 새로운 팔로워가 리더의 데이터 복제본을 정확히 가지고 있는지 어떻게 보장?
- 노드 중단 처리
- 팔로워 장애: 따라잡기 복구
- 팔로워가 장애 후에 복구 되면 리더에서 새로운 데이터를 다시 동기화함
- 리더 장애: 장애 복구
- 장애복구(failover)
- 리더가 장애인지 판단
- 새로운 리더를 선택
- 새로운 리더 사용을 위해 시스템을 재설정
- 장애 복구 과정의 문제
- 비동기식 복제를 사용한다면 새로운 리더는 이전 리더가 실패하기 전에 이전 리더의 쓰기를 일부 수신 하지 못할수 있다
- 쓰기를 폐기하는 방법은 데이터베이스 외부의 다른 저장소 시스템이 데이터베이스 네용에 맞추 조정돼한한다면 특히 위험
- 특정 결함 시나리오 두 노드가 모두 자신이 리더라고 믿을 수 있다 - 스플릿 브레인
- 리더가 분명히 죽었다고 판단 가능한 적절한 타임아웃은 얼마일까?
- 장애복구(failover)
- 팔로워 장애: 따라잡기 복구
- 복제 로그 구현
- 구문기반 복제
- SQL 구분을 파싱해서 실행
- 구문을 기록할때 결정적 함수 호출을 고정 값을 반환하게끔 대체
- 쓰기 전 로그 배송
- 리더가 로그를 쓰기 전에 팔로워에게 로그를 보냄
- 로그가 제일 저수준의 데이터를 기술한다는 점
- 논리적(로우 기반) 로그 복제
- 복제와 저장소 엔진을 위해 다른 로그 포멧형식을 사용하는 것
- change data capture(CDC)라고도 함
- 트리거 기반 복제
- 트리거나 스토어드 프로시저를 사용
- 구문기반 복제
복제 지연 문제
읽기 확장 아키텍처에서 간단히 팔로워를 추가함으로써 읽기 전용 요청을 처리하기 위한 용량을 늘릴수 있다
최종적 일관성
- 자신이 쓴 내용 읽기
- 쓰기 후 읽기 일관성(자신의 쓰기 읽기 일관성)
- 크로스 디바이스
- 단조 읽기
- 시간이 거꾸러 흐르는 현상 - 단조 읽기는 이런 종류 이상이 발생하지 않음을 보장한다
- 강한 일관성 보다는 덜한 보장이지만 최종일관성보다는 더 강한 보장이다
- 일관된 순서로 읽기
- 복제 지연이 일어 날수 있다
- 일관된 순서로 일기
- 복제 지연을 위한 해결책
- 트렌젝션이 있는 이유 - 올바른 작성수행을 항상 보장하기 위해
- 다중 리더 복제
- 마스터/마스터 복제, 엑티브/엑티브 복제
- 다중 리더 복제의 사용 사례
- 다중 데이터 센터 운영
- 성능, 데이터센터 중단 내성, 네트워크 문제 내성
- 오프라인 작업하는 클라이언트
- 실시간 협업 편집
- 쓰기 충돌 다루기
- 다중 리더 복제는 쓰기 충돌이 일어난다
- 동기 대 비동기 충돌 감지
- 쓰기 완료전에 쓰기 차단
- 충돌 회피
- 일관된 상태 수렴
- 사용자 정의 충돌 해소 로직
- 쓰기 수행중
- 충돌 핸들러를 호출
- 읽기 수행 중
- 충돌을 감지하면 모든 충돌 쓰기를 저장한다 그리고 어플리케이션에 여러 데이터를 리턴하고 어플리케이션에서 충돌이 해소 되면 저장
- 쓰기 수행중
- 충돌은 무엇인가?
- 다중 리더 복제 토폴로지
- 전체 연결
- 원형 토플로지
- single point of failure
- 별모양 토폴로지
- single point of failure
- 리더 없는 복제
- 노드가 다운됐을 때 데이터베이스에 쓰기
- 읽기 복구와 안티 엔트로피
- 읽기와 쓰기를 위한 정족수
- 정족수 일관성의 한계
- 최신성 모니터링
- 최신 결과를 반환하는지 모니터링
- 최신성 모니터링
- 느슨한 정족수와 암시된 핸드오프
- 느슨한 정족수
- 암시된 핸드오프
- 다중 데이터센터 운영
- 동시 쓰기 감지
- 최종 쓰기 승리(동시쓰기 버리기)
- 이전 발생 관계와 동시성
- 이전 발생 관계 파악
- 동시에 쓴 값 병합
- 버전 벡터
- 노드가 다운됐을 때 데이터베이스에 쓰기
정리
- 고가용성
- 연결이 끊긴 작업
- 지연 시간
- 확장성
복제
- 단일 리더 복제
- 다중 리더 복제
- 리더 없는 복제
일관성 모델
- 쓰기 후 읽기 일관성
- 단조 일기
- 일관된 순서로 일기