ネットワークファイルシステムレプリケーションについて話しましょう。
ネットワークファイルシステムレプリケーションは、今日、多くのシナリオでよく使用されています。
- セキュリティ上の理由によるファイルシステムのレプリケーション:一方のノードに障害が発生した場合、もう一方のノードにアクセスできます。
- ファイルシステムを別の会社の本社に複製して、各従業員がパブリックネットワーク経由ではなく、ローカルで自分のデータにアクセスできるようにするため。しかし、彼が他の本社に行くと、彼はすべてのデータを持っており、再びローカルにアクセスできます。
ご想像のとおり、この種のシステムは、クラスタ環境用のファイルシステムを構築するためによく使用されます。
DRDBを使用してソリューションを実装することを選択しました。主な目的は、(このような他のシステムと同様に)ファイルシステムの高可用性とディザスタリカバリです。
このソリューションはDebian8で実装していますが、Ubuntuでも機能するはずです。
始める前に、前提条件は次のとおりです。
- 少なくとも2台のDebianサーバー。
- Debianは最小限のインストールとしてインストールされます(本番システムで何をしているのかを知っている場合はまったく必要ありません)推奨ガイドhttps://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/
- 各サーバーに少なくとも2つのLinuxディスク:Linuxインストールの場合は/ dev / sda、DRDBインストールの場合は/ dev/sdb。
注意!!!:インストール中に、ディスク/ dev / sdb上のすべてのデータが破棄されるため、データが内部にあるディスクで作業しないでください。
DRBDのインストール
この例では、次の2つのノードを使用します。
- 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
.res
に対して、DRBD構成のグローバルセクションと共通セクションが含まれています ファイルには、各セクションに1つのリソースが含まれています。
この例では、2つのノードにデータを複製する最小限のセットアップを行います。各ノードで次の変更を行います。
ファイルの編集を開始します。/etc/drbd.d/global_common.conf modify the default line from
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; } }
これまでに行ったことは次のとおりです。
- リソースは、明示的に指定されていない限り、ProtocolCunで完全同期レプリケーションを使用するように構成されています。
r0
という名前のリソースがあります /dev/sdb
を使用します 下位レベルのデバイスとして、内部メタデータで構成されています。 すべてのノードで、次のコマンドを使用してメタデータを初期化します。
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
[email protected]:# 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
[email protected]:# 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に変更されます。 次のログのように:
[email protected]:/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にマウントする場合は、次のようにするだけです。
[email protected]:/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システムを介してマウントされます。
このシナリオでは、プライマリ/セカンダリ構成を使用して、ディザスタリカバリシステムを実装しました。
この場合、ファイルシステムを2番目のノードにマウントしようとすると、エラーが発生します。
[email protected]:~# 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をチェックすると:
[email protected]:~# 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
ステータスがセカンダリ/プライマリからセカンダリ/不明に変更されたことがわかります。そこで、mysql2をプライマリとしてプロモートしてトリックを実行します。 mysql2では、次のコマンドを実行するだけです。
drbdadm primary r0
/ proc / drbdをもう一度確認して、魔法を見てみましょう...
[email protected]:~# 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
ご覧のとおり、ノードはプライマリであり、定期的にマウントできます。
[email protected]:~# mount /dev/drbd1 /var/www/
[email protected]:~# 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
これは、プライマリ/セカンダリ構成では使用できない2つのプライマリノードがあるためです。したがって、mysql2で新しいデータIDを想定すると、mysql1をセカンダリに降格する必要があります。
したがって、mysql1で実行します:
[email protected]:~# drbdadm secondary r0
[email protected]:~# drbdadm connect --discard-my-data r0
代わりにmysql2では、スプリットブレインサバイバーです。 、実行する必要があります:
[email protected]:~# drbdadm connect r0
これで、すべてが正しく再構築されていることを確認できますが、mysql1はセカンダリで、mysql2はプライマリです。
[email protected]:~# 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