개요
WDRBD 의 etc/drbd.conf
파일은 drbdadm
에 의해 읽혀집니다.
파일 포멧은 클러스터의 양쪽 노드에 있는 파일의 글자 그대로의 복사본을 가질수 있도록 설계되어 있습니다. 이것은 구성을 유지관리 할 수 있도록 하기위해 적극 권장됩니다. WDRBD 설치폴더의 etc/drbd.conf
파일은 클러스터의 양쪽 노드에서 동일해야하며, WDRBD 의 etc/drbd.conf
에 대한 변경은 즉시 적용되지 않습니다.
관례 상 주요 설정은 두 문장을 포함하고 있습니다. 첫 번째는 WDRBD 의 etc/drbd.d/global_common.conf
파일을, 두번째는 .res
접미사가 있는 모든 파일을 포함합니다.
resource r0 { net { protocol C; } disk { resync-rate 10M; c-plan-ahead 0; } on alice { volume 0 { device e minor 2; disk e; meta-disk f; } address 10.1.1.31:7789; } on bob { volume 0 { disk e; meta-disk f; } address 10.1.1.32:7789; } } |
이 예에서, 해당 디바이스들 사이에 연결을 위한 프로토콜 C를 사용하는 하나의 WDRBD 리소스(이름은 r0)가 있습니다.
이 리소스에는 데이타를 위한 디스크 e
드라이브를 사용하는 alice 호스트에서 실행되는 단일 볼륨을 포함하고 있습니다.
IP주소는 사용할 네트워크 인터페이스를 지정하는 데 사용됩니다.
재동기화가 발생하는 경우 재동기화 프로세스는 초당 10MByte 의 IO 대역폭만 사용하게 됩니다.
이 sync-rate
문장은 볼륨 0에 대해서 유효하지만, 더 많은 볼륨에 대해서도 유효할 수 있습니다. 이 예에서는 각 볼륨에 전체 10MByte/second를 지정합니다.
하나의 drbd.conf
파일에 다중 리소스 섹션이 있을 수 있습니다.
파일 포맷
파일은 섹션 및 파라미터로 구성되어 있습니다. 섹션은 키워드, 때로는 추가적인 이름, 그리고 여는 중괄호(“{”)로 시작하며 닫는 중괄호(“}”
)로 끝납니다. 그리고 중괄호는 파라메터를 감싸고 있습니다.
section [name] { parameter value; [...] }
파라메터는 공백 뒤에 파라메터의 식별자와 함께 시작합니다. 모든 후속 문자는 파라메터 값의 일환으로 간주됩니다. 식별자 만으로 구성된 Boolean
파라메터처럼 특별한 경우가 있다. 파라메터는 세미콜론(";"
)에 의해 종료됩니다.
일부 매개변수 값은 K, M 또는 G 기본 단위를 지정할 수 있으며 이들 단위는 일반인 단위들입니다.(K = 2^10 = 1024, M = 1024 K, G = 1024 M
).
속성파일에 주석을 넣을 수 있으며, 반드이 해시기호 (“#”
)로 시작해야 합니다. 주석은 라인이 끝나는 지점까지 유효합니다.
common [disk] [handlers] [net] [options] [startup] global resource connection path net connection-mesh net [disk] floating handlers [net] on volume disk [disk] options |
섹션
global
글로벌 파라미터를 정의합니다. 현재는 minor-count, disable-ip-verification
만 사용가능합니다. 첫번째 섹션으로 하나의 global
섹션만 사용할 수 있습니다.
common
이 섹션에 설정된 옵션들은 모든 리소스에 상속됩니다. common
섹션은 startup, options, handlers, net
그리고 disk
섹션이 포함될 수 있습니다.
resource name
WDRBD 리소스를 구성합니다. 각 resource
섹션은 두개(혹은 더 이상)의 host
섹션이 있어야 하고 startup, options, handlers, net
그리고 disk
섹션이 포함될 수 있습니다.
on host-name
WDRBD 디바이스의 필요한 구성 파라미터를 전달합니다. host-name
은 필수이며 노드중에 하나의 Windows 호스트 이름과 일치해야 합니다.
resource r1 { protocol C; meta-disk m; on alice { address 10.2.2.100:7801; disk e; } on bob { address 10.2.2.101:7801; disk e; } } |
또한, floating
섹션 키워드를 참조하시기 바랍니다. 이 섹션에서 요구되는 문법은: address
와 volume
입니다.
floating AF addr:port
WDRBD 디바이스의 필요한 구성 파라미터를 전달합니다. 이 섹션은 on
섹션과 매우 비슷합니다. on
섹션과의 차이점은 host
섹션의 호스트 이름 대신 IP 주소가 사용되는 것이 차이점입니다.
이 섹션에서 필요한 파라메터는 리소스 섹션으로부터 상속받을 수 있는 모든 것과 disk, meta-disk
이며, 이 경우 address
식별자로 이 섹션을 짧게 단축시킬 수 있습니다.
resource r2 { protocol C; disk e; meta-disk m; # short form, disk and meta-disk inherited floating 10.1.1.31:7802; # longer form, only device inherited floating 10.1.1.32:7802 { disk f; meta-disk n; } } |
disk
이 섹션은 디스크 볼륨에 관한 파라미터를 정의하는 섹션입니다. 이 섹션의 모든 파라미터는 선택가능합니다.
Optional parameters: on-io-error, size, fencing, disk-drain, max-bio-bvecs, resync-rate, resync-after, al-extents, al-updates, c-plan-ahead, c-fill-target, c-delay-target, c-max-rate, c-min-rate, disk-timeout
net
이 섹션은 WDRBD의 네트워크 연결에 관한 파라미터를 정의하는 섹션입니다. 이 섹션의 모든 파라미터는 선택가능합니다.
Optional parameters: protocol, sndbuf-size, rcvbuf-size, timeout, connect-int, ping-int, ping-timeout, max-buffers, max-epoch-size, ko-count, allow-two-primaries, after-sb-0pri, after-sb-1pri, after-sb-2pri, data-integrity-alg, no-tcp-cork, on-congestion, congestion-fill, congestion-extents, verify-alg, use-rle, csums-alg
options
이 섹션은 리소스의 파라미터를 정의하는 섹션입니다. 이 섹션의 모든 파라미터는 선택가능합니다.
Optional parameters: on-no-data-accessible
handlers
이 섹션은 특정한 이벤트가 발생했을 때 호출되는 핸들러(실행가능한)를 정의하는 섹션입니다.
Optional parameters: pri-on-incon-degr, pri-lost-after-sb, pri-lost, fence-peer (formerly oudate-peer), local-io-error, initial-split-brain, split-brain, before-resync-target, after-resync-target
핸들러 서비스는 기본적으로 비활성화되어 있습니다. 다음 명령을 사용하여 handler_use를 1로 설정하면 핸들러 서비스가 활성화됩니다.
핸들러 구성에서 사용 가능한 파일 형식은 다음과 같습니다.
|
인터페이스는 환경 변수를 통해 완성됩니다:
DRBD_RESOURCE
는 리소스의 이름입니다.DRBD_MINOR
는 WDRBD 디바이스의 마이너 숫자입니다.DRBD_CONF
는 주된 구성 파일의 경로입니다; 여러개의 구성 파일(예를 들어,WDRBD 설치위치의etc/drbd.d/
)로 구성하는 경우에는 유용하지 않습니다.DRBD_PEER_AF, DRBD_PEER_ADDRESS
는 어드레스 패밀리(예를 들어, ipv6)이며, 원격노드의 주소와 호스트이름 입니다.
모든 핸들러에 대해 이들 모두가 설정되지 않으며, 일부 값은 floating
정의에 대해 사용되지 않을 수도 있습니다.
파라미터들
disable-ip-verification
보통, WDRBD는 구성파일에 맞는 호스트이름을 IP 주소로 검증합니다. 이 파라미터를 사용하면 이러한 검사를 진행하지 않습니다.
protocol prot-id
TCP/IP 링크에 지정된 프로토콜이 사용됩니다. 유효한 프로토콜 지정자는 A, B, C 입니다.
Protocol A: 쓰기IO가 로컬 디스크 및 로컬 TCP 송신 버퍼에 도달하면, 쓰기는 완료됩니다.
Protocol B: 쓰기IO가 로컬 디스크 및 원격노드의 쓰기 요청에 대한 응답을 받으면, 쓰기는 완료됩니다.
Protocol C: 쓰기IO가 로컬 디스크 및 원격노드 디스크에 도달하면, 쓰기는 완료됩니다.
disk drive_letter
WDRBD 는 이 블록 디바이스에 실제로 데이터를 저장하고 가져옵니다.
device drive_letter minor [minor_index]
WDRBD 는 백킹디바이스의 볼륨레터를 지정하고 minor 값을 직접 지정해야 합니다. minor_index 의 값은 c: 볼륨레터의 경우 0을 기준으로 레터값이 증가됨에 따라 index 도 1씩 증가 되도록 고정되어 있습니다.
예) device e: minor 2;
address
AF addr:port
리소스는 디바이스마다 각각의 파트너 디바이스로부터 들어오는 연결을 대기하는데 사용하는 하나의 IP 주소를 필요로합니다.
AF
는 ipv4 / ipv6 모두 지원하며, ipv4 에 대해서는 AF
가 생략될 수 있습니다.
ipv6 주소 지정
예) address ipv6 [fda1:6ed6:5069:1:fcc7:700:cd9d:9bee]:7789; # unique local address |
각 WDRBD 리소스는 파트너 디바이스와 연결하기 위해 사용되는 TCP 포트를 필요로 합니다.
같은 노드에서 두개의 서로 다른 WDRBD 리소스는 같은 addr:port
조합을 사용할 수 없습니다.
meta-disk drive_letter
meta-data의 크기는 디바이스의 크기에 따라 계산됩니다.
그 meta-data의 크기는 36kB + 스토리지의 크기 / 32k 이고, 다음 4kb경계로 반올림한 값입니다.(눈금량: 스토리지 1GByte 당 32kByte에 다음 MB를 반올림합니다.)
on-io-error handler
로우레벨 디바이스에서 발생한 I/O 에러에 대해서 WDRBD가 어떻게 동작할지에 대한 정의를 합니다. 사용가능한 정책은 다음과 같습니다.
detach
: 디스크를 detach
합니다.(기본값, WDRBD 에선 detach 속성의 사용을 권장합니다)
pass_on
: 디스크 상태를 inconsistent
로 변경하며 실패한 블럭에 대해서는 비트맵에 inconsistent
로 기록하고 원격노드로 I/O 동작을 재시도 합니다.
call-local-io-error
: local-io-error
핸들러를 호출합니다.
svc-autostart { yes | no }
OS 부팅 시 drbdService에 의해 자동으로 리소스를 시작할 지 결정합니다. 기본값은 "yes"입니다.
부팅 시에 디스크가 준비되지 않을 수 있는 공유디스크를 사용하는 환경에서는 리부팅 이후 리소스를 자동 up 하게 되며 공유디스크의 메타디스크 영역에 영향을 줄 수 있기 때문에 up 이 되지 않도록 조치가 필요합니다. 따라서 SDR 리소스는 해당 옵션을 no 로 설정하는 것이 필수 사항입니다.
fencing fencing_policy
fencing
은 양 노드가 disconnected
상황에서 양쪽다 Primary가 되는 상황(스플릿 브레인)을 피하기 위한 정책입니다.
유효한 정책은 다음과 같습니다.
dont-care
이것은 기본 정책입니다. 어떠한 fencing
행동도 취하지 않는다.
resource-only
노드가 disconnected primary
상태가 된다면, 원격노드의 디스크를 막는 시도를 합니다. 이것은 fence-peer
핸들러를 호출함으로써 완료됩니다. 이 핸들러는 대체 경로를 통하여 다른 노드에 도달하여 'drbdadm outdate res
'를 호출합니다.
resource-and-stonith
노드가 disconnected primary
상태가 된다면, 모든 IO 명령이 중지되고 fence-peer
핸들러가 호출됩니다. fence-peer
핸들러는 대체 경로를 통하여 다른 노드에 도달하여 'drbdadm outdate res
'를 호출합니다. 이 경우 원격노드에 도달할 수 없다면 원격노드를 stonith
(재부팅)합니다. IO 는 이 상황이 해결되면 곧바로 재개 됩니다. 이 경우 핸들러가 실패하면 resume-io
명령으로 IO 를 재개할 수 있습니다.
disk-timeout
하위 레벨 디바이스의 드라이버가 정의된 disk_timeout
내에 IO 요청을 완료하지 못할 경우, WDRBD는 그 디스크를 실패로 간주합니다. 하위 레벨 디바이스가 detach
되면, 디바이스의 디스크 상태는 Diskless
로 변경됩니다. WDRBD가 하나이상의 원격노드에 연결되어 있는 경우, 실패한 요청은 원격노드중 하나에게 전달됩니다. 기본값은 0이며, 제한시간이 적용되지 않는다는 의미입니다. 기본 단위는 0.1초입니다.
req-buf-size
로컬 I/O 에 대해 버퍼링을 수행하는 WDRBD 내부 버퍼의 크기입니다. 기본값은 1000 (MByte) 입니다. 저대역폭(1Gbps 미만) 의 복제 라인의 환경이거나 비동기 복제 시 req-buf-size 의 크기에 따라 복제 성능이 차이가 날 수 있습니다. 가용메모리가 충분한 환경일 경우 값을 충분히 늘려주는게 복제 성능에 좋습니다. 512~10000 까지 설정할 수 있습니다.
sndbuf-size size
TCP/IP 송신 버퍼의 크기를 설정합니다. 송신버퍼는 커널의 비페이징 풀로 할당되므로 시스템 메모리 사양에 맞게 적당히 설정되어야 합니다. 과도하게 할당할 경우 시스템의 비페이징풀이 고갈되어 시스템의 전반적인 성능에 영향을 줄 수 있습니다. 설정하지 않았을 경우 기본값은 64KB 입니다.
rcvbuf-size size
TCP/IP 의 수신 버퍼 크기를 설정합니다. 기본값은 0 이며 이것은 동적으로 조정된다는 의미입니다. 일반적으로 이 값은 기본값으로 설정하며 조정하지 않습니다.
timeout time
네트워크상에서 응답시간의 타임아웃 값을 정의합니다. 원격노드가 지정된 타임아웃값 안에 응답을 주지 않으면 원격노드가 죽었다고 간주하고 TCP/IP 연결을 닫습니다. 이 타임아웃 값은 connect-int
과 ping-int
값보다 작아야 합니다. 기본값은 30 (= 3초) 입니다. 기본적으로 망 간의 혼잡이 발생될 수 있는 조건에 놓인 원격 DR 구성의 경우는 기본값보다 두 배정도의 수치(60)로 설정하는 것을 권장합니다.
connect-int time
즉시 원격 WDRBD 디바이스에 연결할 수 없는 경우에, WDRBD는 계속해서 연결을 시도합니다. 이 옵션을 사용하면 두번의 재시도 사이의 시간을 설정할 수 있습니다. 기본값은 3초 이며, 단위는 초 입니다.
ping-int time
원격노드와 TCP/IP 연결이 몇 time
초 이상 유휴 상태 인 경우, WDRBD는 원격노드가 아직 살아있는지 확인하려고 keep-alive 패킷 생성합니다. 기본값은 3초 이며, 단위는 초 입니다.
ping-timeout time
keep-alive 패킷이 응답하는 타임아웃 값입니다. 원격노드가 ping-timout
값 안에 응답하지 않으면 WDRBD 는 이 연결을 끊고 다시 재연결을 시도합니다. 기본값은 3 초이며, 최소는 0.1, 최대는 3초입니다. 단위는 1/10 초 입니다.
max-buffers number
WDRBD 의 resync
혹은 온라인 검증에 사용될 내부 버퍼 또는 수신측에서 디바이스 당 사용될 메모리의 제약입니다. 단위는 PAGE_SIZE
이며, 대부분의 시스템에서 4KiB 입니다. 하드 코딩된 최소 가능한 크기는 32 입니다(이것은 128KiB 와 같습니다.). 이 버퍼는 디스크로부터 쓰기 및 읽기를 할 동안에 데이터 블럭을 잡아둘 때 사용됩니다. 혼잡상태에서 분산된 교착 상태를 회피하기 위해서, 이 설정은 기계적인 한계보다는 스로틀 임계값으로 사용됩니다. max-buffers
이상의 페이지가 사용중이면, 추후에 이 풀에서 추가 할당이 제한됩니다.
ko-count number
secondary
노드가 timeout
파라미터 시간안에 ko-count
만큼 단일 쓰기 요청을 실패할 경우, 클러스터에서 제외시킵니다. (즉, primary
노드가 StandAlone
모드로 전환됩니다.) primary
노드는 노드 상태를 Standalone
으로 변경합니다. 기본값 0이며 이것은 이 기능은 사용하지 않는다는 의미입니다.
unplug-watermark number
secondary
노드에서 얼마나 많은 쓰기 요청이 큐잉되었을 때 처리할지에 대한 설정값입니다. 일부 스토리지 컨트롤러는 max-buffers
와 같게 설정될 때 최고의 성능을 발휘하지만 다른 컨트롤러는 작은 값일 때 더 효과적으로 동작할 수 있습니다. 최소값은 16, 기본값은 128, 그리고 최대값은 131072 입니다.
after-sb-0pri policy
primary
노드가 하나도 없을 경우 스플릿브레인 시나리오 상에서 어떻게 동작할지 정의합니다.
disconnect
자동 재동기화하지 않습니다, 단순히 연결을 끊습니다.
discard-younger-primary
split-brain
상황이 발생하기 전에 primary
이었던 노드에서 자동 동기화합니다.
discard-older-primary
split-brain
상황 동안 두번째로 primary
가 되었던 노드에서 자동 동기화한다.
discard-zero-changes
split-brain
상황이 감지된 후 한 노드에서만 쓰기가 이루어진 경우, 해당 노드를 기준으로 재 동기화 합니다. 양 노드에서 쓰기가 이루어졌다면, 연결을 끊습니다.
discard-least-changes
더 많은 블럭이 변경된 노드를 기준으로 재동기화 합니다.
discard-node-NODENAME
지정된 노드의 데이터를 버리고 원격노드를 기준으로 재 동기화합니다.
after-sb-1pri policy
primary
노드가 하나일 경우 스플릿브레인 시나리오 상에서 어떻게 동작할지 정의합니다.
disconnect
자동 재동기화하지 않습니다, 단순히 연결을 끊습니다.
consensus
만일 after-sb-0pri
알고리즘의 결과가 현재 secondary
노드의 데이터를 폐기하는 결정일 경우에는 secondary
노드의 데이터를 버립니다. 그렇지 않은 경우에는 연결을 끊습니다.
violently-as0p
primary
노드의 데이터가 오류를 발생하더라도 항상 after-sb-0pri
알고리즘의 결과와 같은 결정을 내린다. 이 옵션은 allow-two-primaries
플래그와 함께 단일 노드 파일시스템을 사용할 때 유용합니다. 정확히 어떤 작업을 하는지 자세히 알아야 합니다. 왜냐하면 primary
노드에서 이미 마운트 된 파일 시스템을 사용한다면 이 옵션은 위험하고 시스템을 망가뜨릴 수 있습니다.
discard-secondary
secondary
노드의 데이터를 버립니다.
call-pri-lost-after-sb
항상 after-sb-0pri
알고리즘의 결과와 같은 결정을 내립니다. 만약 primary
노드의 데이터를 폐기하는 결정을 내려진다면, primary
노드에서 pri-lost-after-sb
핸들러를 호출합니다.
이 핸들러는 secondary
노드로 변경할 노드를 리부팅 시킵니다.
after-sb-2pri policy
양 노드가 primary
일 경우 스플릿브레인 시나리오 상에서 어떻게 동작할지 정의합니다.
disconnect
자동 재동기화하지 않습니다, 단순히 연결을 끊습니다.
always-asbp
보통, 자동 after-split-brain
정책은 UUID가 세번째 노드가 가르키지 않는 경우에만 사용됩니다. 이 옵션은 노드들의 데이터 셋 사이에서 어떻게든 관련이 있다면 자동 after-split-brain
정책을 사용할 수 있습니다. 이것은 UUID 가 세번째 노드의 존재를 가르킨다면 전체 동기화를 발생시킬수도 있습니다.
rr-conflict policy
이 옵션은 클러스터에서 모순된 롤 할당시에서의 재동기화 결과를 해결할수 있도록 도와줍니다.
즉, 이 옵션은 WDRBD 재동기화가 필요한 메타데이터가 있고, SyncTarget
노드가 이미 primary
라고 추론될 때 WDRBD 의 행동을 설정합니다.
disconnect
자동 재동기화하지 않습니다, 단순히 연결을 끊습니다.
violently
primary
노드로 재동기를 허락하고, 노드 중 하나에 대해서 블럭 디바이스의 데이터가 위배했다고 가정합니다. 이 옵션은 매위 위험합니다.즉, WDRBD 가 강제로 primary
노드를 SyncTarget
상태로 변경하는 것을 허용하는 옵션입니다.
call-pri-lost
노드중 하나에서 pri-lost
핸들러를 호출합니다. 이 핸들러는 secondary
로 변경될 노드를 리부팅합니다.
data-integrity-alg alg
WDRBD 는 내장된 TCP/IP 프로토콜로 데이터의 무결성을 보장하지만, 다른 알고리즘을 사용할 수 있도록 구성할 수 있습니다. 이것은 추가적으로 네트워크로 송신된 데이터가 수신된 데이터와 일치하는지 확인하는데 사용됩니다.
WDRBD에선 crc32c 알고리즘만 지원합니다.
on-congestion congestion_policy
, congestion-fill fill_threshold
, congestion-extents active_extents_threshold
DRBD의 기본적인 통신은 TCP 송신버퍼가 꽉 차면 송신을 블록(대기)한다. 이는 후속 쓰기 요청이 대기하게 되어 응용 프로그램을 느려진다는 의미이다.
DRBD가 DRBD-proxy와 함께 배포되는 경우, 전송 큐가 가득차기 전에 DRBD가 짧게 AHEAD/BEHIND 모드로 진행되는 것이 더 바람직 할 수 있다. AHEAD/BEHIND 모드에서 DRBD는 데이터 복제를 더이상 하지 않지만 네트웍 연결은 유지한다.
AHEAD/BEHIND 모드의 장점은 DRBD-proxy의 버퍼가 쓰기 요청 버퍼로 충분하지 않더라도 응용 프로그램을 느리게하지 않는다는 것이다. 단점은 peer 노드가 뒤쳐지고, 재동기화로 다시 그것을 가져와야 한다는 것이다. 재동기화 동안 peer노드는 "inconsistent" 상태의 디스크를 갖게 된다.
사용 가능한 congestion_policys 는 block과 pull-ahead 이며, 기본값은 block 이다. Fill_threshold 는 0에서 10GiBytes의 범위에 있다. 기본값은 0이며 이는 혼잡모드를 사용안한다는 의미이다. Active_extents_threshold 는 al-extents 와 같은 크기의 제한을 갖는다.
wfc-timeout time
time 만큼 연결을 기다립니다. 대기 시간을 제한하려면 time
을 입력합니다. 기본값이 0이면 무제한을 의미하며, 단위는 초이다.
degr-wfc-timeout time
이 노드가 클러스터에서 강등된 노드라면, 연결 제한시간까지 기다립니다. 강등된 클러스터(= 하나의 노드 만이 클러스터에 존재)가 재 부팅되는 경우, 원격노드가 이전에 죽은상태라면 시간 내에 나타날 가능성이 줄어들기 때문에 wfc-timeout
대신에 이 시간제한 값이 사용됩니다. 0은 무제한을 대기하는 것을 의미합니다.
outdated-wfc-timeout time
원격노드가 outdated
일 경우, 연결 제한시간까지 기다립니다. 원격노드가 oudated
상태인 디스크인 채 강등된 클러스터(= 하나의 노드 만이 클러스터에 존재)가 재 부팅되는 경우, 원격노드가 시간 내에 primary
가 될 수 없기 때문에 wfc-timeout
대신에 이 시간제한 값이 사용된다. 0은 무제한을 대기하는 것을 의미합니다.
wait-after-sb
이 파라미터는 스플릿브레인이 상황이 감지되었을 때 얼마나 오랫동안 기다릴지에 대한 정의힙니다.
resync-rate rate
WDRBD의 상단에있는 응용 프로그램의 원활한 작동을 보장하려면, 백그라운드 동기화에 의해 사용될 수있는 대역폭을 제한 할 수 있습니다. 기본 값은 250 KB/sec이며, 기본 단위는 KB/sec이다. K, M, G를 접미사로 선택할 수 있습니다.
use-rle
resync-handshake
동안, 노드의 dirty-bitmaps
이 교환되고 병합되어(bit-or
을 사용), 노드들은 동일하게 dirty
블록을 판단할 수 있습니다. 대형 디바이스에서, 작은단위의 dirty-bitmap
은 커질 수 있으며, 비트맵 교환은 낮은 대역폭에서 꽤 시간이 걸릴 수 있습니다. 일반적으로 비트맵은 모든 비트가 해제(clean
) 또는 설정(dirty
)되는 간단한 영역을 포함하며, 간단한 run-length
인코딩 방식은 비트맵 교환에 필요한 네트워크 트래픽을 상당히 줄일 수 있습니다.
resync-after res-name
기본적으로 모든 디바이스의 재동기화는 병렬로 실행됩니다 resync-after
의존성을 정의함으로써, 이 리소스의 재동기화는 res-name
으로 기입된 리소스가 이미 connected
상태일 경우에만 시작될 것입니다.(즉, 해당 재동기가 완료된 경우에만 진행됩니다)
al-extents extents
WDRBD는 자동으로 hot area 감시를 수행합니다. 이 파라메타를 사용하면 더 많은 hot area (= active set)를 제어 할 수 있습니다. 각 extent
는 스토리지(= 로우 레벨 디바이스)의 4M를 표시합니다. primary
노드가 예기치 않게 클러스터를 벗어나 실패한 경우, 액티브 셋에 포함된 그 영역은 실패한 노드의 합류 시 재동기화 되어야 합니다. 데이터 구조는 메타 데이터 영역에 저장되므로 active set 의 각 변경부분은 메타데이터 장치의 쓰기 동작입니다. 더 많은 수의 extent
는 재동기화 시간을 길게 하지만, 메타 데이터 업데이트 보다는 짧습니다. extents
의 기본 값은 127입니다 (최소:7, 최대:65534)
al-updates { yes | no }
WDRBD의 activeity log
트랜잭션 쓰기는 primary
노드 실패후에 부분(bit-map
기반) 재동기화만으로 최신 데이터로 갱신하는것을 가능하게 해줍니다. al-updates
를 "no
"로 설정하면 기본 성능은 향상되지만 실패한 primary
가 다시 연결될때 DRBD가 전체 재동기화를 해야하는 원인이 됩니다. 기본값은 "yes
"입니다.
verify-alg hash-alg
온라인 검증(verify
하위 명령어에 의해 시작함)동안에는 비트 연산 비교를 하는 것 보다, WDRBD 는 모든 확인된 블럭의 컨텐츠에 대해서 해쉬 기능을 적용하고, 원격노드와 해당 해쉬를 비교합니다. 이 옵션은 이 목적을 위해서 사용되는 해쉬 알고리즘을 정의하며 WDRBD에서는 crc32c 를 제공합니다. 기본값은 사용하지 않도록 되어 있기 때문에, 온라인 검증을 사용하려면 명시적으로 이 옵션을 설정해야만 합니다.
csums-alg hash-alg
아무런 cums-alg
가 설정되어 있지 않은 경우에는 재동기화 프로세스에 소스로부터 모든 표시된 데이터를 타겟 노드로 보냅니다. 알고리즘 중 하나가 기입되면 재동기화 프로세스는 모든 표시된 데이터블럭의 해쉬값을 먼저 교환하고, 해쉬값이 다른 데이터 블럭만을 전송합니다. 이 설정은 WDRBD 가 낮은 대역폭 연결로 구성되어 있을 경우 유용한 옵션입니다. 크래쉬된 primary
노드를 리부팅시키는 동안 재동기를 위해 activity log
에 의해서 표시된 모든 블럭을 포함할 수 있습니다. 그러나 activity log
에 표시된 블럭의 대부분은 여전히 동기화 상태로 있을 것입니다. 따라서 csums-alg
를 사용하면 CPU 사용하여 낮은 대역폭을 쓸 수 있습니다.
c-plan-ahead plan_time, c-fill-target fill_target, c-delay-target delay_target, c-max-rate max_rate
동적으로 재동기 속도를 제어합니다. 양수 값으로 plan_time
을 설정함으로써 활성화됩니다. 데이터 경로에 fill_target
만큼의 데이터가 버퍼에 채워지거나, dealy_target
만큼 지연될 경우 동작한다. 동적 재동기화 속도의 상한값은 c-max-rate
파라미터에 의해 정의됩니다. 얼마나 빨리 동작하는지의 설정은 plan_time
으로 설정할 수 있습니다. 큰 값으로 설정할 경우 느리고/낮은 응답으로 동작합니다. 최소한 RTT(round-trip time) 의 5배 이상이어야 합니다. 일반적인 데이터 경로에서는 4k에서 100k의 영역이 fill_target
값이 적합합니다.
fill_target
이 0으로 설정된 경우에만 컨트롤러는 delay_target
를 사용합니다. 합리적인 값은 RTT의 5배 입니다. Max_rate
는 사용가능한 disk
대역폭으로 설정 해야합니다. plan_time
의 기본값은 0이며 기본단위는 0.1초입니다. Fill_target
의 기본값은 0이며 기본단위는 sector 입니다. Delay_target
의 기본값은 1(100ms)이며 기본단위는 0.1입니다. Max_rate
의 기본값은 10240(100MiB/s)이며 기본단위는 KiB/s입니다.
c-min-rate min_rate
primary
이고 sync-source
인 노드는 응용프로그램의 IO 요청과 재동기 IO 요청을 위해서 스케줄을 해야 합니다. min_rate
는 WDRBD 가 재동기 IO 를 위한 최대 대역폭의 할당이며, 다른 모든 가능한 IO 요청은 응용프로그램 요청에 할당하도록 알려줍니다.
메모 : 0 값은 특별한 의미가 있습니다. 재동기 IO 를 완전히 해제함으로써 응용 프로그램의 IO 속도를 상당히 느려지게 할 수 있습니다. 이 값을 1로 설정하면 재동기 IO 가 응용프로그램 IO 를 느리게 하지 않습니다.
메모 : 이름으로 추측되는 것은 동적 재동기 속도 컨트롤러의 하위 한계점으로 보일 수 있지만, 그렇지 않습니다.
Min_rate
의 기본값은 4096 (4MiB/s)이며, 기본단위는 KiB/s이다.
on-no-data-accessible ond-policy
이 설정은 성능이 저하된 diskless
노드(즉, 데이터 저장소에 도달할 수 없습니다.) 에서 IO 요청이 일어나는 것을 제어합니다. 가능한 정책은 io-error
와 suspend-io
입니다.
suspend-io
로 설정되어 있는 경우, 마지막으로 손실된 데이터 스토리지를 attaching/connecting
하거나 또는 drbdadm resume-io res 명령 둘 중 하나로 IO를 재개할 수 있습니다. 후자는 당연히 IO오류가 발생합니다.
기본값은 io-error
입니다.
pri-on-incon-degr cmd
이 핸들러는 노드가 primary
이고 성능이 저하된 것이면서, 데이터의 로컬 복사본이 inconsistent
일 경우에 호출됩니다.
pri-lost-after-sb cmd
노드가 현재 primary
이나, after-split-brain
자동 복구 절차에 따라서 primary
롤을 잃었다면 결과적으로 노드는 버려집니다.
pri-lost cmd
노드가 현재 primary
이나, WDRBD 의 알고리즘에 의해 sync target 이 되어야 한다고 판단되면 primary
롤을 버립니다.
fence-peer cmd
이 핸들러는 fencing
메커니즘의 일부입니다. 이 핸들러는 노드가 원격노드의 디스크에 fence
가 필요한 경우에 호출됩니다. WDRBD 의 네트워크 링크가 아닌 다른 통신 경로를 사용합니다.
local-io-error cmd
하위레벨 디바이스에서 IO 오류가 발생할 경우 호출됩니다.
initial-split-brain cmd
원격노드와 연결되고 split-brain
을 감지했을 경우 호출됩니다. 이 핸들러는 split brain
의 모든 경우에 미해결로 남지 않도록 경고를 알려 줍니다.
split-brain cmd
자동으로 해결되지 않은 split-brain
상황을 감지했을때 사용됩니다. 수동 복구가 필요하며 관리자에게 경고를 할때 사용되는 핸들러입니다.
before-resync-target cmd
재동기화 대상이 되는 노드에서 재동기가 시작되기 전에 호출됩니다. 블럭 디바이스의 스냅샷을 찍는데 사용되기도 합니다.
after-resync-target cmd
재동기화 동안 재동기 작업이 완료되어 디스크 상태가 inconsistent
에서 consistent
상태로 변경된 노드에서 이 핸들러가 호출됩니다. before-resync-target
핸들러에서 생성했던 블럭 디바이스의 스냅샷을 제거하는데 사용되기도 합니다.
다른 키워드들
include file-pattern
와일드 카드 패턴 file-pattern
과 일치하는 모든 파일을 포함합니다.
포함된 문장은 최 상위 레벨에서 허용됩니다. 즉, 어떤 섹션 내부에서도 허용되지 않습니다.
데이터 무결성 관련
WDRBD 는 두가지 다른 메커니즘으로 데이터 무결성 체크를 합니다. 첫번째. data-integrity-alg
네트워크 파라미터로 네트워크로 보낸 데이터의 체크섬을 추가하는 방법이 있습니다. 두번째. 온라인 검증 메커니즘(drbdadm verify
명령과 verify-alg
파라미터)로 디스크 상의 차이를 체크할 수 있습니다.
두 메커니즘은 IO 가 발생되는 도중에 수행할 경우 수정된 데이터(네트워크상에 보내는 중의 데이터 혹은 디스크에 쓰여지는 중의 데이터)에 대해서 오탐(false positive)이 발생할 수는 있으나 데이터 무결성에 문제가 되는 것은 아닙니다.
예를 들어 파일 시스템과 응용프로그램은 IO 중에 특정한 명령을 위해서 데이터를 수정하고 스왑 공간 역시 IO 중에 변화를 겪을 수 있습니다. 네트워크 데이터 무결성 체크는 송신측에서 데이터를 보낸 후 체크섬을 확인함으로써 IO 수행 동안 데이터 수정여부를 확인합니다. 만약 불일치가 발생하면, 오류로 기록합니다. 수신자 역시 불일치가 발생하면 오류로 기록합니다. 그러므로 수신자 측에서 오류가 기록되면 네트워크 상에서 오류로 지정하고 IO가 발생한 도중의 데이터 수정은 양 측에 오류로 기록됩니다.
최근 2007년에 TCP 오프로딩 엔진과 특정 타입의 기가비트 네트워크 인터페이스 카드 드라이버간에 설계상 결함의 이슈가 있었습니다. 코어 메모리에서 NIC으로의 DMA 전송과정 중에서 데이터 변형이 발생했고, TCP 체크섬은 NIC에서 계산되기 때문에, TCP/IP 프로토콜의 체크섬이 변형되는 문제를 감지하지 못하였습니다. 이 문제는 온라인 검증이나 data-integrity-alg 를 사용하지 않는 한 알 수가 없습니다.