Pandora: Docuemntation ja: DRBD
Contents
1 DRBD を使った Pandora FMS の HA
1.1 DRBD の概要
Distributed Replicated Block Device (DRBD) は、サーバ間でブロックデバイス (ハードディスク、パーティション、論理ボリュームなど) の内容をソフトウエアでミラーリングするためのストレージのソリューションです。
DRBD のデータミラー:
- リアルタイムです。アプリケーションがデバイスのデータを変更するのに伴い、継続的にレプリケーションが発生します。
- 透過的です。データをミラーデバイスに保存するアプリケーションは、データが複数のコンピュータに保存されていることには気づきません。
- 同期または非同期です。同期ミラーリングでは、アプリケーションへの書き込み完了通知は、双方のコンピュータが完了したあとに出されます。非同期ミラーリングは、もう一方のシステムへの書き込みが完了する前に、ローカルの書き込みが完了した時点でアプリケーションへの通知がされます。
DRBD では、ディスクのレプリケーションでほぼ全てのクラスタリングが可能です。我々の場合、データベースのみをクラスタリングしたいのですが、サーバやローカルエージェント、もちろんデータベースも含め、Pandora FMS 全体のレプリケーションも可能です。
DRBD は、RAID-1 の TCP ベースのカーネルモジュールで、設定がとても簡単で早く、エラー防止がされています。DRBD に関しての詳細は、http://www.drbd.org を参照してください。
DRBD はオープンソースです。
1.2 初期環境
マスターとスレーブの HA 設定で MySQL のクラスタを構成したいとします。いくつかの Pandora FMS サーバとコンソールは、MySQL サーバが動作しているサーバへ仮想 IP アドレスを用いて接続します。
MySQL クラスタが動作している 2つのノードのネットワーク設定は以下の通りです。
192.168.10.101 (castor) -> マスター
192.168.10.102 (pollux) -> スレーブ
192.168.10.100 仮想IP
今回の想定では、1台の Pandora FMS サーバが動作しています。
192.168.10.1 pandora -> mysql app
それぞれのノードには 2つのハードディスクがあります。
/dev/sda にベースの linux システム。 /dev/sdb は空で未初期化ディスク。DRBD で RAID1 構成を組むのに使います。
全てのノード間は時刻同期されていると仮定します。これは非常に重要です。そうでなければ ntp やその他仕組みで先に同期をさせてください。
1.3 パッケージのインストール
次のパッケージをインストールします。(debianの場合)
apt-get install heartbeat drbd8-utils drbd8-modules-2.6-686 mysql
次のパッケージをインストールします。(suseの場合)
drbd heartbeat hearbeat-resources resource-agents mysql-server
1.4 DRBD の設定
1.4.1 DRBD の初期設定
/etc/drbd.conf を編集します。
global { usage-count no; } common { protocol C; } resource mysql { on castor { device /dev/drbd1; disk /dev/sdb1; address 192.168.10.101:7789; meta-disk internal; }
on pollux { device /dev/drbd1; disk /dev/sdb1; address 192.168.10.102:7789; meta-disk internal; }
disk { on-io-error detach; # Desconectamos el disco en caso de error de bajo nivel. }
net { max-buffers 2048; #Bloques de datos en memoria antes de escribir a disco. ko-count 4; # Maximos intentos antes de desconectar. }
syncer { rate 10M; # Valor recomendado de sincronización para redes de 100 Mb´s.. al-extents 257; }
startup { wfc-timeout 0; # drbd init script esperará ilimitadamente los recursos. degr-wfc-timeout 120; # 2 minuteos } }
1.4.2 DRBD ノードの設定
/dev/sdb は完全に空のディスクである必要があります。(パーティション設定も不要)
/dev/sdb1 のパーティションを設定します。(linuxタイプ)
fdisk /dev/sdb
それの全データを削除します。
dd if=/dev/zero of=/dev/sdb1 bs=1M count=128
(両方のノードで実行します)
そして、両方のノードで、次のコマンドを使って drbd のためのディスクの初期化を行います。
drbdadm create-md mysql
drbdadm up mysql
(両方のノードで実行します)
1.4.3 ディスクの初期設定 (プライマリノード)
DRBD を設定する最後のコマンドで、プライマリノードでのみ実行します。これで、リソースを初期化しプライマリとして設定します。
drbdadm -- --overwrite-data-of-peer primary mysql
このコマンドを実行すると、初期の全体同期が実施されます。処理の進捗状況は /proc/drbd から確認できます。デバイスのサイズによって時間がかかります。
そして、初期の同期処理が完了する前でも(とはいえ若干パフォーマンスは下がります)、DRBD デバイスは使えるようになります。ブロックデバイスとして利用できファイルシステムを作ってマウントすることができます。通常のブロックデバイスとして使えます。
castor:/etc# cat /proc/drbd version: 8.0.14 (api:86/proto:86) GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by [email protected], 2008-11-12 16:40:33 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:44032 nr:0 dw:0 dr:44032 al:0 bm:2 lo:0 pe:0 ua:0 ap:0 [>....................] sync'ed: 2.2% (2052316/2096348)K finish: 0:03:04 speed: 11,008 (11,008) K/sec resync: used:0/61 hits:2749 misses:3 starving:0 dirty:0 changed:3 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
1.4.4 プライマリノードでのパーティション作成
これは、プライマリノードでのみ実行してください。他のノードへは自動的に複製されます。物理デバイスではなく、DRBD のブロックデバイスに対して操作します。
castor:~# mkfs.ext3 /dev/drbd1
ここからは通常のパーティションとして利用でき、次のようにプライマリノードにマウントします。
castor# mkdir /drbd_mysql castor# mount /dev/drbd1 /drbd_mysql/
この操作(マウント)はセカンダリではできません。これを行うには、次のようにプライマリをセカンダリに切り替える必要があります。
プライマリ (castor) にて:
castor# drbdadm secondary mysql
セカンダリ (pollux) にて:
pollux# drbdadm primary mysql
1.4.5 システムステータス情報の取得
現在のプライマリノード (castor) で次のように実行します。
castor:/# drbdadm state mysql Primary/Secondary
castor:/# drbdadm dstate mysql UpToDate/UpToDate
pollux (バックアップ、レプリケーション) では次のように実行します。
pollux:~# drbdadm state mysql Secondary/Primary
pollux:~# drbdadm dstate mysql UpToDate/UpToDate
1.4.6 DRBD ディスクでの mysql の設定
mysql の全ファイルは次のディレクトリにあると仮定します。(Linux ディストリビューションごとに異なります)
/etc/mysql/my.cnf /var/lib/mysql/
最初に、プライマリおよびセカンダリノードで mysql を停止します。
プライマリノードにて:
全データをプライマリノードにマウントされたパーティション移動します。
mv /etc/mysql/my.cnf /drbd_mysql/ mv /var/lib/mysql /drbd_mysql/mysql mv /etc/mysql/debian.cnf /drbd_mysql/
オリジナルのディレクトリへシンボリックリンクを張ります。
ln -s /drbd_mysql/mysql/ /var/lib/mysql ln -s /drbd_mysql/my.cnf /etc/mysql/my.cnf ln -s /etc/mysql/debian.cnf /drbd_mysql/debian.cnf
mysql を再起動します。
セカンダリノードにて:
mysql 関連ファイルを削除します。
rm -Rf /etc/mysql/my.cnf rm -Rf /var/lib/mysql
ln -s /drbd_mysql/mysql/ /var/lib/mysql ln -s /drbd_mysql/my.cnf /etc/mysql/my.cnf
1.4.7 Pandora FMS データベースの作成
Pandora FMS データベースを作成するためのデフォルトの SQL ファイルが /tmp にあると仮定します。
mysql -u root -p mysql> create database pandora; mysql> use pandora; mysql> source /tmp/pandoradb.sql; mysql> source /tmp/pandoradb_data.sql;
アクセス権を設定します。
mysql> grant all privileges on pandora.* to [email protected] identified by 'pandora'; mysql> flush privileges;
1.4.8 スプリットプレインからの復旧方法
DRBD は、ノード間の通信が復旧し、DRBD プロトコルの初期ハンドシェイクが完了すると、スプリットブレインを検出します。もし、DRBD が両方のノードがプライマリであること(もしくは接続が切れていること)を検出したら、即座にレプリケーション接続を停止します。これを伝えるメッセージとして、次のような内容がシステムログに出力されます。
Split-Brain detected, dropping connection!
スプリットブレインの検出後は、一つのノードは常に StandAlone 状態でリソースを持ちます。もう一方は、同様に StandAlone 状態 (両方のノードが同時にスプリットブレインを検出した場合) か、もしくは WFConnection 状態 (スプリットブレインを検出する前に相手との接続が切れた場合) となります。
この場合、セカンダリノードは (castor) は次のように単独のノードになっています。
castor:~# cat /proc/drbd version: 8.0.14 (api:86/proto:86) GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by [email protected], 2008-11-12 16:40:33 1: cs:WFConnection st:Secondary/Unknown ds:UpToDate/DUnknown C r--- ns:0 nr:0 dw:0 dr:0 al:0 bm:7 lo:0 pe:0 ua:0 ap:0 resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
この時、DRBD をスプリットブレインから自動的に復旧するように設定していない限り、いずれかのノードの変更の破棄 (このノードはスプリットブレインの場合の犠牲ノードとなります) を手動で実行する必要があります。この操作は次のコマンドで行います。
drbdadm secondary mysql drbdadm -- --discard-my-data connect mysql
もう一方のノード (残すノード) では、接続状態が同様に StandAlone であるかどうか次のように確認します。
drbdadm connect mysql
ステータスを見ます。
pollux:/# cat /proc/drbd version: 8.0.14 (api:86/proto:86) GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by [email protected], 2008-11-12 16:40:33 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:34204 nr:0 dw:190916 dr:46649 al:12 bm:24 lo:0 pe:4 ua:20 ap:0 [============>.......] sync'ed: 66.7% (23268/57348)K finish: 0:00:02 speed: 11,360 (11,360) K/sec resync: used:1/61 hits:2149 misses:4 starving:0 dirty:0 changed:4 act_log: used:0/257 hits:118 misses:12 starving:0 dirty:0 changed:12
1.4.9 プライマリの切り替え方法
現在プライマリのサーバにて
1. mysql の停止
/etc/init.d/mysql stop
2. パーティションのアンマウント
umount /dev/drbd1
3. セカンダリへの切り替え
drbdadm secondary mysql
現在セカンダリのサーバにて
4. プライマリへの切り替え
drbdadm primary mysql
5. パーティションのマウント
mount /dev/drbd1 /drbd_mysql
6. MySQL の起動
/etc/init.d/mysql start
1.5 Heartbeat の導入
1.5.1 Heartbeat の設定
heartbeat のパッケージと、/etc/ha.d/resource.d/drbddisk に heartbeat のリソースファイルを含む、drbd utils をインストールしていると仮定します。
最初に、ip forwarding を有効にする必要があります。
DEBIAN では、/etc/sysctl.conf を編集し以下の行を変更します。
net.ipv4.ip_forward = 1
SUSE では、YAST を使って heartbeat のインタフェースで forwarding を有効にします。(このドキュメントでは eth1 を想定)
双方のホストの /etc/hosts の IP アドレスを設定します。
192.168.10.101 castor 192.168.10.102 pollux
1.5.2 Heartbeat の設定ファイル: /etc/ha.d/ha.cf
双方のホストの /etc/ha.d/ha.cf ファイルを編集します。
# Sample file for /etc/ha.d/ha.cf # (c) Artica ST 2010 debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 warntime 10 initdead 120 udpport 694 bcast eth1 auto_failback on
# auto_failback on Make the cluster go back to master when master onde gets up.
# auto_failback off Let the master node to secondary when it gets up after a failure.
ping 192.168.10.1 # Gateway de nuestra red que debe responder al ping apiauth ipfail gid=haclient uid=hacluster #o los que corresponda node castor node pollux
1.5.3 HA リソースファイル
双方のホストの /etc/ha.d/haresources を編集します。
castor drbddisk Filesystem::/dev/drbd1::/drbd_mysql::ext3 mysql 192.168.10.100
ここでは、デフォルトの "マスター" ノードを定義します。1行に、デフォルトのノード名、ノードを起動・停止するためのリソーススクリプト、ファイルシステムとマウントポイント、drbd リソース (mysql) および仮想 IP アドレス(192.168.10.100)を定義しています。
1.5.4 認証の設定
双方のホストで /etc/ha.d/authkeys を編集します。
auth 2 2 sha1 09c16b57cf08c966768a17417d524cb681a05549
数字の "2" は 2つのノードがあることを意味し、hash が sha1 HASH であることを意味します。
/etc/ha.d/authkeys を chmod します。
chmod 600 /etc/ha.d/authkeys
mysql デーモンの自動起動を無効にします。以降、heartbeat により管理されます。
rm /etc/rc2.d/S??mysql
1.5.5 Heartbeat の最初の起動
まず最初に、DRBD が正常に稼働していて、MySQL が動作し、データベースが作成されていることを確認します。
双方のシステムで heartbeat を起動します。ただし、最初にプライマリノードで実行します。
castor にて:
/etc/init.d/heartbeat start
pollux にて:
/etc/init.d/heartbeat start
全て問題ないかどうかは、/var/log/ha-log のログを見ることによって判断できます。マスターノード(castor)は、仮想 IP アドレスを持っています。pandora のコンソールとサーバの設定ファイルを仮想 IP を使うように修正し、Pandora FMS server を再起動します。
接続が切れたことを検出するために、Pandora FMS server watchdog が必要です。pandora_server.conf にて restart オプションを利用します。
restart 1 restart_delay 60
1.6 HA のテスト: 全体障害のテスト
1. ウェブブラウザを起動しセッションを開始します。サーバビューで自動更新を 5秒にします。
2. プライマリノードをシャットダウンします。
電源offボタンを押します。
-または-
root のコンソールから 'halt' を実行します。
3. どのように切り替えが動作するか見るために、セカンダリノードで tail -f /var/log/ha-log を実行します。
4. 3-5秒程度で切り替わります。