Pacemaker + Corosyncを用いてクラスタ環境の構築 - iSCSIサーバを利用した共有ディスクの作成

お仕事でLinux環境でHAクラスタを検証する必要が出てきたので、手順を調べてみました。

RHEL 6.4環境で検証しております:

1
2
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)

当然ながらCentOS6でも動作するかと思います。RHEL 7 or CentOS7ではOSの仕組みが変わっていると思いますので、ここでまとめた手順の通りにしてもおそらく動作しません。

ホスト名一覧などは以下のとおりです:

#HostnameIP AddressRemarks
1rhel-act192.168.56.31Active server
2rhel-sta192.168.56.32Standby server
3rhel-logical192.168.56.30Logical hostname / floating IP
4rhel-iscsi192.168.56.40iScsi server

簡単なネットワーク図はこちら:

network diagram

LAN接続のストレージiSCSIとは?によると、以下とのことです:

iSCSIは、SCSIコマンド、データの転送をIPに変換して通信する方式で、イーサネットのインフラが使用できるため、安価にストレージネットワークを構築でき、FC-SANのような専門知識が必要な管理者が不要です。また、距離の制限がなくなるため、よりグローバルなシステム構築が可能です。

仕組みとしてはiSCSIターゲット(共有ディスク)というものに対して、iSCSIイニシエーターが接続することで、共有ディスクを利用することができるようになります。

今回はrhel-iscsiサーバに対して、iSCSIターゲットを導入、セットアップします。

その後、rhel-actサーバ、rhel-staサーバにiSCSIイニシエーターを導入、iSCSIターゲットに接続し、共有ディスクとして利用できることを確認します。

ここではrhel-actおよびにrhel-staからの接続を許可するiSCSIターゲットをrhel-iscsi上に作成します。ターゲット名はiqn.2016-06.local.test.has:sdb、LUNに/dev/sdbを割り当てます。

コマンド or 設定ファイルは設定を永続化するか、しないかによって、どちらを利用するか決めてください。

以下のコマンドを実行し、iSCSI Targetをインストールします:

1
# yum install -y scsi-target-utils

セットアップ方法を説明します。

OS起動時に自動起動するよう設定します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# chkconfig --list > 003_before.txt
# chkconfig tgtd on
# chkconfig --list > 003_after.txt
# diff -u 003_before.txt 003_after.txt
--- 003_before.txt      2016-06-26 14:52:28.420010884 +0800
+++ 003_after.txt       2016-06-26 14:52:39.794971288 +0800
@@ -20,5 +20,5 @@
 saslauthd              0:off   1:off   2:off   3:off   4:off   5:off   6:off
 sshd                   0:off   1:off   2:on    3:on    4:on    5:on    6:off
 svnserve               0:off   1:off   2:off   3:off   4:off   5:off   6:off
-tgtd                   0:off   1:off   2:off   3:off   4:off   5:off   6:off
+tgtd                   0:off   1:off   2:on    3:on    4:on    5:on    6:off
 udev-post              0:off   1:on    2:on    3:on    4:on    5:on    6:off

コマンドによる一時的な指定方法を説明します。この方法を利用した場合、OS起動時に設定がリセットされます:

以下のコマンドを実行し、iSCSIターゲットを作成します:

1
2
# tgtadm --lld iscsi --op new --mode target --tid 1 --targetname \
  iqn.2016-06.local.test.has:sdb

以下のコマンドを実行し、LUN1に対してデバイスを割り当てます:

1
2
# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 \
  --backing-store /dev/sdb

以下のコマンドを実行し、接続を許可するイニシエーターを指定します。ここではrhel-act, rhel-staに対する接続を許可します:

1
2
3
4
# tgtadm --lld iscsi --op bind --mode target --tid 1 \
  --initiator-address 192.168.59.31
# tgtadm --lld iscsi --op bind --mode target --tid 1 \
  --initiator-address 192.168.59.32

設定ファイルを用いたセットアップ方法を以下に示します:

以下のようにして、/etc/tgt/config/*.confを設定ファイルとして参照するようにします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# cd /etc/tgt/
# cp -p targets.conf targets.conf.${YYYYMMDD}

# vi targets.conf
# diff -u targets.conf.${YYYYMMDD} targets.conf
--- targets.conf.20160626       2016-01-20 01:57:37.000000000 +0800
+++ targets.conf        2016-06-26 18:29:04.971000264 +0800
@@ -6,7 +6,7 @@

 # This one includes other config files:

-#include /etc/tgt/temp/*.conf
+include /etc/tgt/config/*.conf


 # Set the driver. If not specified, defaults to "iscsi".

以下のコマンドを実行し、iSCSIターゲットを作成します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# mkdir config
# cd config
# vi shared.conf
# cat shared.conf
<target iqn.2016-06.local.test.has:sdb>
  backing-store /dev/sdb
  initiator-address 192.168.59.31
  initiator-address 192.168.59.32
  write-cache off
  #incominguser iscsiuser iscsi_usr_pass
  #outgoinguser iscsiserver iscsi_srv_pass
</target>

tgtdサービスを再起動し、設定を反映させます:

1
2
3
# service tgtd restart
Stopping SCSI target daemon:                               [  OK  ]
Starting SCSI target daemon:                               [  OK  ]

以下のコマンドを実行し、iSCSIターゲットの設定を確認することができます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2016-06.local.test.has:sdb
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: null
            Backing store path: None
            Backing store flags:
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 8590 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            Backing store type: rdwr
            Backing store path: /dev/sdb
            Backing store flags:
    Account information:
    ACL information:
        192.168.59.31
        192.168.59.32

rhel-act, rhel-staサーバ上でiSCSIイニシエーターをインストールし、iSCSIターゲットに接続できるようにします。

1
# yum install -y iscsi-initiator-utils

セットアップ方法を説明します。

後ほどCorosync+Pacemakerを導入し、そこからイニシエーターを起動するため、OS起動時の自動起動を抑制します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# cd /etc/iscsi/
# cp -p iscsid.conf iscsid.conf.${YYYYMMDD}
# vi iscsid.conf
# diff -u iscsid.conf.${YYYYMMDD} iscsid.conf
--- iscsid.conf.20160626        2016-05-11 07:46:56.000000000 +0800
+++ iscsid.conf 2016-06-26 13:44:40.202000111 +0800
@@ -40,7 +40,7 @@
 # node.startup = automatic
 #
 # To manually startup the session set to "manual". The default is automatic.
-node.startup = automatic
+node.startup = manual

 # For "automatic" startup nodes, setting this to "Yes" will try logins on each
 # available iface until one succeeds, and then stop.  The default "No" will try

セットアップが完了したため、rhel-actサーバからrhel-iscsiサーバ上のiSCSIターゲットに接続し、共有ディスクとして利用できることを確認します。

以下のコマンドを実行し、iSCSIターゲットを探索します:

1
# iscsiadm --mode=discovery --type=sendtargets --portal=192.168.59.40 192.168.59.40:3260,1 iqn.2016-06.local.test.has:sdb

探索結果の確認は以下のコマンドを実行します:

1
2
# iscsiadm -m node
192.168.59.40:3260,1 iqn.2016-06.local.test.has:sdb

以下のコマンドを実行し、探索したiSCSIターゲットにログインし、デバイスとして利用できるようにします:

1
2
3
# iscsiadm -m node --targetname iqn.2016-06.local.test.has:sdb --portal 192.168.59.40:3260 --login
Logging in to [iface: default, target: iqn.2016-06.local.test.has:sdb, portal: 192.168.59.40,3260] (multiple)
Login to [iface: default, target: iqn.2016-06.local.test.has:sdb, portal: 192.168.59.40,3260] successful.

これにより、/dev/sd*としてiSCSIターゲットが認識されているはずです。私の環境では、/dev/sdbとして認識されました。

以降では/dev/sdbとして認識された共有ディスクをセットアップします…といっても、単純にフォーマットし、共有ディスクのマウントポイント/shareにマウントするだけですが…

/dev/sdbとして認識された共有ディスクをフォーマットし、共有ディスクのマウントポイント/shareにマウントします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x8e1d9842.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-8192, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-8192, default 8192):
Using default value 8192

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 83

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2097148 blocks
104857 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

共有ディスクのマウントテスト:

1
2
3
4
5
6
7
8
9
# mkdir /share
# mount /dev/sdb1 /share
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_rheldev-lv_root
                      6.0G  1.3G  4.4G  23% /
tmpfs                 372M   43M  329M  12% /dev/shm
/dev/sda1             485M   32M  428M   7% /boot
/dev/sdb1             7.9G  146M  7.4G   2% /share

以下のようにしてiSCSIターゲットへの接続を解除します。

まずはアンマウント:

1
# umount /share

そして、iSCSIターゲットからログアウトしてあげます:

1
2
3
# iscsiadm -m node --targetname iqn.2016-06.local.test.has:sdb --portal 192.168.59.40:3260 --logout
Logging out of session [sid: 1, target: iqn.2016-06.local.test.has:sdb, portal: 192.168.59.40,3260]
Logout of [sid: 1, target: iqn.2016-06.local.test.has:sdb, portal: 192.168.59.40,3260] successful.