CentOS7でDRBD+CryptSetup+PaceMakerでACT/SBY

#はじめに
サーバをACT/SBYで構築します




#環境
||version|備考|
|:---|:---|:---|
|CentOS|7.4||
|DRBD|9.0||
|cryptSetup|2.0.3||
|paceMaker|1.1.20-5.el7_7.2||
|corosync|2.4.3||

##ディスク追加
今回はKVMで行っています。
SERVER-1とSERVER-2というインスタンスがある前提です。
ディスクの追加を行っていく。

インスタンス確認

```
[root@kvm ~]# virsh list
 Id    名前                         状態
----------------------------------------------------
 126   SERVER-1                     実行中
 127   SERVER-2                     実行中
```

ディスク追加の定義のxml作成

```:/tmp/server-1-adddisk.xml
[root@kvm ~]# vi /tmp/server-1-adddisk.xml
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='none' />
  <source file='/var/lib/libvirt/images/SERVER-1-vdb.qcow2' />
  <target dev='vdb' bus='virtio' />
</disk>
```

```:/tmp/server-2-adddisk.xml
[root@kvm ~]# vi /tmp/server-2-adddisk.xml
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='none' />
  <source file='/var/lib/libvirt/images/SERVER-2-vdb.qcow2' />
  <target dev='vdb' bus='virtio' />
</disk>
```

両方にvdbに16Gで作成

```
[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/SERVER-1-vdb.qcow2 16G
[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/SERVER-2-vdb.qcow2 16G
```

設定を当てる

```
[root@kvm ~]# virsh attach-device SERVER-1 --file /tmp/server-1-adddisk.xml
[root@kvm ~]# virsh attach-device SERVER-2 --file /tmp/server-2-adddisk.xml
```

永続的に設定を反映

```
[root@kvm ~]# virsh attach-device SERVER-1 --file /tmp/server-1-adddisk.xml --config
[root@kvm ~]# virsh attach-device SERVER-2 --file /tmp/server-2-adddisk.xml --config
```
##SERVER設定
IPとhost名とドメインを決めておきましょう。

|号機|hostname|IP|
|:---|:---|:---|
|1号機|SERVER-1|192.168.200.10|
|2号機|SERVER-2|192.168.200.11|

hostsにはお互いのIPを書きましょう。

```
[root@server-1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.200.10 SERVER-1
192.168.200.11 SERVER-2
```

```
[root@server-2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.200.10 SERVER-1
192.168.200.11 SERVER-2
```

##資材インストール
まずは両系で必要なものをインストールしておく。

```
[root@server-1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@server-1 ~]# yum --enablerepo=extras -y install kmod-drbd90
[root@server-1 ~]# yum -y install cryptsetup cryptsetup-libs
[root@server-1 ~]# yum -y install pacemaker
[root@server-1 ~]# yum -y install pcs fence-agents-all

```

```
[root@server-2 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@server-2 ~]# yum --enablerepo=extras -y install kmod-drbd90
[root@server-2 ~]# yum -y install cryptsetup cryptsetup-libs
[root@server-2 ~]# yum -y install pacemaker
[root@server-2 ~]# yum -y install pcs fence-agents-all
```

##増設ディスク初期化
両方で初期化

```
[root@server-1 ~]# parted /dev/vdb -s mklabel msdos -s mkpart primary 0% 100%
```

```
[root@server-2 ~]# parted /dev/vdb -s mklabel msdos -s mkpart primary 0% 100%
```

##DRBD設定
/etc/drbd.d/drbd0.resの編集

```:/etc/drbd.d/drbd0.res
[root@server-1 ~]# vi /etc/drbd.d/drbd0.res
resource drbd0 {
  protocol  C;
  volume 0 {
    device /dev/drbd0;
    disk /dev/vdb;
    meta-disk internal;
  }
  on SERVER-1 {	
    node-id 0;
    address 192.168.200.10:7789;
  }
  on SERVER-2 {	
    node-id   1;
    address   192.168.200.11:7789;
  }
}
```

SERVER-2への配布

```
[root@server-1 ~]# scp -p /etc/drbd.d/drbd0.res root@server-2:/etc/drbd.d/drbd0.res
```

##DRBD作成と起動
create-mdしていきます。

```
[root@server-1 ~]# drbdadm create-md drbd0
md_offset 17179865088
al_offset 17179832320
bm_offset 17179308032

Found some data

 ==> This might destroy existing data! <==

Do you want to proceed?
[need to type 'yes' to confirm] yes //入力箇所

initializing activity log
initializing bitmap (512 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
```


```
[root@server-2 ~]# drbdadm create-md drbd0
md_offset 17179865088
al_offset 17179832320
bm_offset 17179308032

Found some data

 ==> This might destroy existing data! <==

Do you want to proceed?
[need to type 'yes' to confirm] yes //入力箇所

initializing activity log
initializing bitmap (512 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
```

<br>
起動前の状態をlsblkで確認
1号機

```
[root@server-1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm  /
  └─centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
vdb             252:16   0   16G  0 disk
```

2号機

```
[root@server-2 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm  /
  └─centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
vdb             252:16   0   16G  0 disk
```

<br>
DRBDの起動
片方起動させただけだと、終了しない。
待ち合わせをしてるみたいなので、同じタイミングぐらいで。



```
[root@server-1 ~]# systemctl start drbd
```

```
[root@server-2 ~]# systemctl start drbd
```

起動後をlsblkで確認
1号機
drbd0が増えてますね

```
[root@server-1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm  /
  └─centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
vdb             252:16   0   16G  0 disk
└─drbd0         147:0    0   16G  0 disk
```

2号機も確認

```
[root@server-2 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm  /
  └─centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
vdb             252:16   0   16G  0 disk
└─drbd0         147:0    0   16G  0 disk
```

<br>
SERVER-1を主系にする

```
[root@server-1 ~]# drbdadm primary --force drbd0
```

ファイルシステムをext4にする

```
[root@server-1 ~]# mkfs.ext4 /dev/drbd0
```

ここで確認の為にマウントしてみます。
両系にマウントするディレクトリを作成しておく。

```
[root@server-1 ~]# mkdir /opt/mntpoint
[root@server-1 ~]# mount /dev/drbd0 /opt/mntpoint
```

```
[root@server-1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm  /
  └─centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
vdb             252:16   0   16G  0 disk
└─drbd0         147:0    0   16G  0 disk /opt/mntpoint
```

さらに同期されるかの確認で適当にファイルを作ってみる

```
[root@server-1 ~]# touch /opt/mntpoint/hoge.txt
```

1号機からアンマウント

```
[root@server-1 ~]# umount /opt/mntpoint
```

2号機にマウントしてlsblk

```
[root@server-2 ~]# mkdir /opt/mntpoint
[root@server-2 ~]# mount /dev/drbd0 /opt/mntpoint
[root@server-2 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm  /
  └─centos-swap 253:1    0  1.6G  0 lvm  [SWAP]
vdb             252:16   0   16G  0 disk
└─drbd0         147:0    0   16G  0 disk /opt/mntpoint
```

ちゃんと同期されてますね。
hoge.txtは削除しておきましょう。

```
[root@server-2 ~]# ll /opt/mntpoint/
-rw-r--r-- 1 root root 0  9月 11 13:07 hoge.txt
```


##ディスク暗号化
今回はKVMなんであまり意味がないかもしれないですが、暗号化しているということで、だれかが安心してくれる場合もある。
<br>

まずdrbdをマウントした状態ならアンマウントしておきます。

```
[root@server-2 ~]# umount /opt/mntpoint
```

フォーマット

```
[root@server-1 ~]# cryptsetup luksFormat -c aes-cbc-essiv:sha256 -s 256 /dev/drbd0
WARNING!
========
This will overwrite data on /dev/drbd0 irrevocably.

Are you sure? (Type uppercase yes): YES　//大文字のYESしか認識してくれなかった
Enter passphrase for /dev/drbd0:
Verify passphrase: //【パスワード】入力
encrypt success //【パスワード】再入力
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1048576 inodes, 4193655 blocks
209682 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
128 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, 2654208,
        4096000

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

cryptdirという名前で暗号化ディレクトリを作る

```
[root@server-1 ~]# echo 【パスワード】 | cryptsetup luksOpen /dev/drbd0 cryptdir
```

そうすると

```
[root@server-1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part  /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm   /
  └─centos-swap 253:1    0  1.6G  0 lvm   [SWAP]
vdb             252:16   0   16G  0 disk
└─drbd0         147:0    0   16G  0 disk
  └─cryptdir    253:2    0   16G  0 crypt 　　　　　　　　//なんかぽいのができる
```
<br>
/dev/mapper/の下にさっきのcryptdirができているので、ファイルシステムをext4で作成

```
[root@server-1 ~]# mkfs.ext4 /dev/mapper/cryptdir
```

DRBDこみで同期するかを確認します。確認します。
/dev/mapper/cryptdir
こいつをさっきのマウントポイントに。

```
mount /dev/mapper/cryptdir /opt/mntpoint
```

マウントされました。

```
[root@server-1 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sr0              11:0    1 1024M  0 rom
vda             252:0    0   16G  0 disk
├─vda1          252:1    0    1G  0 part  /boot
└─vda2          252:2    0   15G  0 part
  ├─centos-root 253:0    0 13.4G  0 lvm   /
  └─centos-swap 253:1    0  1.6G  0 lvm   [SWAP]
vdb             252:16   0   16G  0 disk
└─drbd0         147:0    0   16G  0 disk
  └─cryptdir    253:2    0   16G  0 crypt /opt/mntpoint
```

さきほどのように、適当にファイルを作ってみる

```
[root@server-1 ~]# touch /opt/mntpoint/hoge.txt
```

1号機からアンマウント

```
[root@server-1 ~]# umount /opt/mntpoint
```

暗号化解除

```
[root@server-1 ~]# cryptsetup luksClose cryptdir
```

2号機で暗号化したのちマウント

```
[root@server-2 ~]# echo 【パスワード】 | cryptsetup luksOpen /dev/drbd0 cryptdir
[root@server-2 ~]# mount /dev/mapper/cryptdir /opt/mntpoint
```

ありますね。

```
[root@server-2 ~]# ll /opt/mntpoint/
-rw-r--r-- 1 root root 0  9月 11 13:51 hoge.txt
```

2号機からアンマウントと暗号化解除

```
[root@server-1 ~]# umount /opt/mntpoint
[root@server-1 ~]# cryptsetup luksClose cryptdir
```
<br>
ここでのちにpacemakerにリソース管理をさせる為、
systemdのサービスとして、/usr/lib/systemd/system/encrypt.serviceを作成。

```:/usr/lib/systemd/system/encrypt.service
[root@server-1 ~]# vi /usr/lib/systemd/system/encrypt.service
[Unit]
Description=encrypt
[Service]
ExecStart=/opt/bin/encryptstart.sh
ExecStop=/opt/bin/encryptstop.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
```

systemctl start encryptしたときに実行されるscript

```:/opt/bin/encryptstart.sh
[root@server-1 ~]# mkdir /opt/bin
[root@server-1 ~]# vi /opt/bin/encryptstart.sh
#!/usr/bin/sh
/usr/bin/echo 【パスワード】 | /usr/sbin/cryptsetup luksOpen /dev/drbd0 cryptdir
```

systemctl stop encryptしたときに実行されるscript

```:/opt/bin/encryptstop.sh
[root@server-1 ~]# vi /opt/bin/encryptstop.sh
#!/usr/bin/sh
/usr/sbin/cryptsetup luksClose cryptdir
```

２号機にも送っておきましょう。

```
[root@server-1 ~]# scp -p /usr/lib/systemd/system/encrypt.service root@server-2:/usr/lib/systemd/system/encrypt.service
[root@server-1 ~]# scp -rp /opt/bin root@server-2:/opt/bin
```

systemd設定反映
1号機

```
[root@server-1 ~]# systemctl daemon-reload
```

2号機

```
[root@server-2 ~]# systemctl daemon-reload
```
##pacemakerとcorosyncの設定
一旦まずはDRBD停止します。

```
[root@server-1 ~]# systemctl stop drbd
```

```
[root@server-2 ~]# systemctl stop drbd
```

/etc/corosync/corosync.confを編集

```:/etc/corosync/corosync.conf
[root@server-1 ~]# vi /etc/corosync/corosync.conf
totem {
	version: 2
	cluster_name: XXX_cluster
	secauth: off
	transport: udpu
}

nodelist {
	node {
		ring0_addr: SERVER-1
		nodeid: 1
	}

	node {
		ring0_addr: SERVER-2
		nodeid: 2
	}
}

quorum {
	provider: corosync_votequorum
	two_node: 1
}

logging {
	to_logfile: yes
	logfile: /var/log/cluster/corosync.log
	to_syslog: yes
}
```

2号機へ転送

```
[root@server-1 ~]# scp -p /etc/corosync/corosync.conf　192.168.200.11:/etc/corosync/corosync.conf
```
<br>
/etc/sysconfig/pacemakerの編集

```:/etc/sysconfig/pacemaker
[root@server-1 ~]# vi /etc/sysconfig/pacemaker
# PCMK_fail_fast=no
↓
PCMK_fail_fast=yes
```

2号機へ転送

```
[root@server-1 ~]# scp -p /etc/sysconfig/pacemaker　192.168.200.11:/etc/sysconfig/pacemaker
```

中身を変更しているわけではないが、一応/etc/systemd/system/にサービスをコピーしておく

```
[root@server-1 ~]# cp -p /usr/lib/systemd/system/corosync.service /etc/systemd/system/
[root@server-1 ~]# cp -p /usr/lib/systemd/system/pacemaker.service /etc/systemd/system/
[root@server-1 ~]# scp -p /usr/lib/systemd/system/corosync.service root@192.168.200.11:/usr/lib/systemd/system/corosync.service
[root@server-1 ~]# scp -p /usr/lib/systemd/system/pacemaker.service root@192.168.200.11:/usr/lib/systemd/system/pacemaker.service
```

もう一度systemd設定反映
1号機

```
[root@server-1 ~]# systemctl daemon-reload
```

2号機

```
[root@server-2 ~]# systemctl daemon-reload
```

pacemakerの起動

```
[root@server-1 ~]# systemctl start pacemaker
[root@server-1 ~]# systemctl start pcsd
[root@server-1 ~]# systemctl enable pcsd
```
あとhaclusterというユーザにパスワードを付与しておく
1号機

```
[root@server-1 ~]# echo 【haパスワード】 | passwd -f hacluster --stdin
```

2号機

```
[root@server-2 ~]# echo 【haパスワード】 | passwd -f hacluster --stdin
```
<br>
haclusterユーザ使って認証

```
[root@server-1 ~]# pcs cluster auth SERVER-1 SERVER-2 -u hacluster -p 【haパスワード】
```

clusterの設定

```
[root@server-1 ~]# pcs cluster setup --name HA_cluster SERVER-1 SERVER-2 --force
```

クラスタの起動

```
[root@server-1 ~]# pcs cluster start --all
[root@server-1 ~]# pcs cluster enable --all
```

##リソース登録
DRBDの登録

```
[root@server-1 ~]# pcs resource create DRBD ocf:linbit:drbd drbd_resource=drbd0 op monitor interval=10s role=Master monitor interval=30s role=Slave
[root@server-1 ~]# pcs resource master MS_DRBD DRBD master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
```

ディスク暗号化

```
[root@server-1 ~]# pcs resource create ENCRYPT systemd:encrypt --group HA
```

ファイルシステムのマウント

```
[root@server-1 ~]# pcs resource create FS ocf:heartbeat:Filesystem device=/dev/mapper/criptdir directory=/opt/mntpoint fstype=ext4 --group HA
```

なんか色々

```
[root@server-1 ~]# pcs constraint colocation add HA MS_DRBD INFINITY with-rsc-role=Master
[root@server-1 ~]# pcs constraint order promote MS_DRBD then start HA
```

リソースのクリーン

```
[root@server-1 ~]# pcs resource cleanup
```

こういう設定もしたのだけど、なんだったかわすれた・・・

```
[root@server-1 ~]# pcs property set stonith-enabled=false
[root@server-1 ~]# pcs property set no-quorum-policy=ignore
```

あとVIPもリソースに追加

```
[root@server-1 ~]# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.200.12 cidr_netmask=24 --group HA
```

確認

```
[root@server-1 ~]# pcs status
Cluster name: HA_cluster
Stack: corosync
Current DC: SERVER-2 (version 1.1.20-5.el7_7.2-3c4c782f70) - partition with quorum
Last updated: Sun Sep 13 06:57:08 2020
Last change: Thu Sep 10 14:31:58 2020 by root via cibadmin on SERVER-1

2 nodes configured
7 resources configured

Online: [ SERVER-1 SERVER-2 ]

Full list of resources:

 Master/Slave Set: MS_DRBD [DRBD]
     Masters: [ SERVER-1 ]
     Slaves: [ SERVER-2 ]
 Resource Group: HA
     ENCRYPT (systemd:encrypt):              Started SERVER-1
     FS      (ocf::heartbeat:Filesystem):    Started SERVER-1
     VIP     (ocf::heartbeat:IPaddr2):       Started SERVER-1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

```