2014年8月31日日曜日

SoftLayerに冗長化NFSサーバを(その5)

今回はリストア、リカバリを行います。1号機 (backup11.example.com) の操作例を示します。
2号機の操作例は、基本的に何も変わらないので、割愛させていただきます。


1号機をシャットダウンし、Rescue モードで起動します。
管理ポータル (https://control.softlayer.com/) にて、[Devices]-[Device List] を表示します。[Device Name] 欄から backup11.example.com のリンクをクリックし Device Details を表示します。
OS をシャットダウンします。


sudo shutdown -h now


Device Details 画面にて [Actions]-[Rescue] を選択します。[Are you sure?] という画面が表示されるので [Yes] を選択します。[Rescue Confirmation] 画面が出たら [Close] を選択します。

物理マシンの場合は5分ほどしてから、仮想マシンの場合は1分ほどしてから ssh で接続します。ホスト鍵が変わったという警告が出ても無視してください。OS の root、初期パスワードでログインします。

VPN 経由で Private VLAN 側から接続している前提で、Public VLAN 側の NIC を停止させます。


ifconfig bond1 down
ifconfig eth1 down
ifconfig eth3 down
ifconfig


※2014/9/2追記 ジャンボフレーム対応追加。
NICを冗長化している物理マシンの場合は、
ifconfig bond0 mtu 9000
を実行してください。
NICを冗長化していない物理マシンの場合は、
ifconfig eth0 mtu 9000
を実行してください。
動作確認として、NFS サーバに対し以下のように ping を実行してみてください。
ping -c 1 -M do -s 8972 <NFSサーバのIPアドレス> || echo Error
Error と表示されなければ問題ありません。

NFS のバックアップ領域をマウントします。


mkdir /nfs
mount -t nfs 10.110.88.62:/backup /nfs
grep /nfs /proc/mounts
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
10.110.88.62:/backup /nfs nfs rw,vers=3,rsize=1048576,wsize=1048576,hard,proto=tcp,timeo=600,retrans=2,sec=sys,addr=10.110.88.62 0 0


HDD を初期化します。
この手順は結構時間がかかるので、適宜省いてしまうというのもやむを得ないと思っています。省く場合でも、「bs=1M」を「bs=1M count=10」に置き換える程度にしておいてください。Bare Metal Instance の場合は、/dev/sda しかないので、以降読み替えてください。


DEV=xvd
[ -d /proc/xen/ ] || DEV=sd
dd if=/dev/zero of=/dev/${DEV}a bs=1M
dd if=/dev/zero of=/dev/${DEV}b bs=1M
dd if=/dev/zero of=/dev/${DEV}c bs=1M


パーティショニングします。全く正確に元通り、というわけではないですが、こちらの方が合理的です。4K セクタの HDD に対応しています。パーティション境界を 1MB 単位でそろえることもできます。多くの HDD のデフォルト値「-H 255 -S 63」の方に合理性がないです。パーティション境界(シリンダ境界に揃えるお約束)を約 7.84MB (255 × 63 × 512) 単位に揃える理由が今となっては (Windows Vista 以降) ありません。


fdisk -H 64 -S 32 /dev/${DEV}a << 'EOF'
o
n
p
1

+250M
n
p
2


p
w
EOF

fdisk -H 64 -S 32 /dev/${DEV}b << 'EOF'
o
n
p
1


t
82
p
w
EOF

fdisk -H 64 -S 32 /dev/${DEV}c << 'EOF'
o
n
p
1


t
8e
p
w
EOF

 
Bare Metal Instance の場合は以下となります。

fdisk -H 64 -S 32 /dev/sda << 'EOF'
o
n
p
1

+250M
n
p
2

+25G
n
p
3

+2G
n
e
4


n


t
3
82
t
5
8e
p
w
EOF


バックアップしておいた /nfs/backup11.fstab ファイルを参照し、UUID、ラベル名を確認します。バックアップし忘れていたり、リストアを機に変更したい場合は参照しなくても構いません。リストア後に /etc/fstab, /boot/grub/grub.conf の方を書き換えてください。


cat /nfs/backup11.fstab

#
# /etc/fstab
# Created by anaconda on Mon Aug  4 15:22:24 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=25e4f200-1666-4f44-8d8a-9ccc7f6f70ed /                       ext3    defaults,noatime        1 1
UUID=e0ef2532-aa3d-42c5-b38c-4284d07d95c1 /boot                   ext3    defaults,noatime        1 2
LABEL=SWAP-xvdb1 swap swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

物理マシンでは、swap 領域が以下のようになっています。

UUID=54fdd40c-3d0f-472f-a830-3b23655499ab swap                    swap    pri=0,defaults        0 0


フォーマットします。


mkfs.ext4 -L boot -U e0ef2532-aa3d-42c5-b38c-4284d07d95c1 /dev/${DEV}a1
#tune2fs -c 0 -i 0 /dev/${DEV}a1
tune4fs -c 0 -i 0 /dev/${DEV}a1

mkfs.ext4 -L root -U 25e4f200-1666-4f44-8d8a-9ccc7f6f70ed /dev/${DEV}a2
#tune2fs -c 0 -i 0 /dev/${DEV}a2
tune4fs -c 0 -i 0 /dev/${DEV}a2

#mkswap -L SWAP -U 54fdd40c-3d0f-472f-a830-3b23655499ab /dev/${DEV}b1
mkswap -L SWAP /dev/${DEV}b1


※ SoftLayer の Rescue モードでは、ext2, ext3 でフォーマットしようとした場合、UUID 指定ができませんでした。今回は、設定ファイルの中で ext3 でなければ困るものが特にないので、ext4 でフォーマットすることにします。この場合、tune2fs コマンドではなく、tune4fs コマンドを使います。mkswap においても UUID 指定ができませんでした。前回紹介した Rescue モードでは、このような制限はありません。フォーマット変更の影響範囲に自信がない場合は、元のフォーマットと同じになるようにした方がよいです。


マウントしてリストアします。


mkdir /mnt/sysimage
mount /dev/${DEV}a2 /mnt/sysimage/
cd /mnt/sysimage/
tar xzvf /nfs/backup11.root.tgz
mount /dev/${DEV}a1 /mnt/sysimage/boot
tar xzvf /nfs/backup11.boot.tgz


UUID が変更となった場合、ラベル名が変更となった場合、フォーマットタイプが変更となった場合、以下のファイルを書き換えます。


vi /mnt/sysimage/etc/fstab

vi /mnt/sysimage/boot/grub/grub.conf


MAC アドレスが変更となった場合(発注しなおした場合等)、以下のファイルを書き換えます。仮想マシンでは、udev のルールファイルが存在しません。


vi /mnt/sysimage/etc/udev/rules.d/70-persistent-net.rules

vi /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-eth0

vi /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-eth1

vi /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-eth2

vi /mnt/sysimage/etc/sysconfig/network-scripts/ifcfg-eth3


仮想マシンでは、grub インストールが不要です。SoftLayer のハイパーバイザでは pv-grub/boot/grub/grub.conf を読み込んで処理してくれているからです。
物理マシンでは、grub をインストールする必要があります。仮想マシンの場合に実行しても害はないです。特にメリットもありませんが、OS イメージをどこかに移動する場合のことを考えておくのもありかと思います。試していませんが、dracut を利用している CentOS6 であれば、grub インストールの有無くらいしか、完全仮想化と準仮想化で違いが出ないように思われます。追加のドライバが必要かどうかはまた別の話です。

grub をインストールするための環境を整えます。


mount -t proc /proc /mnt/sysimage/proc
mount -t sysfs /sys /mnt/sysimage/sys
mount --bind /dev /mnt/sysimage/dev
chroot /mnt/sysimage

\cp /proc/mounts /etc/mtab


念のため、grub インストール先デバイスを確認しておきます。


cat /boot/grub/device.map
# this device map was generated by anaconda
(hd0)     /dev/xvda


grub をインストールします。仮想マシンでは実行しても失敗します。


grub-install /dev/sda


仮想マシンでは、引き続き以下の手順でインストールします。


grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> device (hd0) /dev/xvda
device (hd0) /dev/xvda
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  27 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
grub> quit
quit


今回は実行不要ですが、違う環境から持ってきたバックアップをリストアした場合であれば、念のため、初期RAMディスクイメージを作り直しておく方がよいかもしれません。


cd /boot
ls -l
mkinitrd --force initramfs-2.6.32-431.23.3.el6.x86_64.img 2.6.32-431.23.3.el6.x86_64


すべてのディスクをアンマウントして再起動します。


exit

umount /mnt/sysimage/dev
umount /mnt/sysimage/sys
umount /mnt/sysimage/proc
umount /mnt/sysimage/boot
cd
umount /mnt/sysimage

umount /nfs

reboot


OS が起動したらログインします。
lsblkmountswapon -s 等を実行し、意図通りマウントされていることを確認してください。
MAC アドレスを変更した場合は、ifconfig | grep addrcat /proc/net/bonding/bond* 等を実行し、ネットワーク設定が意図通り元に戻っていることを確認してください。その他、バックアップ後に加えた変更事項を反映する必要があります。クラスタ設定については以下の通りです。

共有ディスク領域を初期化します。Bare Metal Instance の場合は /dev/sda5 に読み替えてください。


DEV=sdc
[ -e /proc/xen ] && DEV=xvdc
sudo pvcreate /dev/${DEV}1
sudo vgcreate vg0 /dev/${DEV}1
sudo lvcreate --name drbd0 --size 90G vg0
sudo drbdadm create-md r0


heartbeat (pacemaker) 設定を初期化して起動します。バックアップ後に変更が加えられていても、自動的に反映されます。「sudo crm configure show」 を実行すると現在の設定がわかります。この実行結果を /etc/ha.d/crm.conf.backup 等に保存しておくのもよいかもしれません。


sudo rm -f $(sudo find /var/lib/pengine/) $(sudo find /var/lib/heartbeat/crm/) /var/lib/heartbeat/hb_generation
sudo /etc/init.d/heartbeat start
watch cat /proc/drbd


DRBD の同期が完了すればリカバリ完了です。

0 件のコメント:

コメントを投稿