Samba 冗長化 (HAクラスタ構成)(目次)
| Table of Contents |
システム構成
|
HeartbeatとDRBDを利用してSambaのHAクラスタ(Active/Stanby)を実現します。
Sambaのデータ(/data)はDRBDでネットワーク越しのデータミラーリングを行い、Heartbeatを利用して自動フェイルオーバーを行ないます。
プライマリ側
-
ホスト名(IP)
- serv11(192.168.11.11)
-
OS
- CentOS 5.5 (kernel 2.6.18-194.11.1.el5)
-
パッケージ
- samba3x-common-3.3.8-0.52.el5_5
- samba3x-3.3.8-0.52.el5_5
- samba3x-winbind-3.3.8-0.52.el5_5
- samba3x-swat-3.3.8-0.52.el5_5
- samba3x-client-3.3.8-0.52.el5_5
- kmod-drbd83-8.3.8-1.el5.centos
- drbd83-8.3.8-1.el5.centos
- heartbeat-2.1.3-3.el5.centos
セカンダリ側
-
ホスト名(IP)
-
OS
- CentOS 5.5 (kernel 2.6.18-194.11.1.el5)
-
パッケージ
- samba3x-common-3.3.8-0.52.el5_5
- samba3x-3.3.8-0.52.el5_5
- samba3x-winbind-3.3.8-0.52.el5_5
- samba3x-swat-3.3.8-0.52.el5_5
- samba3x-client-3.3.8-0.52.el5_5
- kmod-drbd83-8.3.8-1.el5.centos
- drbd83-8.3.8-1.el5.centos
- heartbeat-2.1.3-3.el5.centos
仮想IP
-
ホスト名(IP)
DRBDのインストール・設定
DRBDパーティンションの作成
メタディスク用のパーティンション作成
-
メタディスクのサイズはDRBDユーザーズガイドに計算式があるので参考にして下さい。
ちなみに0.7系では128M固定です。
http://www.drbd.jp/users-guide/ch-internals.html#s-internal-meta-data
-
ざっくり計算すると以下のようになります。
しかし、下記容量ではメタデータ領域が小さいとの警告が出る場合があります。データ容量 メタデータ 10GB 2MB 100GB 5MB 1TB 32MB 10TB 310MB
-
今回のディスクは5GBですが、起動時に警告が表示されるため、200MBのメタデータ領域を作成します。
# fdisk /dev/sdbコマンド (m でヘルプ): nコマンドアクション e 拡張 p 基本領域 (1-4)p領域番号 (1-4): 1最初 シリンダ (1-652, default 1): 1終点 シリンダ または +サイズ または +サイズM または +サイズK (1-652, default 652): +200M
データ用のパーティンション作成
-
残りは全てデータ領域とします。
コマンド (m でヘルプ): nコマンドアクション e 拡張 p 基本領域 (1-4)p領域番号 (1-4): 2最初 シリンダ (26-652, default 26):Using default value 26終点 シリンダ または +サイズ または +サイズM または +サイズK (26-652, default 652):Using default value 652
-
パーティション情報をセーブして終了します。
コマンド (m でヘルプ): w領域テーブルは交換されました!ioctl() を呼び出して領域テーブルを再読込みします。ディスクを同期させます。
DRBDのインストール
-
DRBDはyumで8.3をインストールします。
# yum install drbd83# yum install kmod-drbd83
DRBDの設定
drbd.confの設定
- DRBDの設定を行います。セカンダリ側も同じ設定をします。
- 設定ファイルの詳細については公式サイトを参照の事。 http://www.drbd.jp/documentation/drbd.conf.html
メタファイルの作成
-
meta-diskに「internal」を指定した場合、ext3などのファイルシステムが作成されているとメタファイルの作成に失敗する事があるため、ddコマンドを利用してmeta-diskのデバイスをゼロで埋めます。
詳細は 公式サイトFAQ (英文)を参照# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync
-
メタファイルを作成します。
# drbdadm create-md r0Writing meta data...initializing activity logNOT initialized bitmapNew drbd meta data block successfully created.
自動起動の設定
-
自動起動をonに設定します
# chkconfig drbd on
-
chkconfigコマンドで自動起動のonを確認します。
# chkconfig --list drbddrbd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
DRBDの起動
-
もう1台のDRBDが起動していないため、最初に起動したサーバでは以下のような警告が出ますが、
yesとタイプして先に進みます。起動に成功したら、もう1台も起動します。# /etc/init.d/drbd startStarting DRBD resources: [r0Found valid meta data in the expected location, 0 bytes into /dev/sdb1.d(r0) s(r0) n(r0) ]..........*************************************************************** DRBD's startup script waits for the peer node(s) to appear. - In case this node was already a degraded cluster before the reboot the timeout is 0 seconds. [degr-wfc-timeout] - If the peer was available before the reboot the timeout will expire after 120 seconds. [wfc-timeout] (These values are for resource 'r0'; 0 sec -> wait forever) To abort waiting enter 'yes' [ 13]:yes
-
2台ともDRBDを起動したら、以下のようにして状態を確認します。
「ro:Secondary/Secondary」の通り、起動時は両方ともセカンダリで接続されています。
プライマリへの昇格(プライマリ側のみ)
-
プライマリにしたいサーバで、以下のコマンドを実行するとプライマリへの昇格処理が行われ、同時にデータ同期が実施されます。
# drbdadm -- --overwrite-data-of-peer primary r0
-
次にデータの同期状態を以下のコマンドで確認します。
DRBDボリュームのマウント(プライマリ側のみ)
-
DRBDボリュームにファイルシステムを作成後、マウントします。
[root@serv11 ~]# mke2fs -j /dev/drbd0[root@serv11 ~]# mount -t ext3 /dev/drbd0 /data/
-
ファイルがマウントされている事を確認します。
-
dfコマンドでもマウントを確認する事が可能です。
[root@serv11 ~]# df -hFilesystem サイズ 使用 残り 使用% マウント位置/dev/mapper/VolGroup00-LogVol00 7.2G 2.7G 4.2G 39% //dev/sda1 99M 25M 70M 26% /boottmpfs 125M 0 125M 0% /dev/shm/dev/drbd0 4.8G 138M 4.4G 3% /data
これでDRBDボリュームが利用可能になります。
DRBDの動作確認
プライマリ側で作成したテストファイルがセカンダリ側でも表示される事を確認します。
-
プライマリ側でテストファイルを作成後、セカンダリに降格させる。
(セカンダリへの降格には、DRBDボリュームをアンマウントさせる必要があります)[root@serv11 ~]# echo test > /data/test.txt[root@serv11 ~]# umount /data[root@serv11 ~]# drbdadm secondary r0
-
セカンダリ側をプライマリに昇格させて、テストファイルを確認します。
[root@serv12 ~]# drbdadm primary r0[root@serv12 ~]# mount -t ext3 /dev/drbd0 /data[root@serv12 ~]# cat /data/test.txttest
プライマリ側で作成したファイルが見れれば、DRBDの動作に問題はありません。
Sambaのインストール・設定
Sambaのインストール
-
sambaは3.3系をインストールします
# yum install samba3x# yum install samba3x-swat# yum install samba3x-client
sambaの設定
smb.confの編集
-
sambaの設定ファイル「/etc/samba/smb.conf」を編集します。
# vi /etc/samba/smb.conf[global]workgroup = MYGROUPserver string = Samba Server Version %vlog file = /var/log/samba/log.%mmax log size = 50security = userpassdb backend = tdbsamload printers = no #変更cups options = rawunix charset = UTF-8 #追加dos charset = UTF-8 #追加display charset = UTF-8 #追加hosts allow = 192.168.11. #追加[public] path = /data/public guest ok = no writable = yes[watch] path = /data/watch guest ok = yes writable = no browseable = no
※/data/watchはサービス監視用の共有フォルダです。
-
設定ファイルの構文チェックを行います。
# testparm
共有フォルダの作成
-
共有フォルダを作成します。
# mkdir -m 1777 /data/public# mkdir -m 1777 /data/watch
※共有フォルダにスティッキービットを指定する事で、自分が作成したファイルのみ削除可能になります。
ユーザ作成
-
UNIXユーザとしてhogeを追加します。
# useradd hoge# passwd hogenew password:retype new password:
-
Sambaユーザとしてhogeを追加します。(※hogeはUNIXユーザとして登録済みであること)
# pdbedit -a hogenew password:retype new password:Unix username: hogeNT username:Account Flags: [U ]User SID: S-1-5-21-2455231410-8090910-4175433884-1000Primary Group SID: S-1-5-21-2455231410-8090910-4175433884-513Full Name:Home Directory: \\serv11\hogeHomeDir Drive:Logon Script:Profile Path: \\serv11\hoge\profileDomain: SERV11Account desc:Workstations:Munged dial:Logon time: 0Logoff time: neverKickoff time: neverPassword last set: 土, 04 9月 2010 09:15:57 JSTPassword can change: 土, 04 9月 2010 09:15:57 JSTPassword must change: neverLast bad password : 0Bad password count : 0Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
自動起動の設定
-
SambaはHeartbeat経由で起動する必要があるため自動起動をOFFにします
# chkconfig smb off
-
chkconfigコマンドで自動起動offを確認します。
# chkconfig --list smbsmb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
Heartbeatのインストール・設定
Heartbeatのインストール
-
yumでインストールします。 先にstonithをインストールしないとheartbeatのインストールに失敗します。
# yum install heartbeat-stonith# yum install heartbeat
Heartbeatの設定
-
heartbeatの設定で利用するファイルは以下の通りです。尚、heartbeatの設定は特に記述がない限り、プライマリとセカンダリで全く同じ設定を行います。
ファイル名 説明 備考 /etc/ha.d/ha.cf クラスタ構成を定義するメイン設定ファイル /etc/ha.d/haresources Version1用のリソース設定ファイル /etc/ha.d/authkeys 認証設定ファイル
-
設定ファイルはサンプルがあるのでコピーします。
# cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/# cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/# cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
-
Samba用のリソース起動スクリプトを用意します。
# ln -s /etc/init.d/smb /etc/ha.d/resource.d/smb
ha.cfの設定
-
ha.cfを編集します。ほとんどの設定がコメントアウトを解除しただけです。
# vi /etc/ha.d/ha.cflogfile /var/log/ha-loglogfacility local0keepalive 2deadtime 30warntime 10initdead 120udpport 694#baud 19200 # シリアルケーブル用の設定(今回は利用しない)#serial /dev/ttyS0 # シリアルケーブル用の設定(今回は利用しない)bcast eth0 auto_failback offnode serv11 #uname -nnode serv12 #uname -nrespawn root /usr/local/bin/check_service #サービス監視スクリプト
haresourcesの設定
-
共有リソースの設定はDRBDに関する設定を一行追加します。
- 書式 [node-name resource1 resource2 ... resourceN]
- resourceの部分は「/etc/ha.d/resource.d」配下のファイル名を記載します。
- 各リソースに渡す引数は「::」で区切って記述します。
-
リソースがIPADDRの場合はリソース名を省略可能です。
# vi /etc/ha.d/haresourcesserv11 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 smb 192.168.11.10/24
authkeysの設定
-
認証の設定を行います。認証は現時点で最もセキュリティレベルの高いsha1を利用します。
# vi /etc/ha.d/authkeysauth 22 sha1 test
-
セキュリティを確保するため、ファイルパーミッションを変更します。セカンダリ側も同様に設定します。
# chmod 600 /etc/ha.d/authkeys
サービス監視スクリプトの作成
-
Heartbeatはサーバ間のフェイルオーバを自動的に行いますが、Sambaサービスが異常終了してもフェイルオーバしません。
そのため、監視スクリプトを作成してサービスが正しく動作している事を監視する必要があります。# vi /usr/local/bin/check_service#!/bin/sh#=============================================# heartbeat用 Sambaサービス監視スクリプト#=============================================#-----------------------------------------------------------------INTERVAL=5 # 監視間隔VIP=192.168.11.10 # 仮想IPGATEWAY=192.168.11.1 # ゲートウェイMNT_POINT=/mnt/samba#-----------------------------------------------------------------#ログを記録するLog_Write() { /bin/logger -p local0.crit -t "check_service" $1}#-----------------------------------------------------------------while :do sleep $INTERVAL # # 仮想IPアドレスの有無を確認 # /etc/ha.d/resource.d/IPaddr $VIP status > /dev/null 2>&1 if [ $? -ne 0 ] then continue fi # # ゲートウェイとの通信確認 # ping -c 1 -w 1 $GATEWAY > /dev/null 2>&1 if [ $? -ne 0 ] then Log_Write "Destination ".$GATEWAY." Unreachable" /usr/lib/heartbeat/heartbeat -k exit fi # # Sambaのサービス確認 # mount.cifs //$VIP/watch $MNT_POINT -o guest if [ $? -ne 0 ] then Log_Write "Samba service failed" /usr/lib/heartbeat/heartbeat -k exit else umount $MNT_POINT fidone※whileの後の:(コロン)はtrueと同じですが、:の方がtrueより実行効率が良いです。
-
スクリプトに実行権限を付与します。
# chmod +x /usr/local/bin/check_service
-
サービス確認用のマウントポイントを作成します。
# mkdir /mnt/samba
自動起動の設定
-
自動起動をonに設定します。セカンダリ側も同様に設定します。
# chkconfig heartbeat on
-
chkconfigコマンドで自動起動のonを確認します。
# chkconfig --list heartbeat heartbeat 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Heartbeatの起動
-
Sambaサービスを停止させDRBDをセカンダリへ変更します。
# /etc/init.d/smb stop# umount /data# drbdadm secondary r0
-
Heartbeatを起動します。セカンダリ側も同様に起動させます。
# /etc/init.d/heartbeat start
冗長化(HA)の動作確認
プライマリ側のSambaを停止させてフェイルオーバー、フェイルバックの動作確認を行います。
初期状態の確認
-
serv11(プライマリ側)の状態を確認します。
仮想IPが割り当てられている事を確認します。[root@serv11 ~]# ifconfig -a eth0:0eth0:0 Link encap:Ethernet HWaddr 00:0C:29:BF:CC:32 inet addr:192.168.11.10 Bcast:192.168.11.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0x1400
-
DRBD領域をマウントしている事を確認します。
-
Sambaが起動されている事を確認します。
[root@serv11 ~]# ps ax |grep smb 9885 ? Ss 0:00 smbd -D 9886 ? S 0:00 smbd -D
-
serv12(セカンダリ側)の状態を確認します。
仮想IPが割り当てられていない事を確認します。[root@serv12 ~]# ifconfig -a eth0:0eth0:0 Link encap:Ethernet HWaddr 00:0C:29:0F:CB:EB UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0x1400
-
DRBD領域もマウントされていない事を確認します。
-
Sambaが起動していない事を確認します。
[root@serv12 ~]# ps ax |grep smb
フェイルオーバーの確認
-
フェイルオーバーの確認をするため、serv11(プライマリ側)のSambaを停止させます。
[root@serv11 ~]# /etc/init.d/smb stopSMB サービスを停止中: [ OK ]
-
serv11の状態を確認します。
Sambaを終了させたため、仮想IPが割り当てられていません。[root@serv11 ~]# ifconfig -a eth0:0eth0:0 Link encap:Ethernet HWaddr 00:0C:29:BF:CC:32 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0x1400
- DRBD領域もマウントされていません。
-
Sambaも起動していません。
[root@serv11 ~]# ps ax |grep smb
-
serv12の状態を確認します。
serv11側でSambaを終了させたため、仮想IPが割り当てられています。[root@serv12 ~]# ifconfig -a eth0:0eth0:0 Link encap:Ethernet HWaddr 00:0C:29:0F:CB:EB inet addr:192.168.11.10 Bcast:192.168.11.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0x1400
- DRBD領域もマウントされています。
-
Sambaも起動しています。
[root@serv12 ~]# ps ax |grep smb19695 ? Ss 0:00 smbd -D19696 ? S 0:00 smbd -D
-
serv11側のheartbeatがサービス監視スクリプトにより停止しているため起動させます。
[root@serv11 ~]# /etc/init.d/heartbeat startlogd is already runningStarting High-Availability services: [ OK ]
フェイルオーバの確認は終了です。