Samba 冗長化 (HAクラスタ構成)(目次)

Table of Contents

システム構成

samba_ha.jpg

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)
    • serv12(192.168.11.12)
  • 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)
    • serv11(192.168.11.10)

DRBDのインストール・設定

DRBDパーティンションの作成

メタディスク用のパーティンション作成

  • メタディスクのサイズはDRBDユーザーズガイドに計算式があるので参考にして下さい。
    ちなみに0.7系では128M固定です。
    http://www.drbd.jp/users-guide/ch-internals.html#s-internal-meta-data

  • ざっくり計算すると以下のようになります。
    しかし、下記容量ではメタデータ領域が小さいとの警告が出る場合があります。
    データ容量メタデータ
    10GB2MB
    100GB5MB
    1TB32MB
    10TB310MB


  • 今回のディスクは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の設定を行います。セカンダリ側も同じ設定をします。
    # vi /etc/drbd.conf
    global {
            usage-count no;
    }
    
    common {
            syncer { rate 10M; }
    }
    
    resource r0 {
            protocol B;
            startup {
                    wfc-timeout 120;
            }
            disk {
                    on-io-error pass_on;
            }
            on serv11 {                  # uname -n
                    device /dev/drbd0;
                    disk /dev/sdb2;
                    address 192.168.11.11:7788;
                    meta-disk /dev/sdb1[0];
            }
            on serv12 {                  # uname -n
                    device /dev/drbd0;
                    disk /dev/sdb2;
                    address 192.168.11.12:7788;
                    meta-disk /dev/sdb1[0];
            }
    }

メタファイルの作成

  • meta-diskに「internal」を指定した場合、ext3などのファイルシステムが作成されているとメタファイルの作成に失敗する事があるため、ddコマンドを利用してmeta-diskのデバイスをゼロで埋めます。
    詳細は公式サイトFAQ(英文)を参照
    # dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync

  • メタファイルを作成します。
    # drbdadm create-md r0
    Writing meta data...
    initializing activity log
    NOT initialized bitmap
    New drbd meta data block successfully created.

自動起動の設定

  • 自動起動をonに設定します
    # chkconfig drbd on

  • chkconfigコマンドで自動起動のonを確認します。
    # chkconfig --list drbd
    drbd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

DRBDの起動

  • もう1台のDRBDが起動していないため、最初に起動したサーバでは以下のような警告が出ますが、
    yesとタイプして先に進みます。起動に成功したら、もう1台も起動します。
    #  /etc/init.d/drbd start
    
    Starting DRBD resources: [
    r0
    Found 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を起動したら、以下のようにして状態を確認します。
    #  /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs         ro                   ds                         p  mounted  fstype
    0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
    「ro:Secondary/Secondary」の通り、起動時は両方ともセカンダリで接続されています。

プライマリへの昇格(プライマリ側のみ)

  • プライマリにしたいサーバで、以下のコマンドを実行するとプライマリへの昇格処理が行われ、同時にデータ同期が実施されます。
    # drbdadm -- --overwrite-data-of-peer primary r0

  • 次にデータの同期状態を以下のコマンドで確認します。
    # /etc/init.d/drbd status
    
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build
    by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs          ro                 ds                     p             mounted  fstype
    0:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C
    ...    sync'ed:    2.6%               (4796/4916)M           delay_probe:

DRBDボリュームのマウント(プライマリ側のみ)

  • DRBDボリュームにファイルシステムを作成後、マウントします。
    [root@serv11 ~]# mke2fs -j /dev/drbd0
    [root@serv11 ~]# mount -t ext3 /dev/drbd0 /data/

  • ファイルがマウントされている事を確認します。
    [root@serv11 ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build
    by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext3

  • dfコマンドでもマウントを確認する事が可能です。
    [root@serv11 ~]# df -h
    Filesystem          サイズ  使用  残り 使用% マウント位置
    /dev/mapper/VolGroup00-LogVol00
                          7.2G  2.7G  4.2G  39% /
    /dev/sda1              99M   25M   70M  26% /boot
    tmpfs                 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.txt
    test
    プライマリ側で作成したファイルが見れれば、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 = MYGROUP
    server string = Samba Server Version %v
    
    
    log file = /var/log/samba/log.%m
    max log size = 50
    
    security = user
    passdb backend = tdbsam
    
    load printers = no   #変更
    cups options = raw
    
    unix 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 hoge
    new password:
    retype new password:
  • Sambaユーザとしてhogeを追加します。(※hogeはUNIXユーザとして登録済みであること)
    # pdbedit -a hoge
    
    new password:
    retype new password:
    Unix username:        hoge
    NT username:
    Account Flags:        [U          ]
    User SID:             S-1-5-21-2455231410-8090910-4175433884-1000
    Primary Group SID:    S-1-5-21-2455231410-8090910-4175433884-513
    Full Name:
    Home Directory:       \\serv11\hoge
    HomeDir Drive:
    Logon Script:
    Profile Path:         \\serv11\hoge\profile
    Domain:               SERV11
    Account desc:
    Workstations:
    Munged dial:
    Logon time:           0
    Logoff time:          never
    Kickoff time:         never
    Password last set:    土, 04  9月 2010 09:15:57 JST
    Password can change:  土, 04  9月 2010 09:15:57 JST
    Password must change: never
    Last bad password   : 0
    Bad password count  : 0
    Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

自動起動の設定

  • SambaはHeartbeat経由で起動する必要があるため自動起動をOFFにします
    # chkconfig smb off

  • chkconfigコマンドで自動起動offを確認します。
    #  chkconfig --list smb
    smb             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/haresourcesVersion1用のリソース設定ファイル
    /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.cf
    logfile /var/log/ha-log
    logfacility local0
    keepalive 2
    deadtime 30
    warntime 10
    initdead 120
    
    udpport 694
    #baud    19200      # シリアルケーブル用の設定(今回は利用しない)
    #serial  /dev/ttyS0 # シリアルケーブル用の設定(今回は利用しない)
    bcast eth0 
    
    auto_failback off
    node    serv11  #uname -n
    node    serv12  #uname -n
    
    respawn root /usr/local/bin/check_service #サービス監視スクリプト

haresourcesの設定

  • 共有リソースの設定はDRBDに関する設定を一行追加します。
    • 書式  [node-name resource1 resource2 ... resourceN]
    • resourceの部分は「/etc/ha.d/resource.d」配下のファイル名を記載します。
    • 各リソースに渡す引数は「::」で区切って記述します。
    • リソースがIPADDRの場合はリソース名を省略可能です。
      # vi /etc/ha.d/haresources
      
      serv11 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 smb  192.168.11.10/24

authkeysの設定

  • 認証の設定を行います。認証は現時点で最もセキュリティレベルの高いsha1を利用します。
    # vi /etc/ha.d/authkeys
    auth 2
    2 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            #  仮想IP
    GATEWAY=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
            fi
    
    done
    ※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:0
    eth0: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領域をマウントしている事を確認します。
    [root@serv11 /]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build 
    by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext3

  • 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:0
    eth0: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領域もマウントされていない事を確認します。
    [root@serv12 bin]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build
    by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C

  • Sambaが起動していない事を確認します。
    [root@serv12 ~]# ps ax |grep smb

フェイルオーバーの確認

  • フェイルオーバーの確認をするため、serv11(プライマリ側)のSambaを停止させます。
    [root@serv11 ~]# /etc/init.d/smb stop
    SMB サービスを停止中:                                      [  OK  ]


  • serv11の状態を確認します。
    Sambaを終了させたため、仮想IPが割り当てられていません。
    [root@serv11 ~]# ifconfig -a eth0:0
    eth0: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領域もマウントされていません。
    [root@serv11 ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build 
    by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C


  • Sambaも起動していません。
    [root@serv11 ~]# ps ax |grep smb


  • serv12の状態を確認します。
    serv11側でSambaを終了させたため、仮想IPが割り当てられています。
    [root@serv12 ~]# ifconfig -a eth0:0
    eth0: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領域もマウントされています。
    [root@serv12 ~]# /etc/init.d/drbd status
    drbd driver loaded OK; device status:
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build
    by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext3


  • Sambaも起動しています。
    [root@serv12 ~]# ps ax |grep smb
    19695 ?        Ss     0:00 smbd -D
    19696 ?        S      0:00 smbd -D
  • serv11側のheartbeatがサービス監視スクリプトにより停止しているため起動させます。
    [root@serv11 ~]# /etc/init.d/heartbeat start
    logd is already running
    Starting High-Availability services:
                                                               [  OK  ]
    フェイルオーバの確認は終了です。

FAQ

メタファイル作成時にエラーが表示される

  • Q.
    メタファイル作成時に下記のようなエラーが表示されてメタファイルが作成できない。
    # drbdadm create-md r0
    md_offset 2146758656
    al_offset 2146725888
    bm_offset 2146660352
    
    Found ext3 filesystem which uses 2096448 kB
    current configuration leaves usable 2096348 kB
    
    Device size would be truncated, which
    would corrupt data and result in
    'access beyond end of device' errors.
    You need to either
       * use external meta data (recommended)
       * shrink that filesystem first
       * zero out the device (destroy the filesystem)
    Operation refused.
    
    Command 'drbdmeta 0 v08 /dev/sdb1 internal create-md' terminated with exit code 40
    drbdadm create-md r0: exited with code 40

  • A.
    ext3などのファイルシステムが作成されているとmetaファイルの作成に失敗する事があります。
    その場合はddコマンドを利用してmeta-diskのデバイスをゼロで埋めた後でメタファイルを作成して下さい。
    # dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync
    # drbdadm create-md r0

DRBDが起動しない

  • Q.
    DRBDを起動すると下記エラーが出て起動できない。
    # /etc/init.d/drbd start
    Starting DRBD resources: Can not load the drbd module.
  • A.
    DRBDのモジュールがインストールされていない可能性があります。
    下記の通りインストールしてください。
    # yum install kmod-drbd83

参考

このエントリーをはてなブックマークに追加
Last-modified: 2010-09-05 (日) 19:43:11   最終更新のRSS