웹사이트 검색

Debian 8에서 네트워크 파일 시스템 복제를 위한 DRDB 설치 및 구성


이 페이지에서

  1. 전제 조건
  2. DRBD 설치
  3. 기본/보조 구성 - 재해 복구\n

네트워크 파일 시스템 복제에 대해 이야기하겠습니다.

네트워크 파일 시스템 복제는 오늘날 여러 시나리오에서 자주 사용됩니다.

  • 보안상의 이유로 파일 시스템 복제: 한 노드에 오류가 발생하면 다른 노드에 액세스할 수 있습니다.\n
  • 각 직원이 공용 네트워크가 아닌 로컬에서 자신의 데이터에 액세스할 수 있도록 파일 시스템을 다른 회사 본사에 복제합니다. 그러나 그가 다른 본사로 가면 모든 데이터를 가지고 있고 다시 로컬에서 액세스할 수 있습니다.\n

상상할 수 있듯이 이러한 종류의 시스템은 클러스터 환경을 위한 파일 시스템을 구축하는 데 자주 사용됩니다.

우리는 DRDB로 솔루션을 구현하기로 결정했습니다. 그것의 주요 porpouse는 (이와 같은 다른 시스템처럼) 파일 시스템을 위한 고가용성 및 재해 복구입니다.

Debian 8로 솔루션을 구현하지만 Ubuntu에서도 작동해야 합니다.

전제 조건

시작하기 전에 전제 조건은 다음과 같습니다.

  • 최소 2개의 데비안 서버.
  • Debian은 최소 설치로 설치됩니다(프로덕션 시스템에서 수행하는 작업을 알고 있는 경우 전혀 필요하지 않음) 권장 가이드 https://linux-console.net/tutorial/debian-8-jessie-minimal-server/\n
  • 각 서버에 최소 2개의 Linux 디스크: Linux 설치의 경우 /dev/sda, DRDB 설치의 경우 /dev/sdb.

주의!!!: 설치하는 동안 /dev/sdb 디스크의 모든 데이터가 삭제되므로 내부에 데이터가 있는 디스크에서 작업하지 마십시오.

DRBD 설치

이 예에서는 다음과 같은 두 개의 노드를 사용합니다.

  • 192.168.152.100 mysql1.local.vm
  • 192.168.152.110 mysql2.local.vm

모든 노드에서 /etc/hosts 파일을 다음과 같이 수정합니다.

127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

그런 다음 다음 명령을 실행하여 DRDB를 설치합니다.

apt-get update
apt-get -y upgrade
apt-get install drbd-utils

구성 기본/보조 - 재해 복구

기본 구성 파일은 다음과 같은 /etc/drbd.conf입니다.

include "drbd.d/global_common.conf";
include "drbd.d/*.res";

일반적으로 /etc/drbd.d/global_common.conf에는 DRBD 구성의 전역 및 공통 섹션이 포함되는 반면 .res 파일에는 각 섹션에 하나의 리소스

이 예에서는 두 노드의 데이터를 복제하는 최소한의 설정을 수행합니다. 각 노드에서 다음 수정을 수행합니다.

파일 편집을 시작하세요 /etc/drbd.d/global_common.conf 기본 줄 수정

global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
...
net {
protocol C;
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
# ping-timeout data-integrity-alg tcp-cork on-congestion
# congestion-fill congestion-extents csums-alg verify-alg
# use-rle
}
...

이제 리소스에 대한 구성 파일 /etc/drbd.d/r0.res를 생성합니다. 모든 노드에서 파일을 만들고 내부에 다음을 추가합니다.

resource r0 {
  on mysql1.local.vm {
    device    /dev/drbd1;
    disk      /dev/sdb;
    address   192.168.152.100:7789;
    meta-disk internal;
  }
  on mysql2.local.vm {
    device    /dev/drbd1;
    disk      /dev/sdb;
    address   192.168.152.110:7789;
    meta-disk internal;
  }
}

지금까지 우리가 한 일은 다음과 같습니다.

  • usage-count 매개변수를 사용하여 DRBD의 사용 통계에 포함되도록 "옵트인"합니다.\n
  • 자원은 Cunless 프로토콜이 달리 명시적으로 지정된 완전 동기식 복제를 사용하도록 구성됩니다.\n
  • 클러스터는 mysql1과 mysql2라는 두 개의 노드로 구성되어 있습니다.
  • /dev/sdb를 하위 수준 장치로 사용하고 다음과 같이 구성된 r0라는 리소스가 있습니다. 내부 메타 데이터.
  • 리소스는 네트워크 연결에 TCP 포트 7789를 사용하고 각각 IP 주소 192.168.152.100 및 192.168.152.110에 바인딩합니다.\n

모든 노드에서 다음 명령을 사용하여 메타데이터를 초기화합니다.

drbdadm create-md r0

다음과 같은 내용이 표시되어야 합니다.

--== Thank you for participating in the global usage survey ==--
The server's response is:

you are the 2963th user to install this version
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success

다음으로 리소스를 활성화하고 첫 번째 복제 실행을 초기화합니다. 첫 번째 노드에서만 복제가 시작되어야 합니다.

drbdadm up r0
drbdadm primary --force r0

모두 제대로 작동하는지 확인하려면 두 노드에서 /proc/drbd 파일을 확인하면 다음과 같은 내용이 표시됩니다.

Mysql1

:# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:54624 nr:0 dw:0 dr:55536 al:0 bm:3 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5188060
[>....................] sync'ed: 1.1% (5064/5116)Mfinish: 0:17:21 speed: 4,964 (4,964) K/sec

Mysql2

:# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:17496 dw:17496 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5225188
[>....................] sync'ed: 0.4% (5100/5116)Mfinish: 0:29:41 speed: 2,916 (2,916) want: 5,160 K/sec

빌드 단계에서 UpToDate/Inconsistent를 확인할 수 있습니다. 이것이 데이터의 첫 번째 동기화이기 때문에 올바른 것입니다.

filsystem이 동기화된 후 이 shloud는 다음 로그와 같이 UpToDate/UpToDate로 변경됩니다.

:/home/sysop# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:5242684 nr:0 dw:0 dr:5243596 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

이제 선호하는 파일 시스템 유형으로 포맷할 수 있는 /dev/drbd1이라는 새 블록 장치가 있습니다. 예를 들어 ext4로 포맷하고 /var/www에 마운트하려면 다음과 같이 하면 됩니다.

:/home/sysop# mkfs.ext4 /dev/drbd1
mke2fs 1.42.12 (29-Aug-2014)
Creazione del file system con 1310671 4k blocchi e 327680 inode
Etichetta del file system=ab3e18c9-e8cb-42c8-977a-ab79bdb18aea
Backup del superblocco salvati nei blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: fatto
Scrittura delle tavole degli inode: fatto
Creating journal (32768 blocks): fatto
Scrittura delle informazioni dei super-blocchi e dell'accounting del file system: fatto

그런 다음 파일 시스템을 마운트할 수 있습니다.

mkdir /var/www
mount /dev/drbd1 /var/www

이제 /var/www 디렉토리가 drbd 시스템을 통해 마운트됩니다.

이 시나리오에서는 기본/보조 구성으로 재해 복구 시스템을 구현했습니다.

이 경우 파일 시스템을 두 번째 노드에 마운트하려고 하면 오류가 발생합니다.

:~# mount /dev/drbd1 /var/www/
mount: /dev/drbd1 is write-protected, mounting read-only
mount: mount /dev/drbd1 on /var/www failed: Tipo di supporto errato

이는 우리의 구성으로 인해 정상이며 예상되는 것입니다.

이제 mysql1의 오류를 시뮬레이션할 수 있으므로 poweroff 명령으로 전원을 끕니다.

mysql2에서 우리는 무엇이 쌓이는지 볼 수 있습니다:

Oct 5 13:52:14 mysql2 kernel: [13458.629215] drbd r0: PingAck did not arrive in time.
Oct 5 13:52:14 mysql2 kernel: [13458.629587] drbd r0: peer( Primary -> Unknown ) conn( Connected -> NetworkFailure ) pdsk( UpToDate -> DUnknown )
Oct 5 13:52:14 mysql2 kernel: [13458.629919] drbd r0: asender terminated
Oct 5 13:52:14 mysql2 kernel: [13458.629921] drbd r0: Terminating drbd_a_r0
Oct 5 13:52:14 mysql2 kernel: [13458.630028] drbd r0: Connection closed
Oct 5 13:52:14 mysql2 kernel: [13458.630035] drbd r0: conn( NetworkFailure -> Unconnected )
Oct 5 13:52:14 mysql2 kernel: [13458.630035] drbd r0: receiver terminated
Oct 5 13:52:14 mysql2 kernel: [13458.630036] drbd r0: Restarting receiver thread
Oct 5 13:52:14 mysql2 kernel: [13458.630037] drbd r0: receiver (re)started
Oct 5 13:52:14 mysql2 kernel: [13458.630041] drbd r0: conn( Unconnected -> WFConnection )

mysql2 노드는 mysql1이 죽은 것을 감지하고 /proc/drbd를 확인하면:

:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:5457236 dw:5457236 dr:0 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

상태가 Secondary/primary에서 Secondary/unknown으로 변경된 것을 볼 수 있습니다. 이제 우리는 트릭을 수행하여 mysql2를 기본으로 승격합니다. mysql2에서 간단히 다음을 실행하십시오.

drbdadm primary r0

/proc/drbd를 다시 확인하고 마법을 보자...

:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:5457236 dw:5457236 dr:912 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

보시다시피 이제 노드가 기본 노드이며 정기적으로 마운트할 수 있습니다.

:~# df -h
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda1 9,3G 1,4G 7,5G 16% /
udev 10M 0 10M 0% /dev
tmpfs 97M 4,6M 92M 5% /run
tmpfs 241M 0 241M 0% /dev/shm
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 241M 0 241M 0% /sys/fs/cgroup
/dev/drbd1 4,8G 10M 4,6G 1% /var/www

이제 우리는 mysql1을 다시 사용하고 싶다고 가정합니다. 이제 시작하면 뇌가 분리되기 시작합니다. 실제로 로그를 확인하고 다음 오류를 볼 수 있습니다.

Oct 5 14:26:04 mysql1 kernel: [ 7.760588] drbd r0: conn( StandAlone -> Unconnected )
Oct 5 14:26:04 mysql1 kernel: [ 7.760599] drbd r0: Starting receiver thread (from drbd_w_r0 [458])
Oct 5 14:26:04 mysql1 drbdadm[435]: adjust net: r0
Oct 5 14:26:04 mysql1 drbdadm[435]: ]
Oct 5 14:26:04 mysql1 kernel: [ 7.769318] drbd r0: receiver (re)started
Oct 5 14:26:04 mysql1 kernel: [ 7.769327] drbd r0: conn( Unconnected -> WFConnection )
Oct 5 14:26:04 mysql1 /etc/init.d/mysql[485]: MySQL PID not found, pid_file detected/guessed: /var/run/mysqld/mysqld.pid
Oct 5 14:26:04 mysql1 acpid: starting up with netlink and the input layer
Oct 5 14:26:04 mysql1 acpid: 1 rule loaded
Oct 5 14:26:04 mysql1 acpid: waiting for events: event logging is off
Oct 5 14:26:05 mysql1 kernel: [ 8.270578] drbd r0: Handshake successful: Agreed network protocol version 101
Oct 5 14:26:05 mysql1 kernel: [ 8.270581] drbd r0: Agreed to support TRIM on protocol level
Oct 5 14:26:05 mysql1 kernel: [ 8.270770] drbd r0: conn( WFConnection -> WFReportParams )
Oct 5 14:26:05 mysql1 kernel: [ 8.270771] drbd r0: Starting asender thread (from drbd_r_r0 [461])
Oct 5 14:26:05 mysql1 kernel: [ 8.272594] block drbd1: drbd_sync_handshake:
Oct 5 14:26:05 mysql1 kernel: [ 8.272597] block drbd1: self 242B364F4A5B9C68:525CC995A3CFBA2B:44A1DE193A6C6701:0000000000000004 bits:64463 flags:0
Oct 5 14:26:05 mysql1 kernel: [ 8.272598] block drbd1: peer 6903F6042F95F5FF:525CC995A3CFBA2A:44A1DE193A6C6700:0000000000000004 bits:4 flags:0
Oct 5 14:26:05 mysql1 kernel: [ 8.272599] block drbd1: uuid_compare()=100 by rule 90
Oct 5 14:26:05 mysql1 kernel: [ 8.272601] block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1
Oct 5 14:26:05 mysql1 kernel: [ 8.272692] drbd r0: meta connection shut down by peer.
Oct 5 14:26:05 mysql1 kernel: [ 8.272720] drbd r0: conn( WFReportParams -> NetworkFailure )
Oct 5 14:26:05 mysql1 kernel: [ 8.272722] drbd r0: asender terminated
Oct 5 14:26:05 mysql1 kernel: [ 8.272722] drbd r0: Terminating drbd_a_r0
Oct 5 14:26:05 mysql1 kernel: [ 8.279158] block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-1 exit code 0 (0x0)
Oct 5 14:26:05 mysql1 kernel: [ 8.279173] block drbd1: Split-Brain detected but unresolved, dropping connection!
Oct 5 14:26:05 mysql1 kernel: [ 8.279197] block drbd1: helper command: /sbin/drbdadm split-brain minor-1
Oct 5 14:26:05 mysql1 kernel: [ 8.286125] block drbd1: helper command: /sbin/drbdadm split-brain minor-1 exit code 0 (0x0)
Oct 5 14:26:05 mysql1 kernel: [ 8.286144] drbd r0: conn( NetworkFailure -> Disconnecting )
Oct 5 14:26:05 mysql1 kernel: [ 8.286146] drbd r0: error receiving ReportState, e: -5 l: 0!
Oct 5 14:26:05 mysql1 kernel: [ 8.287009] drbd r0: Connection closed
Oct 5 14:26:05 mysql1 kernel: [ 8.287017] drbd r0: conn( Disconnecting -> StandAlone )
Oct 5 14:26:05 mysql1 kernel: [ 8.287018] drbd r0: receiver terminated
Oct 5 14:26:05 mysql1 kernel: [ 8.287019] drbd r0: Terminating drbd_r_r0

이제 기본/보조 구성에서는 불가능한 두 개의 기본 노드가 있기 때문입니다. 따라서 mysql2에 새로운 데이터 ID가 있다고 가정하면 mysql1을 Secondary로 강등해야 합니다.

따라서 mysql1에서 다음을 실행합니다.

[email :~# drbdadm connect --discard-my-data r0

대신 두뇌 생존자인 mysql2에서 다음을 실행해야 합니다.

:~# drbdadm connect r0

이제 모든 것이 올바르게 재구축되고 있는지 확인할 수 있지만 이제 mysql1은 보조이고 mysql2는 기본입니다.

:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:28224 dw:28224 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:229628
[=>..................] sync'ed: 11.2% (229628/257852)K
finish: 0:01:04 speed: 3,528 (3,528) want: 6,600 K/sec