기본

bsr 은 클러스터 내 호스트의 볼륨들을 네트워크를 통해 실시간 동기화하고 복제합니다.

동기화와 복제

복제를 하려면 먼저, 양측 호스트 상의 볼륨 데이터를 모두 일치 시켜야 합니다. 이를 위해 bsr은 디스크의 블럭을 단위로 하여 데이터를 소스에서 타깃 측으로 복사하는 과정을 수행하는데 이것을 동기화(Synchronization)라고 합니다.

동기화가 완료되면 양 측 볼륨은 완전히 동일한 상태가 되고 이후 소스 측에서 데이터 변경이 발생할 경우 변경 분에 대하여 실시간 타깃 측으로 반영하여 양 볼륨의 정합성을 유지합니다.

여기서, 소스 측의 데이터가 변경될 때 해당 변경 분을 타깃 측으로 실시간 반영하는 동작을 복제(Replication)라고 합니다. 동기화는 백그라운드에서 천천히 동작하지만 복제는 로컬 I/O 의 문맥에서 빠르게 처리됩니다.

복제는 다음과 같은 방식으로 동작합니다.

동기화와 복제는 bsr 내부에서 개별적으로 동작하지만 한 시점에 동시에 수행될 수 있습니다. 즉 동기화가 수행되는 도중에 복제가 같이 처리될 수 있기 때문에(운영 중인 노드가 동기화를 처리하면서 운영 중 발생하는 쓰기 I/O 를 동시에 복제함) 서로 간의 처리량을 최대 네트워크 대역의 범위 안에서 적절히 조절하는 것이 중요합니다. 동기화 대역을 설정하는 방법은 동기화 속도 조정을 참고하세요.

커널 드라이버

bsr의 핵심 엔진은 커널 드라이버로 구현합니다.

커널 드라이버는 디스크 볼륨 계층에 위치하여 파일시스템으로 부터 발생하는 쓰기 I/O에 대해 블럭(block) 단위로 제어합니다. 파일시스템의 하부 계층에 위치하기 때문에 파일시스템과 응용프로그램에 관계없이 투명한 복제 환경을 제공하므로 고가용성을 구축하기에 적합합니다. 그러나 파일 시스템의 하위 계층에 위치한다는 점은 파일과 관련한 일반적인 연산에 대해선 통제할 수 없음을 의미합니다. 예를 들어, 파일시스템의 손상을 감지하거나 파일 데이터에 대한 통제는 할 수 없습니다. 단지 디스크에 쓰여지는 블럭 단위로 복제합니다.

bsr은 기본적으로 Active-Passive 클러스터링을 제공하고, Active-Active 클러스터링은 제공하지 않습니다.

관리 도구

bsr은 위에서 설명한 커널드라이버를 제어하는 용도의 관리 도구를 제공하고 이를 통해 복제 리소스를 구성하고 관리합니다. 이 도구들은 bsradm, bsrsetup, bsrmeta, bsrcon 으로 구성됩니다.

관리 명령어를 사용하기 위해 관리자 수준의 권한이 요구됩니다.

bsradm

bsrsetup

bsrmeta

bsrcon

리소스

리소스는 복제 데이터 세트를 구성하기 위해 필요한 모든 것을 추상화한 객체이자 복제 대상입니다. 복제를 운영하기에 앞서 리소스를 구성하고 리소스를 기동하여 제어합니다. 즉 리소스가 제어의 단위 입니다.

리소스를 구성하기 위해서 다음의 기본적인 사항들(리소스 이름, 볼륨, 네크워크 연결)을 지정해야 합니다.

리소스 이름

볼륨

네트워크 연결(Connection)

리소스 역할

리소스는 프라이머리(Primary) 또는 세컨더리(Secondary)의 역할을 가집니다.

리소스의 역할은 bsr유틸리티 명령을 통해 변경할 수 있습니다. 리소스 역할을 Secondary에서 Primary로 변경할 때 승격(Promotion)이라고 하고 반대는 강등(Demotion)입니다.

주요 기능

복제 클러스터

bsr은 복제를 위한 노드들의 집합을 복제 클러스터로 정의하며 기본적으로 복제 클러스터 멤버 중 하나의 노드에서만 프라이머리 리소스 역할을 할 수 있는 단일 프라이머리 모드를 지원합니다. 다중 프라이머리 모드는 지원하지 않습니다. 단일 프라이머리 모드 즉, Active-Passive 모델은 페일오버를 위한 고 가용 클러스터에서 데이터 저장매체를 다루는 표준적인 접근 방식입니다.

복제 방식

bsr은 3가지 복제 방식을 지원합니다.

동기 방식 (Protocol C)

동기 방식은 로컬과 원격 양쪽 디스크에 모두 쓰기를 완료한 후 로컬 측 쓰기를 완료합니다. 따라서 어느 한쪽 노드에서 손실이 발생하더라도 데이터가 유실되지 않음을 보장합니다.

물론, 양쪽 노드(또는 노드의 스토리지 서브시스템) 모두가 동시에 되돌릴 수 없는 손상을 입는다면 데이터의 손실은 불가피합니다.

일반적으로 HA 미러링 구성에서 동기 방식을 주로 사용합니다.

동기 방식 복제는 로컬과 원격노드의 정합성을 완전히 보장하지만, 하나의 쓰기 I/O 에 대해 원격노드가 쓰기 완료할 때까지 대기하므로 이에 따른 로컬 I/O의 지연 성능 저하는 감안해야 합니다.

반동기 방식 (Protocol B)

반동기 방식은 로컬 노드에서 디스크 쓰기가 발생하면 복제 패킷을 상대 측 노드에서 수신 완료한 단계에서 복제 완료로 간주합니다.

일반적으로 강제 절체(Fail-over)시 데이터 손실이 발생되지는 않는 편이지만 양쪽 노드의 전원이 동시에 나가거나 로컬 스토리지에서 복구할 수 없는 손상이 발생한다면 로컬에서 가장 최근에 기록된 데이터는 손실될 수 있습니다.

비동기 방식(Protocol A)

비동기 방식은 로컬 노드에서 디스크에 쓰기를 마치고 동시에 TCP의 송신 버퍼에 쓰기가 완료 되었을 때 복제 완료로 간주합니다. 따라서 이 방식은 절체(Fail-over)를 할 경우 로컬에는 썼지만 버퍼에 있던 데이터가 대기노드로 완전히 넘어가지 못할 수 있습니다. 절체 후 대기노드의 데이터는 일관성은 가지지만, 절체 시 발생한 쓰기의 일부 전송되지 못한 업데이트 내용은 손실될 수 있습니다. 이 방식은 로컬 I/O 응답성능이 좋으며 DR 원거리 복제 환경에 적합한 방식입니다.

복제 방식은 운영정책을 결정하는 요소인 데이터 정합성 여부와 로컬 I/O 지연(Latency) 성능, 처리량(Throughput) 등에 의해 결정되어야 합니다.

복제 모드를 구성하는 예제는 구성 부분을 참고하세요.

복제 전송 프로토콜

bsr의 복제 전송 네트워크는 TCP/IP 전송 프로토콜을 지원합니다. 

TCP(IPv4/v6)

bsr의 기본 전송 프로토콜이며 IPv4/v6를 지원하는 모든 시스템에서 사용할 수 있는 표준 프로토콜 입니다.

효율적인 동기화

Primary와 Secondary간의 연결이 유지되면 복제가 지속되지만 노드에서 장애가 발생하거나 네트워크가 단절되는 등 복제 연결이 중단되면 동기화가 필요한 상황이 됩니다.

bsr은 동기화 할 때 원본 I/O가 디스크에 쓰여진 순서대로 블럭을 동기화하지 않습니다. 대신 메타데이터의 정보를 토대로 0번 섹터 부터 마지막 섹터까지 동기화 되지 않은 영역에 대해서 순차적 동기화합니다. 이러한 방식은 다음과 같은 효율성을 갖습니다.

동기화하는 중에는 대기(Standby)노드의 전체 데이터 셋 중 일부는 과거의 변경 전 내용이고 일부는 최신으로 업데이트됩니다. 이러한 데이터의 상태를 Inconsistent 상태라고 하고 모든 블럭이 최신 데이터로 동기화 완료된 상태를 UpToDate 상태라고 합니다. Inconsistent 상태의 노드는 일반적으로 볼륨이 사용 가능하지 않은 상태이므로 이 상태는 가능한 짧게 유지하는 것이 바람직합니다.

물론 백그라운드에서 동기화가 진행되더라도 Active 노드의 응용 서비스는 중단되거나 하지 않고 계속 운영 가능 합니다.

부분 동기화(Partial synchronization)

전체 동기화를 한 번 수행하고 난 후에는 항상 동기화 되지 않은 영역(oos)에 대해서만 부분 동기화합니다.

빠른 동기화(FastSync)

bsr 은 볼륨에서 사용하고 있는 부분에 대해서만 동기화 하는 빠른 동기화(FastSync)를 구현합니다. FastSync 로 동작하지 않는다면 전체 볼륨의 영역에 대해서 동기화 해야 하므로 볼륨의 크기가 클 경우 많은 동기화 시간을 소요하게 됩니다. FastSync 는 동기화 시간을 크게 절약할 수 있는 bsr의 강력한 기능입니다.

체크섬 기반 동기화(Checksum-based synchronization)

체크섬 데이터 요약을 사용하면 동기화 알고리즘의 효율성을 더욱 개선할 수 있습니다. 체크섬 기반 동기화는 동기화하기 전에 블록을 읽고 현재 디스크에 있는 내용의 해시(hash) 요약을 구한 다음, 상대 노드로부터 같은 섹터를 읽어 구한 해쉬 요약 내용과 비교합니다. 해시 내용이 일치하면 해당 블럭에 대한 동기화 쓰기(re-write)를 생략합니다. 이 방식은 동기화 해야 될 블럭을 단순히 덮어쓰는 방식에 비해 성능에서 유리할 수 있으며 연결이 끊어진(disconnect 상태) 동안 파일 시스템이 섹터에 같은 내용을 다시 썼다면 해당 섹터에 대해선 재동기화를 생략하게 되므로 전체적으로 동기화 시간을 단축시킬 수 있습니다.

동기화 대역 지정

동기화와 복제는 동시에 수행될 수 있습니다. 이를 위해 양 측 동작 간의 대역폭 경계를 지정해야 합니다.

bsr은 네트워크 대역 내에서 동기화 대역폭을 지정하면 그 나머지 대역을 복제 대역으로 사용합니다. 동기화 동작이 없다면 모든 대역을 복제로 사용합니다. 최소값(c-min-rate)과 최대값(c-max-rate)으로 지정할 수 있습니다.

고정 대역 동기화(Fixed-rate synchronization)

동기화하는 데이터 속도를 resync-rate 값으로 고정합니다.

가변 대역 동기화(Variable-rate synchronization)

가용한 네트워크의 대역폭을 감지한 후 복제 처리량과 중재하여 c-min-rate 에서 c-max-rate 사이에서 동기화를 처리합니다. 가변대역 동기화에서의 resync-rate 는 초기 동기화 대역값의 의미만 가집니다.

bsr은 가변대역 동기화를 기본 설정으로 합니다.

온라인 정합성 검사

장치 운영 중 노드 간의 블록 별 데이터의 정합성을 확인하는 기능입니다.

한 쪽 노드에서(verification source) 특정 리소스 스토리지상의 모든 데이터 블럭을 순차적으로 암호화 요약(cryptographic digest)시키고, 요약된 내용을 상대 노드(verification target)로 전송하여 같은 블럭위치의 내용을 요약 비교 합니다. 만약 요약된 내용이 일치하지 않으면, 해당 블럭은 out-of-sync로 표시되고 나중에 동기화 대상이 됩니다. 비교할 때에는 블럭의 전체 내용이 아니라 최소한의 요약본만 전송하여 네트워크 대역을 효과적으로 사용합니다.

정합성 검사는 온라인 중에 하기 때문에 온라인 검사와 복제가 동시에 수행될 경우 약간의 복제 성능 저하가 있을 수 있습니다. 하지만 서비스를 중단할 필요가 없고 검사 중 또는 검사 후 동기화 과정 중에 시스템의 다운 타임이 발생하지 않는 장점이 있습니다. 

bsr은 FastSync 를 기본 동작으로 수행하기 때문에 사용하고 있는 디스크 영역에 대해서만 온라인 검사를 수행하여 보다 더 빠르고 효율적입니다.

온라인 정합성 검사를 구성하는 법에 대한 자세한 내용은 https://mantech.jira.com/wiki/spaces/BSRUG/pages/1185382476#%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%A0%95%ED%95%A9%EC%84%B1-%EA%B2%80%EC%82%AC를 참고하세요.

복제 트래픽 무결성 검사

bsr은 암호화 메시지 요약 알고리즘을 사용하여 양 노드 간의 복제 트래픽에 대한 무결성을 실시간 검증할 수 있습니다.

이 기능을 사용하게 되면 Primary는 모든 데이터 블록의 메시지 요약본을 생성하고 그것을 Secondary 노드에게 전달하여 복제 트래픽의 무결성을 확인합니다. 만약 요약된 블럭이 일치하지 않으면 재전송을 요청합니다.

스플릿 브레인 감지와 복구

스플릿 브레인(Split brain)은 클러스터 노드들 사이에 모든 네트워크가 단절된 일시적인 장애 상황에서 클러스터 관리 소프트웨어나 관리자의 수동 개입으로 인해 두 개 이상의 노드가 Primary 역할을 가졌던 상황을 말합니다. 이것은 데이터에 대한 수정이 상대 측으로 복제되지 않고 각각의 노드에서 이루어졌다는 것을 암시하며 잠재적인 문제를 발생시킬 수 있는 상황입니다. 이 때문에 데이터가 병합되지 못하고 두 개의 데이터 셋이 공존하는 비정상 상황입니다.

bsr 은 스플릿 브레인을 자동으로 감지하고 이를 복구하는 기능을 제공합니다. 이에 대한 자세한 내용은 문제해결의 스플릿 브레인 항목을 참고하세요.

디스크 상태

bsr의 디스크 상태는 동기화 상태에 따라 대표적으로 다음의 상태 중 1가지로 표기 됩니다.

bsr은 Inconsistent 데이터와 Outdated 데이터를 구분합니다. Inconsistent 데이터란 어떤 방식으로든 접근이 불가능하거나 사용할 수  없는 데이터를 말합니다. 대표적으로 동기화 진행 중인 타깃 쪽 데이터가 Inconsistent 상태 입니다. 동기화가 진행 중인 타깃 데이터는 일부는 최신 이지만 일부는 지난 시점의 데이터 이므로 이를 한 시점의 데이터로 간주할 수 없습니다. 또한 이 때에는 장치에 적재된 파일시스템이 마운트(mount)될 수 없거나 파일시스템 자동 체크 조차도 할 수 없는 상태 일 수 있습니다.

Outdated 디스크 상태는 데이터 일관성은 보장되지만 최신이 아닌 데이터일 수 있습니다. 임시적이든 영구적이든 복제 링크가 중단될 때 발생합니다. 연결이 끊어진 Oudated 데이터는 결국 지난 시점의 데이터 이므로 승격(promoting a resource)하는 것을 기본적으로 허용하지 않습니다. 그러나 필요에 따라(긴급한 상황에서) Outdated 데이터를 강제로 승격할 수는 있습니다.

디스크 I/O 오류 처리

디스크 장비에서 장애가 발생할 경우 bsr은 디스크 장애 정책의 사전 설정을 통해 해당 I/O 오류를 상위 계층(대부분 파일시스템)으로 단순히 전달해서 처리하거나 복제 디스크를 detach 하여 복제를 중단하도록 합니다.

이와 관련한 자세한 사항은 https://mantech.jira.com/wiki/spaces/BSRUG/pages/1366262571#%EB%94%94%EC%8A%A4%ED%81%AC-%EC%9E%A5%EC%95%A0의 내용을 참고하세요.