drbdとcorosyncを組み合わせたmysqlの高可用性クラスタサービス


DRBD:Distributed Replicated Block Dvice分散型レプリケーションブロックデバイスは、2つのホストのハードディスクまたはパーティションをミラーデバイスにすることができ、RAID 1の原理に似ているが、プライマリノードのデータをアクティブにネットワークを通じてノードからミラーに同期させ、プライマリノードに障害が発生した場合、セカンダリノードをプライマリノードにし、ミラーデバイスであるため、だからデータは失われません.corosyncのここでの役割はdrbdをpacemakerを介して高利用可能なサービスのリソースにし、プライマリ・スレーブ・ノード間の自動切り替えを容易にすることである.drbdは、各ノード間の独自のハードディスクデバイスを使用するため、共有ストレージが必要なシーンに対してコスト削減の解決策となる.
一、実験計画:
1,本実験は2つのノードnode 1とnode 2を採用し,システムプラットフォームはRedhat 5.8 x 86を採用した.
Node 1のipアドレスは192.168.1.65です
Node 2のipアドレスは192.168.1.66です.
仮想vip:192.168.1.60
2 drbd関連パッケージをインストールし、drbdを構成して起動し、drbdが正常に動作しているかどうかをテストする
3、各ノードにmysqlをインストールし、ここでmysql-5.5.42を使用して汎用バイナリインストールを使用し、ログインをテストします.
4 corosyncおよびpacemakerをインストールし、drbdとmysqlをリソースとしてmysqlベースの高可用性クラスタを実現する
二、実験手順:
1,インストール構成drbd
(1)準備作業
a.ホスト名を変更し、再起動後も有効になるようにする
node1:
# sed -i 's@\(HOSTNAME=\).*@\1node1.test.com' /etc/sysconfig/network
# hostname node1.test.com

node2:
# sed -i 's@\(HOSTNAME=\).*@\1node2.test.com' /etc/sysconfig/network
# hostname node2.test.com

b.両ノードのホスト名解析が正常であることを確認し、/etc/hostsファイルを修正する
192.168.1.65    node1.test.com    node1
192.168.1.66    node2.test.com    node2

c.構成ssh鍵認証に基づく(デュアルマシン相互通信)
node1:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

node2:
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1

d.drbdカーネルモジュールとユーザ空間ツールをダウンロードしてインストールし、ここでdrbd 8を使用する.3バージョン、ダウンロードアドレスはhttp://mirrors.sohu.com/centos/5/extras/i386/RPMS/drbd 83-8.3.8-1.el5.centos.i386.rpm(ユーザ空間コマンドラインツール)kmod-drbd 83-8.3.8-1.el5.centos.i686.rpm(drbdカーネルモジュール)
node 1とnode 2にそれぞれインストールすればいいです.
# yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

e.drbdをコピーしたサンプルファイルはプロファイル(node 1で完了)
# cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc

f.構成/etc/drbd.d/global-common.conf
global {
        usage-count no;
        # minor-count dialog-refresh disable-ip-verification
}
common {
        protocol C;
        handlers {
                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }
        startup {
                #wfc-timeout 120;
                #degr-wfc-timeout 120;
        }
        disk {
                on-io-error detach;
                #fencing resource-only;
        }
        net {
                cram-hmac-alg "sha1";
                shared-secret "mydrbdlab";
        }
        syncer {
                rate 300M;
        }
}

g.リソース/etc/drbdを定義する.d/mydrbd.res、内容は以下の通りです.
resource mydrbd {
    device    /dev/drbd0;
    meta-disk internal;
    disk      /dev/vg_root/mydrbd;
  on node1.test.com {    
    address   192.168.1.65:7789;    
  }
  on node2.test.com {
    address   192.168.1.66:7789;
  }
}

h.node 1上のプロファイルをnode 2上にコピーし、両ノードのプロファイルを一致させる
# scp  -r /etc/drbd.*  node2:/etc

i.2つのノードでそれぞれリソースを初期化し、サービスを開始する
# drbdadm create-md web
# service drbd start

j.起動状態の表示
# drbd-overview 
  0:mydrbd  Connected Secondary/Secondary Inconsistent/Inconsistent C r----

この場合、両方のノードはまだ一致していないため、node 1で次のコマンドを構成するprimaryノードとして手動で構成する必要があります.
# drbdadm -- --overwrite-data-of-peer primary mydrbd

ステータスの再表示:
# drbd-overview 
  0:mydrbd  SyncSource Primary/Secondary UpToDate/Inconsistent C r---- 
    [============>.......] sync'ed: 86.2% (17240/1024300)K delay_probe: 25

データの同期が完了したら、再度確認します.
# drbd-overview 
  0:mydrbd  Connected Primary/Secondary UpToDate/UpToDate C r----

k.プライマリノードにファイルシステムを作成し、drbdはプライマリノードのみがファイルシステムをマウントおよび読み書きでき、ノードからマウントできない
# mkfs.ext3 /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata

テスト/etc/issueファイルを/mydataにコピー
# cp /etc/issue /mydata

node 1のファイルシステムをアンインストールし、drbdロールをsecondaryに変換し、node 2をprimaryに変換し、issueファイルが存在するかどうかをテストします.
node1:
# umount /mydata
# drbdadm secondary mydrbd

node2:
# drbdadm primary mydrbd
# mkdir /mydata
# mount /dev/drbd0 /mydata

ls/mydataは、以前にコピーしたissueファイルが存在するかどうかを確認し、存在する場合はdrbd構成が完了します.
  2.node 1とnode 2に構成mysql-5.5.42をインストールする
準備作業:mysqlユーザー、mysqlグループ、データディレクトリの作成
# groupadd -g 3306 mysql
# useradd -g 3306 -u 3306 -s /sbin/nologin -M mysql
# mkdir /mydata/data

(1)mysql-5.5.42をローカルにダウンロードし、/usr/local/
# tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local

(2)/usr/local/ソフト接続の作成
# cd /usr/local
# ln -sv mysql-5.5.42-linux2.6-i686 mysql
# cd mysql

(3)mysqlディレクトリの変更権限
# chown -R root:mysql ./*

(4)mysqlデータベースの初期化
# scripts/mysql_install_db --user=mysql datadir=/mydata/data

(5)mysqlプロファイルとmysql起動スクリプトのコピーと変更
# cp support-files/my-large.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld
# vim /etc/my.cnf       
  datadir = /mydata/data/
  innodb_file_per_table = 1

(6)テストはmysqlを起動し、テストデータベースtestdbを作成する(テスト前にdrbdを起動し、2つのノードでそれぞれテストする)
# service mysqld start
# mysql
 mysql> create database testdb;
 mysql>\q

(7)テストが完了しmysqlサービスをオフにし、起動させない
# service mysqld stop
# chkconfig mysqld off
# chkconfig mysqld --list

両方のノードのmysqlサービスが構成されていることを確認してください.
  3.構成corosyncのインストール、drbdベースのmysql高可用性サービスの構成
(1)corosyncとpacemakerをインストールし、アドレス(32ビット)をダウンロードするhttp://clusterlabs.org/rpm/epel-5/i386/
必要なインストールパッケージ:cluster-glue,cluster-glue-libs,heartbeat,resource-agents,corosync,heartbeat-libs,pacemaker,corosynclib,libesmtp,pacemaker-libs(以下node 1で完了)
# yum -y --nogpgcheck localinstall /root/cluster/*.rpm

(2)テンプレートプロファイルを/etc/corosync/にコピーし、変更する
# cd /etc/corosync
# cp corosync.conf.example corosync.conf
# vim corosync.conf #    
 secauth: on
 bindnetaddr: 192.168.1.0
#      
service {
  ver:  0
  name: pacemaker
}
aisexec {
  user: root
  group:  root
}

(3)ノード間の通信を生成する鍵ファイル
# corosync-keygen

(4)corosync.confとauthkeyをnode 2にコピー
# scp -p corosync.conf authkey node2:/etc/corosync/

(5)corosyncログが存在するディレクトリの作成
# mkdir /var/log/cluster
# ssh node2  'mkdir /var/log/cluster'

(6)node 1でcorosyncを起動してみる
# /etc/init.d/corosync start

corosyncエンジンが正常に起動しているかどうかを確認します.
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log
Jul 28 12:17:28 corosync [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Jul 28 12:17:28 corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
Jul 28 22:32:06 corosync [MAIN  ] Corosync Cluster Engine exiting with status 0 at main.c:170.
Jul 28 22:32:46 corosync [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
Jul 28 22:32:46 corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.

初期化メンバーノード通知が正常に発行されているかどうかを確認します.
# grep  TOTEM  /var/log/cluster/corosync.log
Jul 28 12:17:28 corosync [TOTEM ] Initializing transport (UDP/IP).
Jul 28 12:17:28 corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
Jul 28 12:17:29 corosync [TOTEM ] The network interface [192.168.1.65] is now up.
Jul 28 12:17:30 corosync [TOTEM ] Process pause detected for 913 ms, flushing membership messages.
Jul 28 12:17:30 corosync [TOTEM ] A processor joined or left the membership and a new membership was formed.

起動中にエラーが発生したかどうかを確認します.
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources

Pacemakerが正常に起動しているかどうかを確認します.
# grep pcmk_startup /var/log/cluster/corosync.log
Jul 28 12:17:30 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized
Jul 28 12:17:30 corosync [pcmk  ] Logging: Initialized pcmk_startup
Jul 28 12:17:30 corosync [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295
Jul 28 12:17:30 corosync [pcmk  ] info: pcmk_startup: Service: 9
Jul 28 12:17:30 corosync [pcmk  ] info: pcmk_startup: Local hostname: node1.test.com
Jul 28 22:32:49 corosync [pcmk  ] info: pcmk_startup: CRM: Initialized

node 1のcorosyncとpacemakerの起動に問題がなければ、node 2の対応するサービスを起動できます.
# ssh node2 '/etc/init.d/corosync start'

(7)corosyncステータスの表示
# crm_mon
============
Last updated: Fri Jul 31 22:52:48 2015
Stack: openais
Current DC: node1.test.com - partition with quorum
Version: 1.0.12-unknown
2 Nodes configured, 2 expected votes
0 Resources configured.
============
Online: [ node1.hpf.com node2.hpf.com ]

(8)stonithを無効にします.ここにstonithデバイスはありませんので、無効にする必要があります.
# crm configure property stonith-enabled=false

(9)法定票数を持たないデフォルトポリシーの設定
# crm configure property no-quorum-policy=ignore

(10)リソースの定義
a.drbd主従リソースの定義
# crm
crm(live)# configure
crm(live)configure# primitive mysqldrbd ocf:heartbeat:drbd params drbd_resource=mydrbd op start timeout=240 op stop timeout=100 op monitor interval=20 role=Master timeout=30 op monitor interval=30 role=Slave timeout=30
crm(live)configure# ms ms_mysqldrbd mysqldrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
crm(live)configure# verify
crm(live)configure# commit

b.自動マウントファイルシステムのリソースの定義
crm(live)# configure
crm(live)configure# primitive mystore ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mydata fstype=ext3 op start timeout=60 op stop timeout=60

c.リソース制約、位置制約、順序制約を定義する
crm(live)configure#
crm(live)configure#

d.mysqlリソースの定義
crm(live)configure#

e.vipの定義
crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip=192.168.1.60 nic=eth0 cidr_netmask=255.255.255.0
crm(live)configure# colocation myip_with_ms_mysqldrbd inf: ms_mysqldrbd:Master myip
vip drbd      ,         
crm(live)configure# verify
crm(live)configure# commit

これでdrbdとcorosyncに基づいて実装されたmysql高可用性クラスタが完了し,主従テストサービスの効果を切り替えることができる.
# crm node standby
# crm node online