Syncer
개요
fsr의 파일 I/O 필터 드라이버는 커널 수준에서 동작하지만 파일복제 데이터를 타깃으로 전송하고 동기화 하는 역할을 담당하는 파일복제 엔진은 응용에서 구현하였습니다. 이를 Syncer 라고 명명 합니다.
Syncer 는 Windows 와 리눅스를 동시에 지원하는 크로스플랫폼 지원형 모듈이며 기본적으로 복제 데이터의 전송 및 파일 동기화, 정합성 검사 등의 기능들을 포함하는 fsr 의 핵심 엔진입니다.
동기화와 정합성 검사
동기화와 정합성 검사는 모두 Syncer 에 의해 수행되며, 동기화(또는 정합성 검사) 대상을 탐색하는 단계를 거친 후 모드에 따라 동기화 또는 정합성 검사를 구분하여 수행합니다.
동작 모드 | 기능 플래그 | 설명 |
---|---|---|
full-sync | 동기화 | 전체 동기화. 해시 비교 없이 모든 파일의 내용을 적용 |
partial-sync | 해시 비교, 동기화 | 부분 동기화. 해시 비교 후 차이가 발생한 영역의 내용을 적용 |
verify | 해시 비교 | 단발성 정합성 검증. 복제 관계가 아니거나 일시 중지 상태일 때 사용 |
advanced-verify | 해시 비교, 복제 시퀀스 번호 대기 | 복제 중 정합성 검증. 복제 중인 노드 간 정합성 검증에 사용 |
탐색 단계
동기화(또는 정합성 검사)를 해야 할 대상 디렉터리와 파일들을 탐색하는 단계 입니다.
Syncer 는 대상 파일 목록을 생성하고 로컬과 원격지의 파일목록과 속성을 비교합니다. 비교하는 과정은 로컬 파일목록을 기준으로 순환하며 각 파일들을 순차적으로 비교하고 로컬에만 있는 파일(누락파일) 또는 원격지에만 있는 파일(고아파일) 등을 판정합니다.
탐색 단계가 끝나면 동작단계로 바로 이행 합니다.
동작 단계
동작 단계에서는 제일 먼저 동기화(검사)에 따른 소요 예상시간을 계산합니다. 파일 목록 비교 단계에서 생성해 둔 차이점 목록을 순환하고 각 파일의 용량을 전부 합산하여 최대치를 추산합니다. 단 각 파일의 로컬/원격지 용량이 서로 다른 경우 큰 용량을 기준으로 합산합니다. 파일 블럭의 크기는 파일의 크기에 따라 적정 크기를 구하는데 최소 128KB에서 최대 16MB 크기로 하며 보통 1MB 단위로 구분합니다. 계산이 끝나면 파일 블럭들을 순차적으로 비교하면서 블럭별 데이터를 타깃 측으로 다운로드하여 적용하거나 속성의 차이점들을 일치시켜 나갑니다.
동작모드가 정합성 검사일 경우에는 이 시점에 파일 블럭들을 비교하는 절차만 수행합니다.
정합성 검사의 advanced-verify 모드는 리소스가 온라인 되어 데이터가 변경분(복제)이 있는 상태에서 정합성 검사를 할 경우에 사용할 수 있는 옵션입니다. 이 동작 모드에선 정합성 검사를 수행하는 도중 동시에 복제가 발생하는 검사 대상 파일에 대해선 복제 블럭이 완료될 때 까지 대기 한 후 검사가 진행됩니다.
복제와 동기화
동기화를 수행하는 도중에도 소스 측 데이터에 변경 분 I/O 가 발생할 수 있으므로 동기화와 복제가 동시에 처리될 수 있어야 합니다. 동기화가 예정된 블럭 구간에서 복제 데이터가 수신 되면 해당 구간은 동기화 대상 구간에서 제외합니다. 그리고 타깃에서 동기화 데이터 처리 중 복제가 수신되면 해당 정보는 큐에 추가되고 이 데이터는 로컬/원격의 해시 또는 데이터가 수신될 때 같이 처리하여 파일 블럭에 대한 접근이 동시에 발생하지 않도록 합니다. 만약 동기화 데이터 수신 대기 중 앞서 전달된 복제 데이터가 같은 영역에 먼저 쓰고 동기화 데이터가 나중에 써지면 최종적으로 예전 데이터가 쓰여져서 문제가 될 수 있는데, 이런 경우를 대비하여 복제가 나중에 써 지도록 지연 처리 합니다. 동기화 블럭 보다는 복제 데이터가 항상 최신이기 때문에 복제를 나중에 처리하는 게 데이터 순서에 맞습니다.
조정 동기화
그림과 같이 n 노드 복제에서는 실시간 복제 중 Primary 노드 가 전원 차단 등으로 갑자기 중단 되었을 때 복제 데이터를 수신하는 Secondary 노드 간의 데이터 정합성 문제가 발생할 수 있습니다. Primary 노드에서 복제 데이터가 실시간 전달된다 하더라고 데이터는 각각의 노드에게 비동기적으로 전달되어서 노드 간 데이터 불일치는 피할 수 없습니다. 문제는 남겨진 노드들이 모두 데이터 상태가 UpToDate 라는 점 입니다.
이 상황에서 FSR 은 남겨진 노드들 중 최신 데이터를 보유하고 있는 노드를 기준으로 동기화 하여 클러스터 상에 남겨진 모든 노드의 데이터를 일치 시킵니다. 이것을 조정 동기화라고 합니다.
조정 동기화는 남겨진 노드들의 데이터를 최신으로 일치 시키는 과정을 통해 먼저 중단되었던 노드가 복구되어 올라오기 전 까지 클러스터의 가용성을 높여주는 역할을 합니다.