IDCFクラウド 東西間でDRBDでMariaDBしてみた

IDCFクラウド Advent Calendar 18日目の記事です。中の人です。

# 今回の構成
![Screenshot from 2015-12-18 12-18-03.png](https://qiita-image-store.s3.amazonaws.com/0/16163/7e98b31b-8a65-8f7f-0db7-0eda23b6f451.png)

Virtual Routerを経由させず東西を裏側で接続することもできるので、本当はそうしたかったんですが、今回は間に合わずVirtual Router経由になってしまいました。本気で使うのであれば、裏で東西を接続してDRBDのSyncは裏側を通した方が良いと思います。

上記の構成以外に、比較のため、DRBD無しと同一ゾーン内(Henry)でのDRBD環境も作成しました。

# DRBDの設定
実はDRBDを設定したのは初めてです。今回は特に特別なことは設定しないシンプルな設定です。`global_common.conf`の方は、特に何も変更していません。もしかすると、もっと適切な設定が可能なのかもしれませんが、まぁなにぶん初めてなもんで。

## 利用環境
ということで、DRBDは下記の形でインストール設定しています。DRBDはメジャーなツールなので、詳しく知りたい方は調べてください。いっぱい出てきますので。

* インスタンスタイプはhighcpu.L8のVMを利用
* IDCF CloudのCentOS 7を`yum update`で最新にした物を利用
* 東西それぞれのVMにStaticNATを設定(別にポートフォワードでも出来たかも)
* DRBDのsync対象としてボリュームを追加
* DRBDは[ELRepo](http://elrepo.org/tiki/tiki-index.php)のdrbd-8.4を利用

## インストールまでの流れ
```bash:インストールまでの流れ
# yum -y update

ここでreboot

# yum install http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# yum install drbd84-utils kmod-drbd84
```

## DRBDのコンフィグ
コンフィグファイルとしては`/etc/drbd.d/global_common.conf`と`/etc/drbd.d/*.res`となります。`*.res`は各リソースの設定(要するにsyncさせたいディスクの設定)となります。今回は`*.res`は`resource1.res`としています。
`/etc/drbd.d/global_common.conf`については、今回は特に何も変更せず、デフォルトのままです。

```:/etc/drbd.d/resource1.res
resource resource1 {
    net {
        protocol C;
    }
    volume 0 {
        device    minor 0;
        disk      /dev/sdb;
        meta-disk internal;
    }
    on drbd1.csdidcfcloud.internal {
        address 10.5.0.184:7788;
    }
    on drbd2.cs30idcfcloud.internal {
        address 210.152.xxx.xxx:7788;
    }
}
```
* 注意点
    * `disk`が`/dev/sdb`としている部分(環境によりますが、ボリュームを1台接続した状態ではsdbになるはずです。)のデバイス名が正しいかどうか。
    * `on HOSTNAME`の部分のHOSTNAMEの部分ですが、`uname -n`で表示されるホスト名を記載する必要がある。
    * `address`の部分は、自分自身の設定についてはPrivateIP Addressの方を記載する必要があります。相手側はNATしたPublicIP Addressを記載。
    * 東西でIP以外は同一の設定OK
    * `Protocol`はレプリケーションモードの設定で、`C`は同期レプリケーションの設定になります。

# DRBDの起動
それではDRBDを起動しましょう。

```:起動までの流れ、1台目,2台目、双方で実行
# drbdadm create-md resource1
New drbd meta data block successfully created.

# drbdadm up resource1

# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:41941724
```
`cs:Connected ro:Secondary/Secondary`になればOKです。


```:初期SyncをPrimaryのHenry側だけで実行
# drbdadm --force primary resource1

# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:794524 nr:0 dw:0 dr:795436 al:0 bm:0 lo:0 pe:1 ua:0 ap:0 ep:1 wo:f oos:41147712
        [>....................] sync'ed:  2.0% (40180/40956)M
        finish: 0:37:18 speed: 18,372 (14,980) K/sec
```
`/proc/drbd`で進行状況が確認できます。100%になれば完了。

```:/proc/drbd
# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R7, 2015-04-10 05:13:52
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:41941946 nr:0 dw:20862 dr:41923957 al:10 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
```
100%になると、`cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate`になります。

# mariadb-serverを入れてdrbdの領域を使う
ここからは普通にディスクを追加するのと同じ作業です。デバイス名が`/dev/drbd0`になるだけです。

## MariaDBインストール
CentOS7のMariaDB 5.5をそのまま使いました。

```
# yum install mariadb-server
```

## MariaDBの設定
今回のVMはインスタンスタイプがhighcpu.L8なので、メモリ8GBです。8GBに合せて、ざっくり下記だけ設定しました。まぁ、適当です。

```:/etc/my.cnf.d/server.cnf
[mysqld]
innodb_buffer_pool_size = 6529M
innodb_log_file_size    = 1632M
innodb_fast_shutdown    = 0
```

## DRBD領域のフォーマット
```:format
# mkfs.xfs /dev/drbd0
meta-data=/dev/drbd0             isize=256    agcount=4, agsize=2621358 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=10485431, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=5119, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

## DRBDをマウント
```
# mount /dev/drbd0 /var/lib/mysql
# chown mysql:mysql /var/lib/mysql
```

## MariaDBを起動
```
# systemctl start mariadb
```
# sysbench
## sysbench 0.4.2 oltpテストの設定
比較のために、DRBDなしローカルボリューム、DRBDで同一ゾーン(Henry)でも計測しています。sysbenchのオプションは次のとおりです。--num-threadsは50,100,150で計測しました。

```
sysbench --test=oltp \
  --db-driver=mysql \
  --mysql-host=10.5.0.184 \
  --mysql-user=sbtest \
  --mysql-password=sbtest \
  --oltp-table-size=5000000 \
  --num-threads=50 \
  --max-requests=0 \
  --max-time=180 \
  --oltp-test-mode=complex run
```

初期データは`5,000,000`レコード作成しています。(上記の最期をrunではなくprepareでそのまま実行。)

## sysbench結果
# Transaction / Sec
| Threads       | DRBD無し | DRBD Local | DRBD E/W |
|:-------------:|:-------:|:----------:|:---------:|
| 50            | 1587.13 | 1466.94    | 511.75    |
| 100           | 1528.78 | 1537.17    | 1033.83   |
| 150           | 1508.27 | 1465.59    | 1487.42   |

なかなか優秀ですね。IDCFの東西のネットワーク早いですね！(単にDRBDが優秀とかもあるかもしれないけど。。。もしくは、MariaDBの設定が効きすぎているのか。。。)
良くわからないのは、DRBD E/Wで50Threadsの落ち込みが激しい事ですかね。今回はサーバ側を全然見ていないので、何が起きてるのか見れていないのですが、どうなんだろうか。