ライン

ポイント:わかったようなわからないような…

ライン

 はじめに

DRBDをもう一度

 MySQL 5.6系のDBMSをLinuxのDRBDを使ってデータ領域をクラスタ化する構成で準備することにしました。
現状、わかりにくいMySQLサーバが動いていて、類似するものを準備することになったので、シンプルに設計したものに変更して準備しようと考えています。
…まずは先に、自宅環境にてお試ししておくことにしました。

 動作環境は、VMware 5.5の無料版にCentOS 6.7を2台準備します。

 インストール

 まず1台目を準備します。

# cd /var/tmp/
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm を取得中
準備中...                ########################################### [100%]
   1:elrepo-release         ########################################### [100%]
# cd /etc/yum.repos.d/
# ll
合計 28
-rw-r--r--. 1 root root 1991  8月  4 01:13 2015 CentOS-Base.repo
-rw-r--r--. 1 root root  647  8月  4 01:13 2015 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root  644  2月  7 05:57 2016 CentOS-Media.repo
-rw-r--r--. 1 root root 6259  8月  4 01:13 2015 CentOS-Vault.repo
-rw-r--r--. 1 root root  289  8月  4 01:13 2015 CentOS-fasttrack.repo
-rw-r--r--  1 root root 2150  2月 10 08:27 2014 elrepo.repo

 では、インストールをしてみます。

# yum --enablerepo=elrepo install drbd84-utils kmod-drbd84
...
依存性を解決しました

=================================================================================
 パッケージ            アーキテクチャ  バージョン                    リポジトリー     容量
=================================================================================
インストールしています:
 drbd84-utils          x86_64          8.9.5-1.el6.elrepo            elrepo          387 k
 kmod-drbd84           x86_64          8.4.7-1_1.el6.elrepo          elrepo          197 k

トランザクションの要約
=================================================================================
インストール         2 パッケージ

総ダウンロード容量: 584 k
インストール済み容量: 1.7 M
これでいいですか? [y/N]

 完了。

 さて、ここでDRBD用のパーティションを準備することにします。
VMwareのハードディスク2を追加で準備(今回仮なので16GB)。

# fdisk -l
...
ディスク /dev/sdb: 17.2 GB, 17179869184 バイト
ヘッド 64, セクタ 32, シリンダ 16384
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000
# fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x0d77cbec で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-16384, 初期値 1):
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-16384, 初期値 16384):
初期値 16384 を使います

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

# fdisk -l
...
ディスク /dev/sdb: 17.2 GB, 17179869184 バイト
ヘッド 64, セクタ 32, シリンダ 16384
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0d77cbec

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1       16384    16777200   83  Linux
# dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0335494 s, 31.3 MB/s

ここまで準備できました。
DRBDの設定ファイルを準備し、続きを行います。

# cd /etc
# ll drbd.*
-rw-r--r-- 1 root root  133  1月 13 03:02 2016 drbd.conf

drbd.d:
合計 4
-rw-r--r-- 1 root root 2062  1月 13 03:02 2016 global_common.conf
# cd /etc/drbd.d
# cp -p global_common.conf global_common.conf_orig
# diff -urN global_common.conf_orig global_common.conf
--- global_common.conf_orig     2016-01-13 03:02:55.000000000 +0900
+++ global_common.conf  2016-12-31 21:25:55.014245064 +0900
@@ -3,7 +3,7 @@
 # feature requests visit http://www.linbit.com

 global {
-       usage-count yes;
+       usage-count no;
        # minor-count dialog-refresh disable-ip-verification
        # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600;
 }

 設定ファイルを新規追加しました。/etc/drbd.d/drbd0.res として準備しました。
protocol Cで同期、ディスクは上記で準備したディスクを指定。
その後は、該当サーバのホスト名を指定。アドレスは、同期用のIPとポートを指定します。

resource drbd0 {
  protocol C;
  meta-disk internal;
  device /dev/drbd0;
  disk /dev/sdb1;
  net     { max-buffers  1600; }
  on mysqlsvr1  {
    address 192.168.255.1:7788;
    }
  on mysqlsvr2  {
    address 192.168.255.2:7788;
    }
}

 メタデータの作成を行います。

# modprobe drbd
# drbdadm create-md drbd0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.

 起動を実行してみます。

# service drbd start
Starting DRBD resources: [
     create res: drbd0
   prepare disk: drbd0
    adjust disk: drbd0
     adjust net: drbd0
]
..........
***************************************************************
 DRBD's startup script waits for the peer node(s) to appear.
 - If this node was already a degraded cluster before the
   reboot, the timeout is 0 seconds. [degr-wfc-timeout]
 - If the peer was available before the reboot, the timeout
   is 0 seconds. [wfc-timeout]
   (These values are for resource 'drbd0'; 0 sec -> wait forever)
 To abort waiting enter 'yes' [  42]:yes
# drbdadm -- --overwrite-data-of-peer primary drbd0
# mkfs.ext4 /dev/drbd0
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
1048576 inodes, 4194163 blocks
209708 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
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

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

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# tune2fs -c 0 -i 0 /dev/drbd0
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
Setting interval between checks to 0 seconds
# mkdir /share
# mount /dev/drbd0 /share
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-LogVol02
                       16G  1.3G   14G   9% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/sda1             283M   38M  231M  15% /boot
/dev/drbd0             16G   44M   15G   1% /share
# drbd-overview
 0:drbd0/0  WFConnection Primary/Unknown UpToDate/DUnknown /share ext4 16G 44M 15G 1%

 動作は問題なさそうです。もう1台側が準備されていないので、後ほど設定を行おうと思います。

…コピーしてホストを準備しました。
2号機側で状態を確認します。※drbdadm invalidate drbd0は、2号機のみで実施

# drbdadm invalidate drbd0
# service drbd status
drbd driver loaded OK; device status:
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
m:res    cs          ro                   ds                     p  mounted  fstype
0:drbd0  SyncTarget  Secondary/Secondary  Inconsistent/UpToDate  C
...      sync'ed:    65.6%                (5644/16380)M

 同期はまだ取れていない状態でした。

# service drbd status
drbd driver loaded OK; device status:
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
m:res    cs         ro                   ds                 p  mounted  fstype
0:drbd0  Connected  Secondary/Secondary  UpToDate/UpToDate  C

 完了。1号機をshutdownして、2号機でリソースが見えるかを確認しました。

# drbdadm primary drbd0
# mount /dev/drbd0 /share
# ll /share/
合計 16
-rw-r--r-- 1 root root     0  1月  1 00:11 2017 abc
drwx------ 2 root root 16384 12月 31 23:17 2016 lost+found

 同期ができて参照できていました。

切り替えを確認

 1号機で確認します。

# service drbd status
drbd driver loaded OK; device status:
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
m:res    cs         ro                   ds                 p  mounted  fstype
0:drbd0  Connected  Secondary/Secondary  UpToDate/UpToDate  C
# drbdadm primary drbd0
# service drbd status
drbd driver loaded OK; device status:
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
m:res    cs         ro                 ds                 p  mounted  fstype
0:drbd0  Connected  Primary/Secondary  UpToDate/UpToDate  C
# mount /dev/drbd0 /share
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-LogVol02
                       16G  1.3G   14G   9% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/sda1             283M   38M  231M  15% /boot
/dev/drbd0             16G   44M   15G   1% /share

 ここで切り替えを行うことを前提に落とす作業。

# umount /share
# drbdadm secondary drbd0

 今度は2号機側に切り替えてマウント参照します。

# drbdadm primary drbd0
# service drbd status
drbd driver loaded OK; device status:
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
m:res    cs         ro                 ds                 p  mounted  fstype
0:drbd0  Connected  Primary/Secondary  UpToDate/UpToDate  C
# mount /dev/drbd0 /share
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_01-LogVol02
                       16G  1.3G   14G   9% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/sda1             283M   38M  231M  15% /boot
/dev/drbd0             16G   44M   15G   1% /share

 問題なさそうです。
要するに、自分がプライマリだと宣言してマウントして使い、アンマウントしてから自分がセカンダリだと宣言して解放するという流れ。
手動で実施するのはこのような手順となるわけですね。

続きは、自動切り替えを行う系のツールです。

 HeartbeatとPacemaker

Heartbeat

 さて、CentOS6.7の他のパッケージとマッチするrpmをどうやって入手するのかいまいち不明。
Heartbeatと連携するPacemakerは1.0系というのは読み取れるけど。
リリース [1-02] Pacemakerリポジトリパッケージ (RHEL6) 1.0.13-2.1 - Linux-HA Japan - OSDN
のページに、

pacemaker-1.0.13-2
heartbeat-3.0.5-1.1 

 がリポジトリパッケージと書かれているので、この組み合わせで入れることにしました。
https://ja.osdn.net/projects/linux-ha/downloads/60151/pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz/
ここからファイルを入手して /tmp以下に展開しました。

# cd /tmp
# wget 'http://ja.osdn.net/frs/redir.php?m=iij&f=%2Flinux-ha%2F60151%2Fpacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz''
# tar pzxvf  pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz
# cd /tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/rpm
# ll
合計 9292
-rw-r--r-- 1 root root  266856 12月 24 10:43 2013 cluster-glue-1.0.11-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  112256 12月 24 10:43 2013 cluster-glue-libs-1.0.11-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  110624 12月 24 10:43 2013 cluster-glue-libs-devel-1.0.11-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  168788 12月 24 10:45 2013 corosync-1.4.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  146228 12月 24 10:45 2013 corosynclib-1.4.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  173340 12月 24 10:45 2013 corosynclib-devel-1.4.6-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  165944 12月 24 10:43 2013 heartbeat-3.0.5-1.1.el6.x86_64.rpm
-rw-r--r-- 1 root root  125836 12月 24 10:43 2013 heartbeat-devel-3.0.5-1.1.el6.x86_64.rpm
-rw-r--r-- 1 root root  269176 12月 24 10:43 2013 heartbeat-libs-3.0.5-1.1.el6.x86_64.rpm
-rw-r--r-- 1 root root   61508 12月 24 10:46 2013 ldirectord-3.9.5-1.310.0d443.el6.x86_64.rpm
-rw-r--r-- 1 root root   58112 12月 24 10:43 2013 libesmtp-1.0.4-16.el6.x86_64.rpm
-rw-r--r-- 1 root root   24672 12月 24 10:43 2013 libesmtp-devel-1.0.4-16.el6.x86_64.rpm
-rw-r--r-- 1 root root 5844328 12月 24 10:43 2013 pacemaker-1.0.13-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  268568 12月 24 10:43 2013 pacemaker-libs-1.0.13-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  780272 12月 24 10:43 2013 pacemaker-libs-devel-1.0.13-1.el6.x86_64.rpm
-rw-r--r-- 1 root root   81132 12月 24 10:43 2013 pacemaker-mgmt-2.0.1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root  129856 12月 24 10:43 2013 pacemaker-mgmt-client-2.0.1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root    9336 12月 24 10:43 2013 pacemaker-mgmt-devel-2.0.1-1.el6.x86_64.rpm
-rw-r--r-- 1 root root   47664 12月 25 09:27 2013 pm_crmgen-1.4-1.el6.noarch.rpm
-rw-r--r-- 1 root root   13800 12月 25 09:26 2013 pm_diskd-1.3-1.el6.x86_64.rpm
-rw-r--r-- 1 root root   25248 12月 25 09:27 2013 pm_extras-1.4-1.el6.x86_64.rpm
-rw-r--r-- 1 root root   45512 12月 25 09:27 2013 pm_kvm_tools-1.2-1.el6.x86_64.rpm
-rw-r--r-- 1 root root   31968 12月 25 09:27 2013 pm_logconv-hb-1.3-1.el6.noarch.rpm
-rw-r--r-- 1 root root  480156 12月 24 10:46 2013 resource-agents-3.9.5-1.310.0d443.el6.x86_64.rpm
-rw-r--r-- 1 root root   12392 12月 25 09:27 2013 vm-ctl-1.1-2.el6.noarch.rpm

 一挙にパッケージが取得できました。
これをそのままyumでいれようとすると、依存関係の絡みで進めない。
レポジトリを限定しても同じ。

--> 依存性解決を終了しました。
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libnetsnmp.so.20()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libopenhpi.so.2()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: perl-TimeDate
エラー: パッケージ: heartbeat-3.0.5-1.1.el6.x86_64 (pacemaker)
             要求: libltdl.so.7()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libltdl.so.7()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libOpenIPMIposix.so.0()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libOpenIPMIutils.so.0()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libaio.so.1(LIBAIO_0.4)(64bit)
エラー: パッケージ: cluster-glue-libs-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libltdl.so.7()(64bit)
エラー: パッケージ: heartbeat-libs-3.0.5-1.1.el6.x86_64 (pacemaker)
             要求: libltdl.so.7()(64bit)
エラー: パッケージ: heartbeat-3.0.5-1.1.el6.x86_64 (pacemaker)
             要求: PyXML
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libaio.so.1()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libOpenIPMI.so.0()(64bit)
エラー: パッケージ: cluster-glue-1.0.11-1.el6.x86_64 (pacemaker)
             要求: libaio.so.1(LIBAIO_0.1)(64bit)
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest

 なんだか面倒。
とりあえず、

# yum install heartbeat-3.0.5-1.1.el6.x86_64.rpm heartbeat-libs-3.0.5-1.1.el6.x86_64.rpm cluster-glue-1.0.11-1.el6.x86_64.rpm \
 cluster-glue-libs-1.0.11-1.el6.x86_64.rpm

 として導入を完了。

Pacepaker

続きです。
Corosyncも依存関係により導入しますが、ここでは使用しません。

# yum install pacemaker-1.0.13-1.el6.x86_64.rpm  pacemaker-libs-1.0.13-1.el6.x86_64.rpm corosync-1.4.6-1.el6.x86_64.rpm\
 corosynclib-1.4.6-1.el6.x86_64.rpm
依存性を解決しました

============================================================================
 パッケージ  アーキテクチャ
                    バージョン        リポジトリー                     容量
============================================================================
インストールしています:
 corosync    x86_64 1.4.6-1.el6       /corosync-1.4.6-1.el6.x86_64    418 k
 corosynclib x86_64 1.4.6-1.el6       /corosynclib-1.4.6-1.el6.x86_64 403 k
 pacemaker   x86_64 1.0.13-1.el6      /pacemaker-1.0.13-1.el6.x86_64  8.6 M
 pacemaker-libs
             x86_64 1.0.13-1.el6      /pacemaker-libs-1.0.13-1.el6.x86_64
                                                                      888 k
依存性関連でのインストールをします。:
 gnutls      x86_64 2.8.5-19.el6_7    base                            347 k
 libesmtp    x86_64 1.0.4-15.el6      base                             57 k
 libxslt     x86_64 1.1.26-2.el6_3.1  base                            452 k

トランザクションの要約
============================================================================
インストール         7 パッケージ

合計容量: 11 M
総ダウンロード容量: 856 k
インストール済み容量: 14 M
これでいいですか? [y/N]

 導入完了。

設定(1号機)

 MySQLはのちほど入れますが、まずは基本的な設定を入れます。

# cd /etc/ha.d/
# vi ha.cf

こんな設定にしました。

pacemaker on
autojoin none
logfacility     local1
keepalive 2
auto_failback off
udpport 694
ucast eth1 192.168.255.1
ucast eth1 192.168.255.2
node    mysqlsvr1 mysqlsvr2

同様に、authkeysを設定します。

# vi authkeys

こんな設定にしました。

auth 1
1 sha1 mysqlsync

パーミッションを変更しておきます。

# chmod 600 authkeys

次は、shellfuncsに以下のように設定を加えます。

# cp -p shellfuncs shellfuncs_orig
# diff -urN shellfuncs_orig shellfuncs
--- shellfuncs_orig     2016-05-12 14:12:10.000000000 +0900
+++ shellfuncs  2017-01-09 21:02:42.001696984 +0900
@@ -8,6 +8,8 @@
 : ${HA_SBIN_DIR:=/usr/sbin}
 : ${HA_NOARCHBIN:=/usr/share/heartbeat}
 : ${OCF_AGENTS:=/usr/lib/ocf/resource.d//heartbeat/}
+HA_BIN=/usr/lib64/heartbeat
+

 export HA_DIR HA_RCDIR HA_FIFO HA_BIN
 export HA_DEBUGLOG HA_LOGFILE HA_LOGFACILITY

ログがシスログに出てくるのは、非常に見づらいので、ログを指定します。

# cd /etc
# cp -p rsyslog.conf rsyslog.conf_orig
# vi rsyslog.conf
# diff -urN rsyslog.conf_orig rsyslog.conf
--- rsyslog.conf_orig   2014-12-10 19:05:22.000000000 +0900
+++ rsyslog.conf        2017-01-11 22:05:53.705627170 +0900
@@ -39,7 +39,7 @@

 # Log anything (except mail) of level info or higher.
 # Don't log private authentication messages!
-*.info;mail.none;authpriv.none;cron.none                /var/log/messages
+*.info;mail.none;authpriv.none;cron.none;;local1.none  /var/log/messages

 # The authpriv file has restricted access.
 authpriv.*                                              /var/log/secure
@@ -59,7 +59,8 @@

 # Save boot messages also to boot.log
 local7.*                                                /var/log/boot.log
-
+# 20170111 by fkimura
+local1.*                                               /var/log/ha-log

 # ### begin forwarding rule ###
 # The statement between the begin ... end define a SINGLE forwarding

こんな感じにしました。

# cd /var/log
# touch ha-log
# chown hacluster:haclient ha-log
# service rsyslog restart
システムロガーを停止中:                                    [  OK  ]
システムロガーを起動中:                                    [  OK  ]

 これでスッキリしました。

# cd /etc/logrotate.d/
# cp -p  syslog /root/syslog_orig_logrotate.d
# mv heartbeat /root/heartbeat_orig_logrotate.d
# vi syslog
# diff -urN /root/syslog_orig_logrotate.d syslog
--- /root/syslog_orig_logrotate.d       2014-12-10 19:05:22.000000000 +0900
+++ syslog      2017-01-11 22:29:47.996617272 +0900
@@ -3,6 +3,7 @@
 /var/log/messages
 /var/log/secure
 /var/log/spooler
+/var/log/ha-log
 {
     sharedscripts
     postrotate

こんな感じにしてみました。

ひとまず、ここで2号機の準備ができるのを待ちます。

導入・設定(2号機)

 同様に導入をします。
heartbeatの起動を入れて、問題なく起動できたら、crm_monを入れてみます。

# service heartbeat start
Starting High-Availability services: Done.
# crm_mon
============
Last updated: Mon Jan  9 21:04:16 2017
Stack: Heartbeat
Current DC: mysqlsvr1 (f0f3f2ce-d7c5-4672-a5aa-3d4f89423a9c) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
0 Resources configured.
============

Online: [ mysqlsvr1 mysqlsvr2 ]

試しに1号機側のheartbeatを停止すると、Current DCが2号機に変わることを確認。
基本的な動作はこれで良さそう。

次は、VIPとDRBDを切り替わる部分を確認したい。
まずは、VIP。192.168.1.232を使うことにします。

# crm
crm(live)# configure
crm(live)configure# primitive vip_192.168.1.232 ocf:heartbeat:IPaddr2 \
> params ip="192.168.1.232" cidr_netmask="24" nic="eth0" \
>         op start interval="0s" timeout="30s" on-fail="restart" \
>         op monitor interval="10s" timeout="30s" on-fail="restart" \
>         op stop interval="0s" timeout="30s" on-fail="block"
crm(live)configure# property no-quorum-policy="ignore" stonith-enabled="false"
crm(live)configure# commit
crm(live)configure# quit

逆側でモニターしていた側には、

vip_192.168.1.232     (ocf::heartbeat:IPaddr2):       Started mysqlsvr1

の表示が加わりました。
1号機でIPが付いていることを確認します。

# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:cc:16:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.234/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.232/24 brd 192.168.1.255 scope global secondary eth0

できています。

# service heartbeat restart
Stopping High-Availability services: Done.

Starting High-Availability services: Done.

これで2号機にVIPが付いてくると思います。

vip_192.168.1.232     (ocf::heartbeat:IPaddr2):       Started mysqlsvr2

来ました。
しかしながら、数秒後には取り返して1号機に戻りました。

vip_192.168.1.232     (ocf::heartbeat:IPaddr2):       Started mysqlsvr1

と戻っていきました。
自動で戻ってしまうのは想定外。auto_failback offなのに何故かな。

コマンドで移動するのは問題なし。

# crm resource move vip_192.168.1.232 mysqlsvr2

問題なく、移動することを確認できます。大丈夫。
ここで、DRBDとの連携をやってしまうことにします。

DRBD連動

 さて、マウントとかどうなるか楽しみです。
どちら側でもいいですが、設定に追加を開始します。
CentOS6.5でDRBD8.4を使ってみる - vol.4 CRM設定編 - Qiita
のページの内容をそのまま適用した形を想定しています。

# crm configure edit

加えたのは以下。
※一部は加筆

primitive drbd ocf:linbit:drbd \
        params drbdconf="/etc/drbd.conf" drbd_resource="drbd0" \
        op monitor interval="10" role="Slave" \
        op monitor interval="11" role="Master" \
        op stop on-fail="block" interval="0"
primitive filesystem ocf:heartbeat:Filesystem \
        params run_fsck="no" device="/dev/drbd0" directory="/share" fstype="ext4" \
        op monitor interval="15" \
        op stop on-fail="ignore" interval="0"
primitive vip_192.168.1.232 ocf:heartbeat:IPaddr2 \
        params ip="192.168.1.232" cidr_netmask="24" nic="eth0" \
        op start interval="0s" timeout="30s" on-fail="restart" \
        op monitor interval="10s" timeout="30s" on-fail="restart" \
        op stop interval="0s" timeout="30s" on-fail="block" ms ms-drbd drbd \
        meta notify="true"
ms ms-drbd drbd \
        meta notify="true"
location cli-prefer-vip_192.168.1.232 vip_192.168.1.232 \
        rule $id="cli-prefer-rule-vip_192.168.1.232" inf: #uname eq mysqlsvr1
colocation drbd-fs-colocation inf: filesystem ms-drbd:Master vip_192.168.1.232
order drbd-fs-order inf: ms-drbd:promote filesystem:start

こんな感じ。書き込んだら、コミットするのかと聞かれたのでYes。

# crm_mon -Ar
#---------------------------#
============
Last updated: Wed Jan 11 21:05:06 2017
Stack: Heartbeat
Current DC: mysqlsvr2 (~) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
3 Resources configured.
============

Online: [ mysqlsvr1 mysqlsvr2 ]

Full list of resources:

vip_192.168.1.232     (ocf::heartbeat:IPaddr2):       Started mysqlsvr1
 Master/Slave Set: ms-drbd
     Masters: [ mysqlsvr1 ]
     Slaves: [ mysqlsvr2 ]
filesystem      (ocf::heartbeat:Filesystem):    Started mysqlsvr1

Node Attributes:
* Node mysqlsvr1:
    + master-drbd:0                     : 10000
* Node mysqlsvr2:
    + master-drbd:1                     : 10000

いい感じです。crm resource move vip_192.168.1.232 mysqlsvr2 を導入すると、ちゃんと2号機側にVIPは移動し、mountされた先も移動しました。

============
Last updated: Wed Jan 11 21:16:35 2017
Stack: Heartbeat
Current DC: mysqlsvr2 (~) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
3 Resources configured.
============

Online: [ mysqlsvr1 mysqlsvr2 ]

Full list of resources:

vip_192.168.1.232     (ocf::heartbeat:IPaddr2):       Started mysqlsvr2
 Master/Slave Set: ms-drbd
     Masters: [ mysqlsvr2 ]
     Slaves: [ mysqlsvr1 ]
filesystem      (ocf::heartbeat:Filesystem):    Started mysqlsvr2

Node Attributes:
* Node mysqlsvr1:
    + master-drbd:0                     : 10000
* Node mysqlsvr2:
    + master-drbd:1                     : 10000

 移動は1秒程度。なんとも良い感じです。

 試しに、両方のサーバをshutdownし、しばらくしてから2号機、1号機の順で起動してみました。
1分程度は、同期されていませんでしたが、その後は2号機がMasterになって動き出しました。
 今度は、2号機だけ shutdown -r nowで見ていると、すぐに1号機に移動。
2号機がオンラインになると、Masterは2号機に移って行きました。こういう動きは正しいの??
 この状態で1号機のshutdown -r nowはそのままの状態に復帰するだけと思うけど、一応やってみる。
やはり、ここは想定通りです。

 MySQLサーバ連動

インストール

 さて、MySQLを双方に導入して使えるようになることを確認していきます。

# rpm --import http://dev.mysql.com/doc/refman/5.7/en/checking-gpg-signature.html
# rpm -ihv http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm を取得中
準備中...                ########################################### [100%]

依存関係で面倒にならないように、2つを先行して導入更新。

# yum install numactl postfix
...
依存性を解決しました

============================================================================
 パッケージ     アーキテクチャ
                              バージョン                  リポジトリー
                                                                       容量
============================================================================
インストールしています:
 numactl        x86_64        2.0.9-2.el6                 base         74 k
更新:
 postfix        x86_64        2:2.6.6-6.el6_7.1           base        2.0 M

トランザクションの要約
============================================================================
インストール         1 パッケージ
アップグレード       1 パッケージ

総ダウンロード容量: 2.1 M
これでいいですか? [y/N]

次はMySQLをレポジトリより入れます。

# yum --enablerepo='mysql57-community*' install mysql-community-server
...
依存性を解決しました

============================================================================
 パッケージ                  アーキテクチャ
                                    バージョン      リポジトリー       容量
============================================================================
インストールしています:
 mysql-community-libs        x86_64 5.7.17-1.el6    mysql57-community 2.1 M
     置き換えています  mysql-libs.x86_64 5.1.73-5.el6_6
 mysql-community-libs-compat x86_64 5.7.17-1.el6    mysql57-community 1.6 M
     置き換えています  mysql-libs.x86_64 5.1.73-5.el6_6
 mysql-community-server      x86_64 5.7.17-1.el6    mysql57-community 151 M
依存性関連でのインストールをします。:
 mysql-community-client      x86_64 5.7.17-1.el6    mysql57-community  23 M
 mysql-community-common      x86_64 5.7.17-1.el6    mysql57-community 328 k

トランザクションの要約
============================================================================
インストール         5 パッケージ

総ダウンロード容量: 178 M
これでいいですか? [y/N]

結果こんな感じです。

# rpm -qa|grep mysql
mysql57-community-release-el6-7.noarch
mysql-community-libs-5.7.17-1.el6.x86_64
mysql-community-server-5.7.17-1.el6.x86_64
mysql-community-common-5.7.17-1.el6.x86_64
mysql-community-client-5.7.17-1.el6.x86_64
mysql-community-libs-compat-5.7.17-1.el6.x86_64

MySQLの設定ファイルを変更していきます。

# cd /share
# mkdir mysql
# cd /etc
# cp -p my.cnf my.cnf_orig
# vi my.cnf
# diff -urN my.cnf_orig my.cnf# diff -urN my.cnf_orig my.cnf
--- my.cnf_orig 2016-11-28 23:36:18.000000000 +0900
+++ my.cnf      2017-01-12 22:42:37.743437993 +0900
@@ -17,11 +17,26 @@
 # join_buffer_size = 128M
 # sort_buffer_size = 2M
 # read_rnd_buffer_size = 2M
-datadir=/var/lib/mysql
+##datadir=/var/lib/mysql
+datadir=/share/mysql
 socket=/var/lib/mysql/mysql.sock

-# Disabling symbolic-links is recommended to prevent assorted security risks
+log_timestamps=system
+binlog_format=mixed
+
+ignore-db-dir=lost+found
+
+sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES"
 symbolic-links=0
+character-set-server=utf8
+skip-character-set-client-handshake
+
+innodb_file_per_table
+innodb_buffer_pool_size=64M
+innodb_log_file_size=16M
+innodb_log_files_in_group=2
+

+explicit_defaults_for_timestamp=on
 log-error=/var/log/mysqld.log
 pid-file=/var/run/mysqld/mysqld.pid

まずは、サービスを開始してみます。

# /etc/init.d/mysqld start
MySQL データベースを初期化中:                              [  OK  ]
Installing validate password plugin:                       [  OK  ]
mysqld を起動中:                                           [  OK  ]

ディレクトリの中を見てみます。

# ll /share/mysql/
合計 57408
-rw-r----- 1 mysql mysql       56  1月 12 22:08 2017 auto.cnf
-rw------- 1 mysql mysql     1679  1月 12 22:08 2017 ca-key.pem
-rw-r--r-- 1 mysql mysql     1074  1月 12 22:08 2017 ca.pem
-rw-r--r-- 1 mysql mysql     1078  1月 12 22:08 2017 client-cert.pem
-rw------- 1 mysql mysql     1675  1月 12 22:08 2017 client-key.pem
-rw-r----- 1 mysql mysql      350  1月 12 22:08 2017 ib_buffer_pool
-rw-r----- 1 mysql mysql 16777216  1月 12 22:08 2017 ib_logfile0
-rw-r----- 1 mysql mysql 16777216  1月 12 22:08 2017 ib_logfile1
-rw-r----- 1 mysql mysql 12582912  1月 12 22:08 2017 ibdata1
-rw-r----- 1 mysql mysql 12582912  1月 12 22:08 2017 ibtmp1
drwxr-x--- 2 mysql mysql     4096  1月 12 22:08 2017 mysql
-rw-rw---- 1 root  root         6  1月 12 22:08 2017 mysqld_safe.pid
drwxr-x--- 2 mysql mysql     4096  1月 12 22:08 2017 performance_schema
-rw------- 1 mysql mysql     1675  1月 12 22:08 2017 private_key.pem
-rw-r--r-- 1 mysql mysql      451  1月 12 22:08 2017 public_key.pem
-rw-r--r-- 1 mysql mysql     1078  1月 12 22:08 2017 server-cert.pem
-rw------- 1 mysql mysql     1675  1月 12 22:08 2017 server-key.pem
drwxr-x--- 2 mysql mysql    12288  1月 12 22:08 2017 sys

ログを見ておきます。

2017-01-12T22:42:42.916315+09:00 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE'
 and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode.
 They will be merged with strict mode in a future release.
2017-01-12T22:42:42.916391+09:00 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
2017-01-12T22:42:42.921722+09:00 0 [Warning] You need to use --log-bin to make --binlog-format work.
2017-01-12T22:42:43.191039+09:00 0 [Warning] CA certificate ca.pem is self signed.
Version: '5.7.17'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL)

どれも問題はなさそうです。
まずは、1号機の導入設定を終えて、2号機の作業を行います。
とりあえず、1号機のMySQLを停止しました。

# service mysqld stop
mysqld を停止中:                                           [  OK  ]

2号機に倒しておきます。

# crm resource move vip_192.168.1.232 mysqlsvr1

この後は、上記同様にMySQL関連パッケージを導入します。
完了後は1号機で準備したmy.cnfを/etc 配下に配置しました。

記述を忘れましたが、MySQL導入後には以下のように自動起動を停止するように変更します。

# chkconfig mysqld off

2号機側でMySQLのサービスを上げてみます。

# service mysqld start
mysqld を起動中:                                           [  OK  ]

ログ上も問題なしです。
後は、crmの設定でMySQLの上げ下げを面倒をみてあげれば良さげです。

とりあえず、課題が2つ。
1つ目は、resource.d/ 以下にmysql系が存在していない。
作る方法は、検索で2つほどあるみたいだけど、どちらにしても期待する動作にならない(内容は割愛)
2つ目は、Heartbeatのエラーになってしまった場合には、動きが取れないか、サーバリブートをされてしまう。

これには、2日程度考えて試行錯誤(といっても空いた時間でだけど)。
現段階、面倒はやめて、通常の通りにMySQLの起動はするようにする。
また、表示のみを目的でグループを準備するで妥協。
リブートに関しては情報を探している状態。

ひとまずは、こんな感じで動作中。

# crm configure show
node $id="-" mysqlsvr2
node $id="-" mysqlsvr1
primitive drbd ocf:linbit:drbd \
        params drbdconf="/etc/drbd.conf" drbd_resource="drbd0" \
        op monitor interval="10" role="Slave" \
        op monitor interval="11" role="Master" \
        op stop on-fail="block" interval="0"
primitive filesystem ocf:heartbeat:Filesystem \
        params run_fsck="no" device="/dev/drbd0" directory="/share" fstype="ext4" \
        op monitor interval="15" \
        op stop on-fail="ignore" interval="0"
primitive p_mysql lsb:mysqld \
        op start interval="0s" timeout="120s" \
        op stop interval="0s" timeout="120s" \
        op monitor interval="10" timeout="30"
primitive vip_192.168.1.232 ocf:heartbeat:IPaddr2 \
        params ip="192.1.1.232" cidr_netmask="24" nic="eth0" \
        op start interval="0s" timeout="30s" on-fail="restart" \
        op monitor interval="10s" timeout="30s" on-fail="restart" \
        op stop interval="0s" timeout="30s" on-fail="block" ms ms-drbd drbd \
        meta notify="true"
group grp vip_192.168.1.232 p_mysql
ms ms-drbd drbd \
        meta notify="true"
location cli-prefer-vip_192.168.1.232 vip_192.168.1.232 \
        rule $id="cli-prefer-rule-vip_192.168.1.232" inf: #uname eq mysqlsvr1
colocation drbd-fs-colocation inf: filesystem ms-drbd:Master p_mysql vip_192.168.1.232
order drbd-fs-order inf: ms-drbd:promote filesystem:start
property $id="cib-bootstrap-options" \
        dc-version="1.0.13-30bb726" \
        cluster-infrastructure="Heartbeat" \
        no-quorum-policy="ignore" \
        stonith-enabled="false"

VIPのリソースを移動して、逆側に移動すれば、元のMySQLは停止となり、移動先ではMySQLは起動されてくるようにはなっています。
crm resource move grp みたいなF/O F/Bにも使えるけど、WARNINGが表示されているので、使っていないので、マジに表示用のみかな。
※現状だとMySQLの起動停止のタイミングがおかしいので使わない
ちなみに、稼働系になった方のMySQLを停止すると、検知されてサービスを起動して復活してきます。

一見動作としては大丈夫っぽいですが、MySQLのプロセスを強制でKILLしたりすると、はまって動けなくなってしまう状態に…。
また、待機系の側では通常MySQLは停止になっていますが、手動でサービスをあげてしまうことができてしまいます。
※EMERG: Rebooting system…とかエラー表示されるやつです。
これは、対処案が検索で見つけられたので対処してみた。
ha.cfのcrm onになっている箇所をpacemaker onに変更する…というものですね。感謝感謝…。

とりあえず、前者側の課題は、逆のリソースに移動するコマンド入力後、Heartbeatを強制停止(service heartbeat statusで見て、kill -KILL PID)して、状態のファイル群を削除(rm -fr /var/lib/heartbeat/crm/*)という掃除を行い、service heartbeat startしてあげると、やっと待機系側に倒れてくれる…。

============
Last updated: Sat Jan 14 21:58:18 2017
Stack: Heartbeat
Current DC: mysqlsvr2 (-) - partition with quorum
Version: 1.0.13-30bb726
2 Nodes configured, unknown expected votes
3 Resources configured.
============

Online: [ mysqlsvr1 mysqlsvr2 ]

 Master/Slave Set: ms-drbd
     Masters: [ mysqlsvr1 ]
     Slaves: [ mysqlsvr2 ]
filesystem      (ocf::heartbeat:Filesystem):    Started mysqlsvr1
 Resource Group: grp
     vip_192.168.1.232        (ocf::heartbeat:IPaddr2):       Started mysqlsvr1
     p_mysql    (lsb:mysqld):   Started mysqlsvr1

とりあえず、定期的なMySQLのバックアップを実装して、障害時にはよしなに回避かなぁ…。
(ちなみに、後日グループリソースは消してしまいました…)

…と、思ったら、今度はMySQLに接続できないっぽい。VIPじゃなくてローカル…。

# service mysqld stop ; mysqld_safe --skip-grant-tables &
# mysql -u root -p

でログイン。自動で起動されちゃわないように、こんな感じ。

use mysql;
truncate table user;
flush privileges;
update user set authentication_string=password("パスワード") where user='root';
flush privileges;
grant all privileges on *.* to root@'192.168.1.%' identified by 'ネットワーク接続用のパスワード' with grant option;
flush privileges;

…のような修正入れて、service mysqld restartして入れるようにしました。

【後日】
結局、元々のMySQL用の物を利用した設定で動作するように直しました。
F/O F/Bする都度コアダンプ状態でそのままにはできなかったです。
そのうちに記載をアップデート予定です。


【改訂履歴】作成:2016/12/31 更新:2017/01/21


【参照ページ】

Pacemaker+DRBD+heartbeatでMySQLのクラスタ - Qiita
CentOS6.5でDRBD8.4を使ってみる - vol.3 DRBD初期設定編 - Qiita
CentOS6系にてDRBD 8.3.11を構築してマウント。クラスター構成を実現する手順 田舎に住みたいエンジニアの日記
DRBDの仕組みを学ぶ(6):障害時にサブサーバへ自動で切り替える「高可用性WordPressシステム」の作り方 後編 (1-3) - @IT
Amazon LinuxでDRBDとHeartbeatとMySQLを連動させてフェイルオーバー | Developers.IO
(1). Heartbeat + Pacemaker で virtual IP を試す - kazekaoru
[Pacemaker] Pacemaker + Heartbeatによる2ノードクラスタ設定(Apache, Samba) - Life with IT
HeartbeatとPacemakerでStorage GatewayをHA構成にする - 三日坊主
動かして理解するPacemaker ~CRM設定編~ その2 « Linux-HA Japan
動かして理解するPacemaker ~CRM設定編~ その3 « Linux-HA Japan
fetaroの開発備忘録 Pacemaker+drbd+heartbeatでMySQLクラスタ
DRBD製品情報|技術情報|株式会社コンバージョン

DRBD + Heartbeat による Web サーバークラスタ構築 - NETWORK ENGINEER BLOG
LinuxでWordpressクラスタ その1 (Pacemaker+corosync+DRBD+MySQL+Apache) Network For Everyone
[Pacemaker] Pacemaker + Heartbeatによる2ノードクラスタ設定(Apache, Samba) - Life with IT
HAクラスタシステム構築(Heartbeat+DRBD+Apache) - CentOSで自宅サーバー構築

DRBDとHeartbeat [4] Heartbeatの設定 CMS Blog ミツエーリンクス
Heartbeat - Linuxめもがっき

MySQLサーバにログインできないとき - Qiita

3.4.1 ハートビートを用いたNFSのHA構成 CHANGE-MAKERS
Pacemaker のリソースフェイルオーバーについて - NETWORK ENGINEER BLOG
インフラ構築手順書 Pacemaker+MySQLレプリケーション構築【ログローテート設定】
Heartbeatのインストール及び設定 - 技術メモ

 
Copyright © 1996,1997-2006,2007- by F.Kimura,