리소스를 생성하고 삭제하기 까지의 일반적인 관리작업에 대해 설명합니다.
리소스 생성
리소스 생성은 앞 절에서 설명한 리소스 구성파일을 준비하는 작업입니다. 구성파일을 작성했다면 리소스를 생성한 것으로 간주합니다. bsr 에서는 이 과정을 사용자가 수작업으로 수행해야 하며 이를 위한 별도의 CLI 나 API 는 제공 되지 않습니다.
한 번 구성파일을 작성하여 리소스가 생성되면 구성파일이 삭제 되기 전 까지는 해당 리소스가 생성된 상태로 계속 유지되고, 구성파일을 삭제해야 만 노드 상의 리소스를 완전히 삭제할 수 있습니다.
메타 초기화
리소스가 생성되면 최초 기동을 위해 메타디스크를 초기화 해야 합니다. 메타 디스크의 초기화는 다음의 명령으로 수행합니다.
>bsradm create-md r0 initializing activity log NOT initializing bitmap Writing meta data... New drbd meta data block successfully created.
메타초기화는 복제를 위해 필요한 부가 정보들을 메타디스크 상에서 초기화하는 작업으로 리소스를 최초 기동하기 전 한번 만 수행하면 됩니다. 만일 메타를 초기화 하지 않고 리소스를 기동할 경우 비정상적인 운영상황이 되므로 주의해야 합니다.
메타초기화가 완료되면 리소스를 기동할 준비가 된 상태 입니다.
리소스 기동
bsradm up 명령을 통해 리소스를 기동할 수 있습니다. up 은 내부적으로 다음의 과정을 순차적으로 수행하여 리소스를 기동합니다.
리소스를 위한 메모리 등의 자원을 할당합니다.
복제 볼륨을 적재하고 구성파일에 지정된 옵션들을 리소스에 설정합니다.
네트워크를 통해 상대편 노드와 연결합니다.
>bsradm up r0 >bsradm status r0 r0 role:Secondary disk:Inconsistent node0 role:Secondary peer-disk:Inconsistent
bsr 의 상태는 bsradm status 명령으로 조회할 수 있습니다. 이와 관련한 자세한 내용은 조회의 내용을 참고하세요.
리소스 할당
리소스를 위한 메모리를 할당하고 초기화 합니다.
볼륨 적재
리소스에 구성된 볼륨을 복제볼륨으로 적재(attach)하고 메타디스크의 정보를 조회하여 로드하고 구성파일에 설정된 옵션들을 적용합니다. 볼륨의 적재는 별도의 attach 명령으로도 개별 수행할 수 있습니다.
복제 연결
적재된 볼륨을 피어노드의 리소스 볼륨과 연결합니다. 연결이 수립되면 복제 상태는 Established 가 되고 복제를 시작하기 위한 대기상태가 됩니다. 만일 피어 노드가 연결을 아직 준비하고 있지 않았다면 로컬의 리소스는 연결 시도 중(Connecting) 상태를 유지합니다. 복제 연결은 개별 connect 명령으로도 수행할 수 있습니다.
리소스 up 의 과정이 위 절차에 따라 순차적으로 모두 수행되었을 때 리소스 기동에 대한 성공으로 간주 합니다. 리소스 기동의 과정 중 일부 절차가 실패할 경우 리소스 기동이 중단될 수 있습니다. 이럴 경우 리소스의 상태를 확인하고 bsr 로그와 에러 메시지 등을 통해 문제를 파악할 수 있습니다.
승격
리소스는 Primary 또는 Secondary 역할을 가질 수 있습니다. Primary 역할의 리소스는 볼륨 장치에 제한 없이 접근하여 데이터를 읽고 쓸 수 있지만 Secondary 역할의 리소스는 사용자 계층으로부터의 볼륨장치로의 접근이 완전히 차단되고 Primary 로 부터 수신한 데이터만 장치에 반영하는 역할을 수행합니다.
리소스가 기동되었을 때 기본 역할은 Secondary 이며 사용자 명령에 의해 Primary 역할로 전환할 수 있습니다. 이것을 승격(promote)이라고 합니다.
bsrdadm primary <resource>
초기 동기화
리소스가 초기 기동된 상태에서는 디스크의 상태가 양 노드 Inconsistent 상태이며 이 상태는 기본적으로 디스크를 승격할 수 없는 상태 입니다. 따라서 리소스에 대한 최초 승격은 강제옵션으로 승격하고 강제승격 이후 자동적으로 초기 동기화로 이어집니다. 강제 승격은 다음과 같이 수행합니다.
bsrdadm primary --force <resource>
복제 클러스터 내의 모든 노드가 연결된 상태에서 Primary 역할을 가질 수 있는 노드는 하나만 존재할 수 있습니다. 그러나 노드 간 연결이 단절될 경우 상황에 따라 특정시점에 Primary 역할을 가졌던 노드가 2 이상이 될 수 있습니다. 이러한 상태를 스플릿 브레인 상태라고 합니다.
이와 관련한 자세한 내용은 스플릿 브레인 항목을 참고하세요.
리눅스 환경의 경우에는 승격을 한 후 볼륨을 사용하기 위해서 마운트 과정이 요구되지만, 윈도우즈 환경에선 볼륨에 대한 마운트가 운영체제의 쉘 수준에서 자동으로 수행되기 때문에 별도의 마운트 작업이 필요치 않습니다.
강등
Primary 역할에서 Secondary 역할로 전환하는 것을 강등이라고 합니다.
bsradm secondary <resource>
리눅스 환경의 경우 강등을 수행하기 전 볼륨에 대한 마운트 해제의 과정이 요구됩니다. 윈도우즈 환경에선 강등명령 내부적으로 마운트 해제를 선 수행하기 때문에 별도의 마운트 해제 과정이 필요치 않습니다.
마운트 해제와 리소스 강등은 bsr의 명령 동작 중 가장 부하가 큰 작업으로 Secondary 로 역할을 전환하는 것과 함께 복제 계류 중인 데이터들을 타깃 측으로 모두 반영하는 작업을 수반합니다. 이는 복제 소스와 타깃 간의 데이터 정합성을 일치시키기 위한 기본 동작 구조로, 강등이 완료된 시점의 Primary 와 Secondary 간의 데이터 정합성을 보장하는 동작입니다. 따라서 마운트 해제, 강등을 수행하는 절차에선 복제 계류중인 데이터를 타깃에 모두 반영하는데 따르는 일정 정도의 대기시간을 염두에 두어야 합니다.
수동절체
수동 절체를 위한 절차는 다음과 같습니다.
primary 노드에서 bsr 디바이스를 사용하는 모든 응용 프로그램이나 서비스를 중지하고, 리소스를 secondary로 강등시킵니다.
bsradm secondary <resource>
primary로 승격시키고자 하는 노드에서 다음 명령을 실행합니다.
bsradm primary <resource>
리소스 중지
bsradm down 명령을 통해 리소스를 중지할 수 있습니다. down 은 리소스 앞서 설명한 up 과정의 역순에 따라 중지가 수행하고 만약 리소스가 승격된 상태 였다면 강등을 먼저 수행합니다. 즉 리소스 강등, 복제 단절, 볼륨 분리(detach), 리소스 해제의 순으로 down 합니다.
bsradm down <resource>
리소스 강등
리소스가 승격된 상태였다면 먼저 강등을 수행합니다.
복제 단절
복제 연결을 단절하여 복제를 중단합니다. 연결 단절은 disconnect 개별 명령으로도 수행할 수 있습니다.
만약 동기화나 복제가 진행 중일 때 복제 단절을 시도할 경우 단절은 일정 시간 동안 유예될 수 있습니다. 이것은 복제를 단절하는 명령이 로컬과 피어노드에게 모두 전달되는 명령이기 때문에 이미 복제를 위해 버퍼링된 데이터 양이 많을 경우 순차적처리 구조에 따라 명령전달이 지연될 수 있기 때문입니다. 이러한 지연을 무시하고 싶을 경우에는 --force 옵션을 통해 로컬에서 강제로 연결을 단절할 수도 있습니다. 강제로 단절하게 되면 연결을 빠르게 끊을 수는 있으나 복제나 동기화를 위한 계류중인 데이터들이 모두 버려지게 되므로 해당 데이터들에 대한 OOS(Out-Of-Sync) 가 발생할 수 있다는 점은 고려해야 합니다.
볼륨 분리
복제 볼륨으로 적재했던 볼륨을 분리하고 메타디스크에 관련 정보를 기록합니다. 분리(detach)는 개별 명령으로 수행할 수 있으나 Primary 리소스의 볼륨에 대한 분리는 허용되지 않습니다.
bsr 에선 운영 중인 리소스의 볼륨 분리는 장애로 직결되기 때문에 위험한 동작으로 간주했으며 Primary 리소스의 볼륨 detach 를 코드 수준에서 차단하였습니다. 물론 Secodnary 리소스의 볼륨 분리는 허용합니다.
리소스 해제
리소스를 위해 할당 했던 자원들을 해제합니다.
리소스 재구성
bsr 의 리소스 속성들은 기본적으로 운영 중(런타임) 설정 변경을 지원합니다. 이것을 동적 설정 (변경)이라고 합니다. 그러나 이러한 속성들 중 일부 필수 속성들은 동적 설정을 지원하지 않으며 구성파일의 설정을 변경한 후 리소스를 재기동하여 적용하는 정적 방식으로 재구성해야 합니다. 즉 정적 설정의 경우 리소스 재기동이 필요합니다.
동적 설정
구성파일을 변경하고 bsradm adjust 명령을 통해 실시간 변경합니다. 복제 프로토콜 변경 등 일부 특수 설정을 제외한 대부분의 속성은 이 방식으로 변경할 수 있습니다.
복제 프로토콜 변경
운영 중 복제 프로토콜을 변경하기 위해서 프로토콜, 송신버퍼, 혼잡제어 설정을 같이 변경해야 합니다.
먼저 drbdsetup del-peer <resource> <node-id> 명령으로 peer 연결을 삭제합니다.
양 노드 리소스 파일의 sndbuf-size 의 크기, 프로토콜, 혼잡제어 설정을 조정합니다.
drbdadm adjust <resource> 로 적용합니다.
정적 설정
복제 구성을 위한 필수적인 설정(노드 ID, IP 주소, 포트, 볼륨 등)의 변경이 필요할 경우 리소스 down 을 선행한 후 설정을 변경해야 합니다. 구성파일을 변경한 후 다시 up 하여 리소스가 재시작되는 시점에 변경된 설정이 반영됩니다.
전체 재구성
구성을 완전히 변경해야 하거나 디스크 장애등을 위한 복구가 필요한 경우 리소스 전체를 재 구성해야 합니다. 이 경우에는 먼저 운영 중인 리소스를 down 한 후 구성을 변경하고 메타 재 초기화를 수행하여 리소스를 재 기동해야 합니다.
Windows 의 경우 전체 재구성 과정에서 볼륨에 걸려있는 락을 해제해야 할 경우가 있습니다. 이럴 때에 bsrcon 유틸리티의 /m 옵션을 사용하여 볼륨락을 해제할 수 있습니다.
메타 디스크를 초기화하면 볼륨에 대한 초기 동기화의 절차를 다시 수행해야 합니다.
볼륨 크기 조정
리소스 삭제
구성파일을 삭제 함으로써 리소스가 삭제됩니다. 보통 운영 중일 경우에는 다음의 절차를 통해 리소스를 삭제 합니다.
운영 중인 리소스를 down 합니다.
bsrcon /m 을 통해 볼륨에 걸려있는 락을 해제 합니다.
리소스 구성파일을 삭제 합니다.
조회
버전
bsradm /V 명령을 통해 bsr의 버전 정보를 확인합니다.
[root@bsr-01 nglee]# bsradm -V BSRADM_BUILDTAG=GIT-hash:3dca67e82d331e95121288a57898fcda13357e94 build by nglee@NGLEE-1,2020-01-29 13:50:48 BSRADM_API_VERSION=2 BSR_KERNEL_VERSION_CODE=0x000000 BSR_KERNEL_VERSION=0.0.0 BSRADM_VERSION_CODE=0x010600 BSRADM_VERSION=1.6.0-PREALPHA3
상태정보
기본적인 상태 정보를 출력합니다.
>bsradm status r0 r0 role:Secondary disk:UpToDate nina role:Secondary disk:UpToDate nino role:Secondary disk:UpToDate nono connection:Connecting
상세 정보를 출력합니다.
C:\>bsrsetup status r0 --verbose --statistic r0 node-id:0 role:Secondary suspended:no write-ordering:flush volume:0 minor:2 disk:Inconsistent size:4096000 read:0 written:0 al-writes:0 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no WIN2012R2_2 node-id:1 connection:Connected role:Secondary congested:no volume:0 replication:Established peer-disk:Inconsistent resync-suspended:no received:0 sent:0 out-of-sync:0 pending:0 unacked:0
성능지시자
sent
(network send). 네트워크 연결을 통해 상대 노드에 전송된 네트워크 데이터의 양입니다. (Kibyte)received
(network receive). 네트워크 연결을 통해 상대 노드에서 수신된 네트워크 데이터의 양입니다. (Kibyte)written
(disk write). 로컬 하드 디스크에 기록된 넷 데이터입니다. (Kibyte)read
(disk read). 로컬 하드 디스크로부터 읽은 넷 데이터입니다. (Kibyte)al-writes
(activity log). 메타 데이터의 activity log 영역에 대한 업데이트 횟수입니다.bm-writes
(bit map). 메타 데이터의 비트맵 영역에 대한 업데이트 횟수입니다.upper-pending
(application pending I/O ). 상위에서 DRBD 로 전달된 I/O 들 중 완료되지 못하고 DRBD에서 처리중인 I/O 개수 .lower-pending
(subsystem open count). WDRBD에서 수행한 로컬 I/O sub-system에 대한 (close 되지 않은) open 횟수.pending
. 상대 노드에게 요청하였지만 응답(ack)받지 못한 요청 횟수입니다.unacked
(unacknowledged). 네트워크 연결을 통해 상대 노드에서 요청을 받았지만 응답(ack)해 주지 않은 요청 횟수입니다.write-ordering
(write order). 현재 사용되는 쓰기 방법을 나타냅니다.(기본 flush)out-of-sync
. 현재 동기화가 이루어지지 않은 스토리지의 양을 나타냅니다. (Kibytes)resync-suspended
. 재 동기화 중단 여부. 가능한 값 은 no,user, peer, dependencyblocked
. 로컬 I/O 혼잡상태 표시no
: 혼잡없음upper
: 상위 디바이스에서 혼잡발생lower
: 디스크 혼잡
congested. 이 플래그는 복제 연결상의 TCP 송신 버퍼가 80 % 이상 채워 졌는지 여부를 알려줍니다.
yes: 네트웍 혼잡
no: 혼잡없음
네트워크 연결상태를 출력합니다.
C:\>bsradm cstate r0 Connected
연결상태
StandAlone. 리소스가 아직 연결되지 않았거나, 사용자가 drbdadm disconnect를 사용하여 연결을 끊었거나, 인증 실패 또는 스플릿 브레인과 같은 이유로 연결이 끊어져 네트워크 구성이 가능하지 않은 상태입니다.
Disconnecting. 연결이 끊어지는 동안의 일시적인 상태입니다. 다음 상태: StandAlone
Unconnected. 연결을 시도하기 전의 일시적인 상태입니다. 다음 상태: Connecting 또는 Connected.
Timeout. 상대 노드와의 통신 시간 초과에 따른 일시적인 상태입니다. 다음 상태: Unconnected
BrokenPipe. 상대 노드와의 연결이 끊어진 후 일시적으로 표시되는 상태입니다. 다음 상태: Unconnected
NetworkFailure. 상대 노드와의 연결이 끊어진 후 일시적으로 표시되는 상태입니다. 다음 상태: Unconnected
ProtocolError. 상대 노드와의 연결이 끊어진 후 일시적으로 표시되는 상태입니다. 다음 상태: Unconnected
TearDown. 상대 노드가 연결 종료 중임을 나타내는 일시적인 상태입니다. 다음 상태: Unconnected
Connecting. 상대 노드가 네트워크에서 확인 되기를 기다리고 있는 상태입니다.
Connected. TCP 연결이 설정되었으며, 상대 노드로부터 첫 번째 네트워크 패킷을 기다립니다.
복제상태
Off 상대노드와 연결이 끊어졌거나, 복제가 진행되지 않는 상태입니다.
Established. 정상적으로 연결된 상태입니다. WDRBD 연결이 설정되었으며, 데이터 미러링이 활성화됩니다.
StartingSyncS. 로컬 노드가 소스이고, 사용자에 의해 전체 동기화가 시작된 상태입니다. 다음 상태: SyncSource 또는 PausedSyncS
StartingSyncT. 로컬 노드가 타겟이고, 사용자에 의해 전체 동기화가 시작된 상태입니다. 다음 상태: WFSyncUUID
WFBitMapS. 부분 동기화가 시작됩니다. 다음 상태: SyncSource 또는 PausedSyncS
WFBitMapT. 부분 동기화가 시작됩니다. 다음 상태: WFSyncUUID
WFSyncUUID. 동기화가 시작되려고 하는 상태입니다. 다음 상태: SyncTarget 또는 PausedSyncT
SyncSource. 로컬 노드가 소스이고, 동기화가 진행 중인 상태입니다.
SyncTarget. 로컬 노드가 타겟이고, 동기화가 진행 중인 상태입니다.
VerifyS. 로컬 노드가 소스이고, On-line 디바이스 검증이 실행 중입니다.
VerifyT. 로컬 노드가 타겟이고, On-line 디바이스 검증이 실행 중입니다.
PausedSyncS. 로컬 노드가 소스이고, 다른 동기화 작업 완료에 대한 의존성 또는 수동 명령 (drbdadm pause-sync)에 의해 동기화가 일시 정지된 상태입니다.
PausedSyncT. 로컬 노드가 타겟이고, 다른 동기화 작업 완료에 대한 의존성 또는 수동 명령 (drbdadm pause-sync)에 의해 동기화가 일시 정지된 상태입니다.
Ahead. 로컬노드가 네트워크 혼잡상태에 도달하여 복제데이터를 전송할 수 없는 상태입니다. (상대노드로 OOS Info 전송)
Behind. 상대노드가 네트워크 혼잡상태에 도달하여 복제데이터를 수신할 수 없는 상태입니다. (이후 SyncTarget 상태로 전환)
연결상태와 복제상태를 구분하여 표기합니다. 양 노드가 연결되기 전 까지는 연결상태가 StandAlone 에서 Connecting 사이에서 변화합니다. 연결이 성립된 이후는 연결상태가 Connected로 유지되고, 복제 상태는 Established 에서 부터 운영상황에 따라 여러가지 상태로 전환 됩니다.
복제 상태는 특정 시점에 하나의 상태만을 가질 수 있으며, 특히 노드가 소스 상태이면 피어노드는 타깃의 상태여야 합니다.
다음은 리소스의 역할을 출력하는 예 입니다.
C:\Program Files\drbd>drbdadm role r0 Primary/Secondary
리소스는 다음 중 하나의 역할을 가집니다.
Primary. 읽기와 쓰기가 가능한 상태입니다. 클러스터 내에서 하나의 노드만 이 역할을 가질 수 있습니다.
Secondary. primary 노드로부터 디스크 변경 분을 업데이트 하며 읽기와 쓰기가 불가능한 상태입니다. 하나 또는 여러 노드에서 가질 수 있는 역할입니다.
Unknown. 리소스의 역할을 알 수 없는 상태입니다. disconnected 모드에서 상대 노드의 역할을 표시할 때 사용되며, 로컬 노드의 역할을 표시할 때는 사용되지 않습니다.
다음은 디스크의 상태 입니다.
C:\Program Files\drbd>drbdadm dstate r0 UpToDate/UpToDate
로컬 및 원격 디스크의 상태는 다음 중 하나의 값을 가집니다.
Diskless. 로컬 블록 디바이스가 BSR 드라이버에 할당되지 않은 상태입니다. 리소스가 백업 디바이스에 적재된 적이 없거나, drbdadm detach <resource> 명령으로 수동 분리되었거나, lower-level I/O 오류 후에 자동으로 분리된 경우 이 상태가 됩니다.
Attaching. 메타 데이터를 읽는 동안의 일시적인 상태입니다.
Failed. 로컬 블록 디바이스의 I/O 실패 보고에 따른 일시적인 상태입니다. 다음 상태는 Diskless 입니다.
Negotiating. 이미 연결된 디바이스에서 Attach 가 실행되었을 때 일시적으로 이 상태가 됩니다.
Inconsistent. 데이터가 불일치한 상태입니다. 새로운 리소스를 구성했을 경우 양 노드의 디스크는 이 상태가 됩니다. 또는 동기화 중인 타겟 노드의 디스크 상태입니다.
Outdated. 리소스의 데이터가 일치하지만, 최신 데이터는 아닌 상태입니다.
DUnknown. 네트워크 연결을 사용할 수 없는 경우, 원격 디스크의 상태를 표시하기 위해 사용됩니다.
Consistent. 노드가 연결되는 과정에서 데이터는 일치한 상태로 간주된 일시적 상태입니다. 연결이 완료되면, UpToDate 인지 Outdated 인지 결정됩니다.
UpToDate. 데이터 정합성이 일치하고 최신의 상태입니다. 복제 중의 일반적인 상태입니다.
bsr은 Inconsistent 데이터와 Outdated 데이터를 구분합니다. Inconsistent 데이터란 어떤 식으로든 접근이 불가능하거나 사용할 수 없는 데이터를 말합니다. 대표적인 예로 동기화 진행 중인 타겟 쪽 데이터가 inconsistent 상태 입니다. 타겟 쪽 데이터는 동기화가 진행중일 때 일부는 최신이지만 일부는 지난 시점의 데이터 이므로 이를 하나의 시점인 데이터로 간주하는 것이 불가능합니다. 그런 경우에는 장치에 파일시스템이 있는 경우 그 파일시스템은 마운트(mount) 될 수 없거나 파일시스템 체크 조차도 수행되지 못하는 상태 일 수 있습니다.
Outdated 데이터는 특정시점의 데이터 정합성은 보장되지만 프라이머리(Primary) 노드와 최신의 데이터로 동기화되지 않은 데이터 입니다. 이런 경우는 임시적이든 영구적이든 복제 링크가 중단할 경우 발생합니다. 연결이 끊어진 Oudated 데이터를 사용하는데 별 문제는 없지만 이것은 결국 지난 시점의 데이터 입니다. 이런 데이터에서 서비스가 되는 것을 막기 위해 bsr은 Outdated 데이터를 가진 리소스에 대한 승격을 기본적으로 허용하지 않습니다. 그러나 필요하다면(긴급한 상황에서) Outdated 데이터를 강제로 승격할 수는 있습니다.
이벤트
다음과 같은 명령으로 실시간 이벤트 발생 상태를 확인할 수 있습니다. events2 명령은 '--statistics', '--timestamp' 옵션과 함께 사용할 수 있습니다.
C:\Program Files\drbd\bin>drbdsetup events2 --now r0
exists resource name:r0 role:Secondary suspended:no
exists connection name:r0 peer-node-id:1 conn-name:remote-host connection:Connected role:Secondary
exists device name:r0 volume:0 minor:7 disk:UpToDate
exists device name:r0 volume:1 minor:8 disk:UpToDate
exists peer-device name:r0 peer-node-id:1 conn-name:remote-host volume:0
replication:Established peer-disk:UpToDate resync-suspended:no
exists peer-device name:r0 peer-node-id:1 conn-name:remote-host volume:1
replication:Established peer-disk:UpToDate resync-suspended:no
exists -
동기화 속도 조정
동기화가 백그라운드에서 동작하면 타깃의 데이터는 일시적으로 불일치(Inconsistent)한 상태가 됩니다. 이러한 Inconsistent 상태는 가능한 짧게 유지해야 정합성 보장 측면에서 좋기 때문에 동기화 속도가 충분하게 설정되어 있어야 유리합니다. 그러나 복제와 동기화는 같은 네트워크 대역을 공유하고 있으며 만약 동기화 대역이 높게 설정된다면 상대적으로 복제 대역은 적게 부여될 수 밖에 없습니다. 복제 대역이 낮아지면 로컬의 I/O latency에 영향을 주게 되고 결과적으로 운영 서버의 로컬 I/O 성능 저하를 가져오게 됩니다. 복제든 동기화든 어느 한쪽이 일방적으로 대역을 많이 점유하면 상대적으로 다른 쪽 동작에 영향을 주게 되므로 bsr 은 복제 대역을 최대한 보장하면서 동기화 대역을 복제 상황에 따라 적당히 조절하는 가변대역 동기화를 구현하고 있으며 이를 기본 정책으로 사용합니다. 이와 반대로 고정대역 동기화 정책은 복제에 관계없이 동기화 대역을 항상 보장하는 방식으로 서버 운영 중에 사용할 경우 로컬 I/O 성능의 저하를 가져올 수 있으므로 일반적으로는 권장되지 않고 특수한 상황에서만 사용해야 합니다.
복제와 동기화
복제는 로컬에서 발생하는 디스크의 변경 분 I/O 를 타깃에 실시간 반영하는 동작입니다. 변경 분 I/O가 로컬 디스크에 쓰여지는 문맥에서 복제가 수행 되므로 로컬 I/O 지연에 영향을 줍니다.
동기화는 전체 디스크 볼륨 중 동기화 되지 않은 영역(out-of-sync)을 대상으로 소스 측 디스크의 데이터를 타깃의 데이터와 일치시키는 동작입니다. 0번 디스크 섹터를 시작점으로 하여 볼륨의 마지막 섹터 까지 순차적으로 처리됩니다.
이러한 차이를 명확하게 구분하기 위해 bsr은 복제와 동기화를 항상 구분하여 기술합니다.
대기노드의 최대 디스크 쓰기 속도 보다 높은 값으로 동기화 속도를 설정하는 것은 의미가 없습니다. 대기노드는 진행 중인 디바이스 동기화의 타깃이 되기 때문에 대기 노드가 허용하는 I/O 서브시스템의 쓰기 속도보다 동기화 속도가 더 빠를 수는 없습니다. 같은 이유로, 복제 네트워크에서 사용할 수 있는 대역폭보다 더 높은 값으로 동기화 속도를 설정하는 것도 의미가 없습니다.
고정대역 동기화
백그라운드에서 수행되는 재동기화를 위해 사용되는 최대 대역폭은 리소스의 resync-rate 옵션에 따라 결정됩니다. 해당 옵션은 다음과 같이 /etc/drbd.conf 리소스 구성의 disk 섹션에 포함되어 있습니다.
resource <resource> { disk { resync-rate 40M; c-min-rate 40M; c-plan-ahead 0; ... } ... }
resync-rate, c-min-rate 설정은 초당 바이트 단위로 지정됩니다. 기본 단위는 Kibibyte이고 4096의 값은 4MiB로 해석됩니다.
Important
c-plan-ahead 파라미터가 양수 값으로 설정되어 있을 경우 동적으로 동기화 속도를 조절합니다. 이 값은 기본적으로 20 으로 설정되어 있으며 고정적인 동기화 속도를 위해서는 이 값을 0 으로 설정해야 합니다.
c-min-rate는 복제와 동기화가 동시에 진행될 때 최소한의 동기화 속도를 설정하기 위한 파라미터입니다. 이 값은 기본적으로 250k 로 설정되어 있으며 만약 고정적인 동기화 속도를 보장하려면 resync-rate와 동일한 값 으로 설정해야 합니다.
가변대역 동기화
예를 들어, 다중 리소스가 복제/동기화 네트워크를 공유하는 구성일 경우 고정대역 동기화는 최적의 방법이라 할 수 없습니다. 동일 복제 네트워크를 공유하기 때문에 특정 복제 채널에 대해서 동기화율이 점유 당할 경우 고정 동기화율이 보장되지 않게 됩니다. 이 경우, 가변대역 동기화를 통해 각각의 복제 채널의 동기화율을 동적으로 조정 하도록 구성하여 동기화율이 점유당하는 것을 완화시킬 수 있습니다. bsr은 이 모드에서 초기 동기화 속도를 결정한 후 자동 제어 루프 알고리즘을 통해 지속적으로 동기화 속도를 조정합니다. 이 알고리즘은 포그라운드 복제가 가능하도록 충분한 대역폭을 보장하며, 백그라운드 동기화가 포그라운드 I/O에 미치는 영향을 크게 완화시킵니다.
가변대역 동기화를 위한 최적의 구성은 사용 가능한 네트워크 대역폭, 응용 프로그램 I/O 패턴 및 복제 링크 혼잡상황에 따라 달라질 수 있으며, 복제 가속기(DRX) 사용 여부에 따라 최적의 구성 설정이 달라질 수 있습니다.
효율적인 동기화
체크섬 기반 동기화
운송 동기화
비트맵 제거 동기화
정합성 검증
트래픽 무결성 검사
온라인 데이터 정합성 검사
혼잡 대응
비동기 방식 복제에서 만 사용합니다.
복제 대역폭이 가변적인 환경(WAN 복제 환경)에서는 때때로 복제 링크가 정체 될 수 있습니다. 이로 인해 Primary 노드의 I/O가 대기하게 되면 로컬 I/O의 성능저하가 발생하기 때문에 바람직하지 않습니다. 이러한 혼잡 상황을 감지할 경우 진행 중인 복제를 일시 중단하도록 구성할 수 있습니다. 대신 이렇게 복제가 중단되는 상황에서는 Primary 측의 데이터 세트가 Secondary의 데이터보다 앞선 상태(Ahead)가 되고 이 앞서간 데이터 블럭들은 OOS(Out-Of-Sync) 로 기록하여 혼잡이 해제되면 이미 기록한 OOS를 백그라운드 재동기화를 통해 해소합니다. 다음은 혼잡 정책을 설정하는 예 입니다.
리소스 구성파일에는 on-congestion 옵션 항목으로 혼잡모드를 설정하고, congestion-fill 항목으로 혼잡에 대한 인식 임계치를 설정합니다.
resource <resource> { net { sndbuf-size 20M; on-congestion pull-ahead; congestion-fill 2G; congestion-extents 2000; ... } ... }
pull-ahead 옵션은 congestion-fill 및 congestion-extents와 함께 사용됩니다. congestion-fill의 권장 값은 다음과 같습니다.
복제 가속기(DRX)를 연동하는 경우 DRX 버퍼 크기의 약 90% 로 설정합니다.
DRX를 연동하지 않을 경우엔 sndbuf-size 의 90% 크기로 설정합니다
congestion-extents의 권장 값은 al-extents 설정값의 90%입니다.