BSR(Block Sync & Replication)은 DRBD(http://www.drbd.org)를 fork 한 WDRBD(https://github.com/mantechnology/wdrbd) 를 기반으로 하며, Windows 와 Linux 플랫폼을 모두 지원하도록 공통 엔진으로 구현한 오픈소스 프로젝트 입니다. BSR은 WDRBD의 기본적인 개념과 기능들을 모두 계승하였으며, 원본 DRBD의 문제점들을 보완하고 기능적으로 강화하여 보다 안정적이고 유연한 복제 환경을 구축할 수 있는 솔루션을 제공합니다.
기본
BSR은 호스트 상의 블록장치들(하드디스크, 파티션, 논리 볼륨 등)을 네트워크를 통해 소프트웨어적으로 실시간 복제하는 솔루션입니다.
BSR은
응용 프로그램이 블록장치에 데이터를 쓰는 동시에 실시간 복제합니다.
실시간 복제를 수행 하더라도 다른 응용 서비스나 시스템 요소에 영향을 주지 않습니다.
동기 또는 비동기적으로 복제합니다
동기 방식은 복제 데이터를 로컬디스크와 타겟 호스트의 디스크에 쓰기 완료했을 때 복제를 완료한 것으로 처리합니다.
비동기 방식은 복제 데이터를 로컬디스크에 쓰고 타겟 호스트로 데이터 전송을 했을 때 복제를 완료한 것으로 처리합니다.
BSR는 오픈소스이며 GPL v2 라이선스를 준수하여 배포합니다. BSR은 WDRBD 1.5.x 배포 버전을 기준으로 작업하여 윈도우즈와 리눅스를 공통으로 지원하는 크로스플랫폼 지원 엔진 체계를 갖추었으며, 1.6.x 을 초기버전으로 배포합니다.
커널 드라이버
BSR의 핵심 엔진은 커널 드라이버로 개발되었습니다.
커널 드라이버는 디스크 볼륨 매니저의 상위 또는 하부에 위치하여 파일시스템으로 부터 발생하는 쓰기 I/O에 대해 블럭(block) 단위로 통제할 수 있습니다. 파일시스템의 하부 계층에서 복제를 수행함에 따라 파일시스템과 응용프로그램에 관계없이 투명한 복제 환경을 제공하여 고가용성을 구현하기에 적합합니다. 그러나 BSR은 파일 시스템의 하위 계층에 위치하기 때문에 파일과 관련한 일반적인 연산에 대해선 통제할 수 없습니다. 예를 들어, BSR은 파일시스템의 손상을 감지할 수 없으며, 파일의 순수한 데이터와 파일 시스템의 메타 데이터를 구분할 수 없습니다.
BSR 은 기본적으로 Active-Passive 클러스터링을 제공하고, Active-Active 클러스터링은 제공하지 않습니다.
[그림]
사용자 명령어
BSR은 리소스를 구성하고 관리하기 위한 용도의 관리 유틸리티를 제공합니다. 다음의 bsradm, bsrsetup, bsrmeta, bsrcon 입니다. (Windows 에선 관리 명령어를 사용하기 위해 관리자 권한으로 실행한 명령줄이 필요합니다.)
bsradm
세부 기능들에 대해 추상화한 상위 수준 명령어를 제공하는 유틸리티입니다. bsradm 에서 제공하는 명령만으로 BSR의 대부분 동작을 제어할 수 있습니다.
bsradm은 구성파일 etc\drbd.conf로부터 모든 구성 파라미터를 얻으며, bsrsetup 및 bsrmeta에 적절한 옵션을 주어 명령을 수행시킵니다.
bsradm은 –d 옵션을 통해 dry-run모드로 실행시킬 수 있습니다. 이는 bsradm이 bsrsetup 및 bsrmeta 명령을 실제 호출하지 않고, 어떤 옵션 조합으로 실행되는지 미리 확인할 수 있는 방법을 제공합니다.
bsradm 명령 옵션에 대한 자세한 사항은 Appendix B. 시스템 매뉴얼의 bsradm을 참고하십시요.
bsrsetup
BSR 커널엔진에 필요한 값들을 설정할 수 있습니다. bsrsetup에 대한 모든 파라미터는 텍스트 인자로 전달해야 합니다.
bsradm과 bsrsetup의 분리를 통해 유연한 명령 체계를 제공합니다.
bsradm에서 받아들인 파라미터는 보다 복잡한 파라미터로 치환하여 bsrsetup을 호출합니다.
bsradm은 리소스 구성파일의 문법적 오류 등을 확인하여 사용자 실수를 방지하지만, bsrsetup은 이러한 문법적 오류를 확인하지 않습니다.
대부분의 경우에선 bsrsetup을 직접 사용할 필요가 없습니다.
bsrsetup 명령 옵션에 대한 자세한 사항은 Appendix B. 시스템 매뉴얼의 bsrsetup 을 참고하십시요.
bsrmeta
복제 구성을 위한 메타 데이터 파일을 생성하거나, 덤프, 복원 및 수정할 수 있도록 해 줍니다. bsrsetup처럼 대부분의 경우에선 직접 bsrmeta를 사용할 필요가 없고 bsradm에서 제공하는 명령을 통해 메타 데이터를 제어합니다.
bsrsetup 명령 옵션에 대한 자세한 사항은 Appendix B. 시스템 매뉴얼의 bsrmeta 를 참고하십시요.
bsrcon
BSR 관련 정보를 확인하거나 기타 필요한 설정을 조정할 수 있습니다.
bsrcon 명령 옵션에 대한 자세한 사항은 Appendix B. 시스템 매뉴얼의 bsrcon 을 참고하십시요.
리소스
리소스는 복제 데이터 세트를 구성하기 위해 필요한 모든 것을 추상화한 대상입니다. 사용자는 리소스를 구성한 후 리소스를 제어함으로써 복제 환경을 운영합니다.
리소스를 구성하기 위해서 다음의 기본적인 내용들(리소스 이름, 볼륨, 네크워크 연결)이 지정되어야 합니다.
리소스 이름
공백없이 US-ASCII 형태로 이름을 지정합니다.
볼륨
리소스는 공통의 복제 스트림을 공유하는 하나 이상의 볼륨으로 구성된 복제 그룹이며 리소스내의 모든 볼륨의 쓰기 정합성을 보장합니다.
볼륨은 하나의 장치로 기술하며 윈도우즈의 경우 드라이브 레터(drive letter)로 지정합니다.
하나의 복제 셋에는 데이터 복제를 위한 볼륨 한 개와 볼륨과 연계된 메타데이터를 저장하는 별도의 볼륨이 필요합니다. 메타 볼륨은 복제를 위한 내부 정보를 저장하고 관리하는 용도로 사용합니다.
메타데이터는 저장하는 위치에 따라 외부 메타 형식(External Meta Type)과 내부 메타 형식(Internal Meta Type)으로 구분합니다. 예를 들어, 복제 대상 볼륨의 디스크내에 메타 데이터가 위치하면 내부 메타이고, 다른 장치 또는 다른 디스크에 위치하면 외부 메타가 됩니다.
BSR은 복제 운영 중 메타 디스크에 복제 관련 정보를 실시간으로 기록하기 때문에, 복제 I/O 와 메타 데이터 쓰기가 동시에 수행될 수 있기 때문에 성능적인 측면에서 외부 메타 형식이 내부 메타에 비해 유리합니다. 그리고 메타 디스크의 I/O성능은 복제 성능에 직접적으로 영향을 주기 때문에, 되도록 이면 좋은 성능의 디스크로 구성하는게 좋습니다.
주의할 점은, 메타를 위한 볼륨은 NTFS같은 파일시스템으로 포맷하지 않고 RAW 상태로 구성해야 한다는 것 입니다.
네트워크 연결(Connection)
Connection은 두 호스트 사이의 복제 데이터 세트를 위한 통신 링크입니다.
각 리소스들은 다중 호스트들 간에 완전 메시(full-mesh) 연결 설정을 포함한 다중 호스트로 정의합니다.
연결 Name은 특별히 지정되지 않았을 경우 bsradm 수준에서 리소스 Name으로 자동 지정됩니다.
리소스 역할
리소스는 프라이머리(Primary) 또는 세컨더리(Secondary)의 역할을 가집니다.
Primary는 리소스에 제한 없이 읽기, 쓰기 작업을 할 수 있습니다.
Secondary는 상대 노드로부터 디스크의 변경된 모든 내용을 수신하여 기록하며 볼륨에 대한 액세스를 허용하지 않습니다. 따라서 응용 프로그램에서는 Secondary 볼륨에 대해선 읽거나 쓸 수 없습니다.
리소스의 역할은 bsr유틸리티 명령을 통해 변경할 수 있습니다. 리소스 역할을 Secondary에서 Primary로 변경할 때는 승격(Promotion)이라고 하고 반대는 강등(Demotion)입니다.
주요 기능
복제 클러스터
BSR은 복제를 위한 노드들의 집합을 복제 클러스터로 정의하며 기본적으로 복제 클러스터 멤버 중 하나의 노드에서만 프라이머리 리소스 역할을 할 수 있는 단일 프라이머리 모드를 지원합니다. 이중 또는 다중 프라이머리 모드는 지원하지 않습니다. 단일 프라이머리 모드 즉, Active-Passive 모델은 페일오버를 위한 고 가용 클러스터에서 데이터 저장매체를 다루는 표준적인 접근 방식입니다.
복제 방식
BSR은 3가지 복제 방식을 지원합니다.
Protocol A. 비동기 방식
비동기 방식은 Primary 노드에서 로컬 디스크에 쓰기를 마치고 동시에 TCP의 송신 버퍼에 쓰기가 완료되었을 때 복제 완료로 간주합니다. 따라서 이 방식은 절체(Fail-over)를 할 경우 로컬에는 썼지만 버퍼에 있던 데이터가 대기노드로 완전히 넘어가지 못할 수 있습니다. 절체 후 대기노드의 데이터는 일관성은 가지지만, 절체 시 발생한 쓰기의 일부 전송되지 못한 업데이트 내용은 손실될 수 있습니다. 이 방식은 로컬 I/O 응답성능이 좋으며 원거리 복제 환경에 적합한 방식입니다.
Protocol B. 세미 동기 방식
세미 동기방식은 Primary 노드에서 로컬 디스크 쓰기가 발생하면 복제 패킷을 상대 측 노드에서 수신 완료한 단계에서 복제 완료로 간주합니다.
일반적으로 강제 절체(Fail-over)시 데이터 손실이 발생되지는 않는 편이지만 양쪽 노드의 전원이 동시에 나가거나 Primary 스토리지에서 복구할 수 없는 손상이 발생한다면 Primary에서 가장 최근에 기록된 데이터는 손실될 수 있습니다.
Protocol C. 동기 방식
동기 방식은 로컬과 원격 양쪽 디스크에 모두 쓰기가 완료되어야 Primary 노드에서 복제 완료로 간주합니다. 따라서 어느 한쪽 노드에서 손실이 발생하더라도 데이터가 유실되지 않음을 보장합니다.
물론, 양쪽 노드(또는 노드의 스토리지 서브시스템) 모두가 동시에 되돌릴 수 없는 손상을 입는다면 데이터의 손실은 불가피합니다.
일반적으로 BSR은 Protocol C 방식을 많이 사용합니다.
복제 방식은 운영정책을 결정하는 요소인 데이터 정합성(protection)과 로컬 I/O 지연(latency), 복제 처리량(Throughput)등에 의해 결정되어야 합니다.
복제 모드를 구성하는 예제는 리소스 작성 부분을 참고하세요.
복제 전송 프로토콜
BSR의 복제 전송 네트워크는 TCP/IP 전송 프로토콜을 지원합니다.
TCP(IPv4/v6)
BSR의 기본 전송 프로토콜이며 IPv4/v6를 지원하는 모든 시스템에서 사용할 수 있는 표준 프로토콜 입니다.
효율적인 동기화
BSR에서 복제(replication)와 (재)동기화(resynchronization)는 다르며 구분하는 개념입니다. 복제는 Primary 역할의 리소스의 모든 디스크 쓰기 동작을 Secondary 노드로 실시간 반영하는 동작이고, 동기화는 실기간 쓰기 I/O를 배제한 전체 블록 디바이스 관점에서 데이터를 일치시키는 처리과정 입니다. 이처럼 복제와 동기화는 개별적인 동작이지만 동시에 처리될 수도 있습니다.
Primary와 Secondary간의 복제 연결이 유지된다면 복제가 지속적으로 수행됩니다. 그러나 Primary 또는 Secondary 노드에서 장애가 나거나, 복제 네트워크가 단절되는 등의 이유로 복제 연결이 중단되었다면 Primary와 Secondary 간의 동기화가 필요한 상황에 놓입니다.
BSR은 동기화 할 때 원본 I/O가 디스크에 쓰여진 순서대로 블럭을 동기화하지 않습니다. 동기화는 메타데이터의 정보를 기반으로 0번 섹터 부터 마지막 섹터까지 동기화 되지 않은 영역에 대해서만 순차적 동기화하여 다음과 같이 효율적입니다.
동기화는 디스크의 블럭 레이아웃에 따라 블럭 단위로 동기화하므로 디스크 탐색을 거의 수행하지 않습니다.
여러 번 연속적으로 쓰기 작업이 발생한 블럭은 한 번만 동기화하므로 보다 빠르게 동기화 합니다.
동기화하는 동안 대기(Standby)노드의 데이터 일부는 과거의 변경 전 내용이 되고 일부는 최신으로 업데이트됩니다. 이러한 데이터의 상태를 Inconsistent 상태라고 하고 모든 블럭이 최신 데이터로 동기화 완료된 상태를 UpToDate 상태라고 합니다. Inconsistent 상태의 노드는 일반적으로 볼륨이 사용가능하지 않은 상태이므로 이 상태는 가능한 짧게 유지하는 것이 바람직합니다.
물론 백그라운드에서 동기화가 진행되는 동안 Active 노드의 응용 서비스는 중단되지 않고 계속해서 수행할 수 있습니다.
가변 대역 동기화(Variable-rate synchronization)
가변 대역 동기화는 가용한 네트워크의 대역폭을 감지한 후 애플리케이션으로부터 수신된 I/O와 비교하여, 적절한 동기화 속도를 자동적으로 계산합니다. BSR은 가변대역 동기화를 기본 설정으로 합니다.
가변 대역 동기화에 관한 구성은 가변적인 동기화 속도의 설정(Variable sync rate configuration)을 참고하세요.
고정 대역 동기화(Fixed-rate synchronization)
고정 대역 동기화에서는 초당 상대 노드로 동기화하는 데이터 속도를 상한선 내에서 조정할 수 있으며(이를 synchronization rate라고 합니다) 최소값과 최대값을 지정할 수 있습니다.
이 상한선에 의거하여 , 아래와 같은 간단한 수식으로 동기화 시간을 추정할 수 있습니다.
tresync 는 동기화 예상 시간입니다.
D는 별다른 영향(복제 링크가 끊어진 상황에서 데이터가 수정되는 등)을 거의 받지 않는다는 가정하에서 동기화될 데이터의 크기를 말합니다.
R은 조정 가능한 동기화율이며 이는 복제 네트워크 환경 및 I/O 서브시스템의 처리능력에 따라 한계 값이 달라집니다.
고정 대역 동기화에 관한 구성은 고정적으로 동기화 속도를 설정하는 방법(Configuring the rate of synchronization)을 참고하세요.
체크섬 기반 동기화(Checksum-based synchronization)
체크섬 데이터 요약을 사용하면 동기화 알고리즘의 효율성을 더욱 개선할 수 있습니다. 체크섬 기반 동기화는 동기화하기 전에 블록을 읽고 현재 디스크에 있는 내용의 해시(hash) 요약을 구한 다음, 상대 노드로부터 같은 섹터를 읽어 구한 해쉬 요약 내용과 비교합니다. 해시 내용이 일치하면 해당 블럭에 대한 동기화 쓰기(re-write)를 생략합니다. 이 방식은 동기화 해야 될 블럭을 단순히 덮어쓰는 방식에 비해 성능에서 유리할 수 있으며 연결이 끊어진(disconnect 상태) 동안 파일 시스템이 섹터에 같은 내용을 다시 썼다면 해당 섹터에 대해선 재동기화를 생략하게 되므로 전체적으로 동기화 시간을 단축시킬 수 있습니다.
체크섬 동기화에 관한 구성은 체크섬 기반 동기화 구성(Configuring checksum-based synchronization)을 참고하세요.
혼잡 모드
BSR은 비동기 복제 시 복제 네트워크의 혼잡도를 감지할 수 있는 혼잡모드 기능을 제공합니다. 혼잡 상태로 진입하면 primary 노드의 I/O는 디스크에 우선 기록하고 해당 영역은 out-of-sync로 기록하여 Secondary 노드에 비해 데이터 측면에서 앞서 있는(Ahead) 상태가 됩니다. 이 시점에 Secondary는 뒤 쳐진(Behind) 상태가 되지만 디스크는 일관성이 보장된 가용한 상태입니다. 혼잡 상태가 해제되면, 세컨더리로의 복제는 자동으로 재개되며 Ahead 상태에서 복제되지 못했던 out-of-sync 블럭에 대해 백그라운드 동기화를 자동으로 수행합니다.
혼잡모드는 일반적으로 데이터센터 또는 클라우드 인스턴스간의 공유연결을 통한 광역 복제 환경과 같은 가변 대역폭을 가진 네크워크 링크 환경에서 유용합니다.
혼잡 모드에 대한 자세한 내용은 "혼잡모드와 혼잡정책”을 참고하시기 바랍니다.