DRBD 8.4 の設定、切り替え手順（マルチPrimaryバージョン）

# 概要
* DRBD8.4の設定、切り替え手順（マルチPrimaryバージョン）になります
* マルチPrimaryといっても、<b>umountするタイミングで同期するので、<font color=BLUE>Master-Slave構成</font></b>になります。
* ただPrimary/Secondaryと違って切り替えが簡単になります
* マルチPrimaryの場合は、非ファイルシステムが推奨なので、今回はLVM + GFSで組みます

# 設定手順
* 両方のホスト同じ作業してください

## ①DRBDで使うディスクとパーティションの追加
```bash
$ mkdir /data
$ chmod 777 /data

$ sudo fdisk -cu /dev/vdb
とかでパーティション作る
 
### 今回はvdb1ができました。使えるようにします。
$ sudo pvcreate /dev/vdb1
$ sudo vgcreate drbd /dev/vdb1
$ sudo lvcreate -l 100%FREE -n drbd_data drbd
$ sudo dd if=/dev/zero of=/dev/vdb1 bs=1M count=1
 
$ chmod 777 /data

````

## ②DRBDのインストール、設定、ファイルシステム作成、マウント用ディレクトリ作成 
```bash

### 8.4.4をwgetで落としてインストールします。最新バージョンだと色々とbug fixされてるので、そちらを使用。
### http://git.drbd.org/?p=drbd-8.4.git;a=blob;f=ChangeLog;hb=HEAD
$ cd /tmp
$ sudo wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/drbd84-utils-8.4.4-2.el6.elrepo.x86_64.rpm
$ sudo wget http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/kmod-drbd84-8.4.4-1.el6.elrepo.x86_64.rpm
$ sudo rpm -Uvh *drbd*
 
### DRBDの設定
$ sudo vim /etc/drbd.d/global_common.conf
global {
         usage-count no;
}
common {
         net {
                 protocol C;
         }
         syncer {
                 rate 100M;
         }
}
 
### データを同期する設定。今回はdataという名前で設定します
$ sudo vim /etc/drbd.d/sync.res
resource data {
    net {
        allow-two-primaries;
    }
    startup {
         become-primary-on both;
         after-sb-0pri discard-zero-changes;
         after-sb-1pri discard-secondary;
         after-sb-2pri disconnect;
    }
    volume 0 {
        device /dev/drbd_data minor 0;
        disk /dev/drbd/drbd_data;
        meta-disk internal;
    }
    on host-192-168-1-1 {
        address 192.168.1.1:7789;
    }
    on host-192-168-1-2 {
        address 192.168.1.2:7789;
    }
}
# デバイスにマイナー番号が使用されていない場合は、minor0をつける。名前/dev/drbd_で始まらないとだめ。
# diskは論理ボリュームだとだめ。
#
# /etc/drbd.conf:7: Parse error: 'dialog-refresh | minor-count | disable ip-verification' expected,　but got '・
# ってのは文法エラーだと出たりします。全角スペースがあっても怒られるよ！
# onの部分は$ uname -nの名前に設定します
#
# allow-two-primaries;・・・マルチPrimaryにする宣言
# become-primary-on both;・・・DRBD起動時にPrimaryに切り替えてくれる設定
 
# スプリットブレイン（通信が全て切断された状態）が起こったら、
# ①両ノードがセカンダリの場合、もしデータの変更がない場合には、無視してその状態を継続します。
# ②どっちかがプライマリの場合、セカンダリになってるホストのデータを破棄し、再同期
# ③両ノードともプライマリの場合、コネクションを切断して切断モード
 
### drbdのデバイスを作成
$ sudo drbdadm create-md data
# ダメだったらこれ　　　sudo drbdmeta /dev/drbd_data v08 /dev/vdb1 internal create-md
 
### drbd起動。新しく追加する場合は、追加するサーバだけ実行すればOKです。
### ただし、120秒以内にお互いを起動してあげないと同期が取れません。とれなかったらvirt-managerで強制電源OFFせざるを得なくなります。
$ sudo service drbd start
 
### Masterの新規構築の場合は、初回フル同期が必要（Slaveだけ作るときはいりません）
[Primary]
### primary側から初回フル同期
$ sudo drbdadm -- --overwrite-data-of-peer primary data
### UpToDateに変わってるか確認
$ drbd-overview
[ここまで]
 
### 状態確認。 新しくSlaveを追加された際は、syncが走ってるのを確認出来ます
$ drbd-overview
 
### もし、secondaryになってたらPrimaryにしましょう
$ sudo drbdadm -- --overwrite-data-of-peer primary data
```
 
## ③Masterの新規構築の場合は、初回フル同期が必要（Slaveだけ作るときはいりません）

```bash
[Active系]
### Active系から初回フル同期
$ drbdadm -- --overwrite-data-of-peer primary data

### UpToDateに変わってるか確認
$ drbd-overview
``` 

### GFS野設定

```bash
### GFSが使える様に準備
$ sudo yum -y install cman clvmd gfs2-utils lvm2-cluster
$ sudo vim /etc/cluster/cluster.conf
<?xml version="1.0"?>
<cluster name="drbd_cluster" config_version="1">
    <clusternodes>
        <clusternode name="192.168.1.1" nodeid="1">
        </clusternode>
        <clusternode name="192.168.1.2" nodeid="2">
        </clusternode>
    </clusternodes>
</cluster>
  
$ sudo service cman start
  
### lock方法をcluster用に、LVMキャッシュ無効の設定
$ sudo vim /etc/lvm/lvm.conf
-locking_type = 1
+locking_type = 3
  
-write_cache_state = 1
+write_cache_state = 0
  
### キャッシュを消しておく
$ sudo rm -f /etc/lvm/cache/.cache
$ sudo service clvmd start
  
### chkconfig
$ sudo chkconfig clvmd on
$ sudo chkconfig cman on
  
  
### gfs2のファイルシステムを作る
$ sudo mkfs.gfs2 -p lock_dlm -j 2 -t drbd_cluster:data /dev/drbd/drbd_data
# -p: ロックマネージャの指定
# -j: ジャーナルの数量。http://www.drbd.jp/users-guide/s-gfs-create.html　公式が2。
# -t: ロックテーブルの名前。/etc/cluster/cluster.confに記述したクラスタシステム名:クラスタシステム内で一意の名前であればよいとのこと。
  
  
### fstabに書く
$ sudo vim /etc/fstab
/dev/drbd_data     /data             gfs2    defaults        0 0
  
### サービス起動（起動するとマウントもされます）
$ sudo service gfs2 start
 
### chkconfigのon。
$ sudo chkconfig gfs2  on

### gfs2よりdrbdのほうが先に起動しなければならないので、起動順序を入れ替えます
$ cd /etc/rc3.d
$ sudo mv S26gfs2 S70gfs2
$ sudo mv S70drbd S26drbd
```

# 切り替え手順
## ①Masterがrebootした場合、Masterが起動しなくなった場合

* 再起動後、自然と復旧します
* Masterが復旧するまで、slaveがそのままPrimaryになります
 
## ②Slaveがrebootした場合

* slaveの確認をしてください

```bash
### drbdの状況
$ sudo service drbd status
$ sudo drbd-overview
 
### secondaryになってたらprimaryにします
$ sudo drbdadm -- --overwrite-data-of-peer primary data
 
### 下記状態になってるかを確認
$ drbd-overview
  0:data/0  Connected Primary/Primary UpToDate/UpToDate C r-----
 
### gfs2起動
$ sudo service gfs2 start
 
### gfsで/dataがマウントされてるか確認
$ df -Th
```

## ③新しくSlaveを構築したい場合

* この手順に沿って構築してあげてください