Memo/Linux/Pacemaker

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/Pacemaker
 

Pacemaker

Memo/Linux/HeartbeatのRA(リソースエージェント)部分が分離したもの。
面倒なxml設定をcrmを使って割と容易に行える。

  • いくつか組み合わせパターンがある
    • Pacemaker + Corosync
    • Pacemaker + Heartbeat(3以降あまり更新されていない)

Pacemaker1.0 + corosync1.4 を使う場合

CentOS6.3 + Pacemaker1.0 + Heartbeat3.0 + DRDB8.4 + MySQL5.5

  • アクティブ-スタンバイのMySQL環境を構築する
  • 環境
    • VMware 上で2台用意
    • CentOS6.3 x86_64
      • SELinuxは無効にしておく
    • ha01.localdomain プライマリサーバ
      • eth1:10.0.1.101 バックグランド通信用
    • ha02.localdomain セカンダリサーバ
      • eth1:10.0.1.102 バックグランド通信用
    • ha01, ha02共に /dev/sdb をDRDBで同期する事にするので、空きパーティションの確保や追加HDD等で用意
    • サービス用仮想IP: eth0:10.0.0.100
    • MySQL: データベースサーバ
      • 127.0.0.1, ::1 からは認証なしでアクセスできる必要がある
      • 死活監視用のtimeoutが60s(デフォルト)なので、それ以上にする必要がある
      • 死活監視がされるのでアクセスログを取る場合に肥大する場合がある
      • tcp/3306
    • DRBD: 2台以上のサーバで、ネットワーク越しのブロックデバイス(/dev/sdb1等)の同期を行う、分散ストレージシステム。GPLv2
      • udp/7789以上
    • Pacemaker:RA(リソースエージェント)に対し、リソースの起動(start)、停止(stop)、監視(monitor)の指示を行う。heartbeatのCRM部分が分割
    • Heartbeat: ノード死活監視、管理。同等機能の他ソフトとして「Corosync」がある
      • 切り替えは50秒程度?
      • udp/694
      • pm_logconv-hb ログメッセージ制御機能
  • hostname(ha01)
    cat /etc/sysconfig/network
    
    NETWORKING=yes
    HOSTNAME=ha01.localdomain
  • hostname(ha02)
    cat /etc/sysconfig/network
    
    NETWORKING=yes
    HOSTNAME=ha02.localdomain
  • hosts(ha01, ha02)
    cat /etc/hosts
    
    127.0.0.1   localhost server.localdomain
    10.0.1.101   ha01.localdomain                                                                                                      
    10.0.1.102   ha02.localdomain
  • DRDBインストール(ha01, ha02)
    rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm
    
    yum search drbd --enablerepo=elrepo
    drbd83-utils.x86_64 : Management utilities for DRBD
    drbd84-utils.x86_64 : Management utilities for DRBD
    kmod-drbd83.x86_64 : drbd83 kernel module(s)
    kmod-drbd84.x86_64 : drbd84 kernel module(s)
    
    yum install drbd84-utils kmod-drbd84 --enablerepo=elrepo -y
  • DRDB 設定(ha01, ha02)
    cat > /etc/drbd.d/mysql.res << 'EOS'
    resource mysql {
        protocol C;
        device /dev/drbd0;
        meta-disk internal;
    
        on ha01.localdomain {
            address 10.0.1.101:7789;
            disk /dev/sdb;
        }
        on ha02.localdomain {
            address 10.0.1.102:7789;
            disk /dev/sdb;
        }
    }
    EOS
  • DRDB 構築(ha01, ha02)
    # ファイルシステムを初期化してから実行しないとエラーになる
    dd if=/dev/zero bs=1M count=1 of=/dev/sdb; sync
    
    drbdadm create-md mysql
    
    mkdir -p /mnt/drbd/mysql
    
    cat >> /etc/fstab << 'EOS'
    /dev/drbd0              /mnt/drbd/mysql         ext4    defaults        0 0
    EOS
  • DRDB起動(ha01, ha02) 両方ほぼ同時に起動させる必要がある
    service drbd start
    
    # PacemakerのDRBD OCF RA(リソースエージェント)を利用する場合はRAに任せるためOFFにしておく
    chkconfig drbd off
  • ファイルシステムの作成(ha01)
    drbdsetup /dev/drbd0 primary --o
    mkfs.ext4 /dev/drbd0
  • ファイルシステムのマウント(ha01)
    mount /mnt/drbd/mysql
  • DRDBテスト
    # ha01上で適当なファイルを作り、アンマウント、セカンダリに切り替え
    touch /mnt/drbd/mysql/test1.txt
    umount /mnt/drbd/mysql
    drbdsetup /dev/drbd0 secondary
    
    # ha02上でプライマリに切り替え、マウント、確認
    drbdsetup /dev/drbd0 primary
    mkdir -p /mnt/drbd/mysql
    cat >> /etc/fstab << 'EOS'
    /dev/drbd0              /mnt/drbd/mysql         ext4    defaults        0 0
    EOS
    mount /mnt/drbd/mysql
    
    ls -la /mnt/drbd/mysql/
    合計 24
    drwxr-xr-x 3 root root  4096  913 18:45 2012 .
    drwxr-xr-x 3 root root  4096  913 18:47 2012 ..
    drwx------ 2 root root 16384  913 18:39 2012 lost+found
    -rw-r--r-- 1 root root     0  913 18:45 2012 test1.txt
    
    # ha01上でプライマリに戻す
    drbdsetup /dev/drbd0 primary
  • DRDB確認
    cat /proc/drbd
    # または
    service drbd status
  • mysqlサーバのインストール(ha01, ha02)
    yum -y install mysql-server --enablerepo=remi
    
    mkdir -p /mnt/drbd/mysql/mysql
    chown mysql:mysql /mnt/drbd/mysql/mysql
    rm -rf /var/lib/mysql
    ln -s /mnt/drbd/mysql/mysql /var/lib/mysql
  • DB作成(ha01) ha01がDRBDプライマリとした場合
    service mysqld restart
    
    # Pacemakerのmysqld OCF RA(リソースエージェント)を利用する場合はRAに任せるためOFFにしておく
    chkconfig mysqld off
  • Heartbeatのインストール。yumリポジトリがtar.gzであるので入れる(ha01, ha02) バージョンを指定必須
    cd /tmp
    wget -O pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz "http://sourceforge.jp/frs/redir.php?m=iij&f=%2Flinux-ha%2F55568%2Fpacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz"
    tar xvfz pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz
    cd pacemaker-1.0.12-1.1.el6.x86_64.repo
    yum -c pacemaker.repo install heartbeat-3.0.5 pacemaker-1.0.12 pm_extras-1.2 pm_logconv-hb-1.1 -y
  • 標準リポジトリにあるバージョンで更新されないように無視設定(ha01, ha02)
    vi /etc/yum.repos.d/CentOS-Base.repo
    ----
    [base]
    ...
    exclude=pacemaker pacemaker-libs corosync cluster-glue heartbeat resource-agents
    ----
  • ha.cfの設定。マルチキャストまたはブロードキャストをサポートしない環境(Amazon VPC等)向けに、ユニキャスト(ucast)で直接IPアドレス指定(ha01, ha02)
    • "pacemaker on" の時 "crm on"にすると再起動を繰り返すため注意 認できるようになる
    • "uuidfrom nodename"は必須。指定しないと、/var/lib/heartbeat/hb_uuid をマシンのUUIDとして使うため、仮想マシンのイメージをコピーした場合に重複エラーが延々と出る
    • ifcheckd は pm_extrasに含まれ、「crm_mon -A」でインターコネクト通信が正常か確認できるようになる
      cat >> /etc/ha.d/ha.cf << 'EOS'
      pacemaker   on
      #crm         on
      debug       0
      debugfile   /var/log/ha-debug
      logfile     /var/log/ha-log
      logfacility local0
      keepalive   2
      deadtime    30
      initdead    120
      udpport     694
      
      ucast       eth1 10.0.1.101
      ucast       eth1 10.0.1.102
      
      node        ha01.localdomain
      node        ha02.localdomain
      
      uuidfrom    nodename
      respawn root /usr/lib64/heartbeat/ifcheckd
      EOS
  • authkeysの設定(ha01, ha02)
    cat >> /etc/ha.d/authkeys << 'EOS'
    auth 1
    1 crc
    #2 sha1 HI!
    #3 md5 Hello!
    EOS
    
    chmod 600 /etc/ha.d/authkeys
  • /var/log/messages に多量のログが出るため、ログ分離。local0〜local7までのうち使用していないものをha.cfと合わせて指定
    vi /etc/rsyslog.conf
    ----
    *.info;mail.none;authpriv.none;cron.none;local0.none                /var/log/messages
    local0.info                                             /var/log/ha-log
    ----
    service rsyslog restart
  • heartbeatの起動(ha01, ha02)
    service heartbeat restart
    chkconfig heartbeat on
  • pacemakerを使う場合。/etc/ha.d/haresources は使わない。
    # 別コンソールで crm_mon -i1 -f -A でモニタリングしながら実行してみると良い
    
    # ステップbyステップモードで入力
    crm configure
    crm(live)configure# 
    
    # 全体オプションの設定
    # no-quorum-policy: 2台構成の場合ignore。Heartbeatの場合は問題がありignoreのみ動作する。3台以上でCorosyncを使っている場合はfreeze + STONITHが推奨
    # stonith-enabled: 監視対象ノードの異常を検出したときに、強制的にそのノードをダウンさせる
    # startup-fencing: Pacemaker起動時に相手のサーバの状態が把握できない場合に念のために相手をフェンシング(Pacemakerからサーバを強制停止)する
    crm(live)configure# property no-quorum-policy="ignore" stonith-enabled="false" startup-fencing="false"
    
    # リソース動作のデフォルト値を設定
    # resource-stickiness: リソース移動を固定する優先度。INFINITYは不具合がなければリソース移動はしない。
    # migration-threshold: 故障を検知した場合に同一サーバでリソースの再起動を試みる回数
    crm(live)configure# rsc_defaults resource-stickiness="INFINITY" migration-threshold="1"
    
    # 仮想IPの設定 10.0.0.100 を割り当て。このIPにアプリがアクセスする。仮想IPを割り当てられないAmazon VPC等ではEIP等を用いる
    crm(live)configure# primitive ip_mysql ocf:heartbeat:IPaddr2 params ip="10.0.0.100" nic="eth0"
    
    # DRBDリソースの追加
    crm(live)configure# primitive drbd_mysql ocf:linbit:drbd params drbd_resource="mysql"
    # MySQLマスタースレーブ構成リソースの追加
    crm(live)configure# ms ms_drbd_mysql drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
    
    # ファイルシステムリソースの追加(マウント定義)
    crm(live)configure# primitive fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/drbd/mysql" fstype="ext4"
    
    # MySQLリソースの追加
    crm(live)configure# primitive mysqld lsb:mysqld
    
    # リソースグループ: mysql グループにfs_mysql ip_mysql mysqld を追加
    crm(live)configure# group     mysql fs_mysql ip_mysql mysqld
    
    # リソース間の制約:mysqlグループとDRBDマスターは同時に存在
    crm(live)configure# colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
    
    # リソース順序の設定:DRBDマスター起動後に、mysqlグループが起動
    crm(live)configure# order      mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start
    
    # 設定変更後 commit が必要
    crm(live)configure# commit
    
    # 終了
    crm(live)configure# exit
    bye
  • エディタで設定の編集モード
    crm configure edit
  • バッチモードで現在の設定を確認する場合
    crm configure show
  • 別ファイルからロードする場合
    cat >> mysql.crm << 'EOS'
    # Cluster Option
    property \
      no-quorum-policy="ignore" \
      stonith-enabled="false" \
      startup-fencing="false"
    
    # Resource Defaults
    rsc_defaults \
      resource-stickiness="INFINITY" \
      migration-threshold="1"
    
    # MySQL
    primitive ip_mysql \
      ocf:heartbeat:IPaddr2 params ip="10.0.0.100" nic="eth0"
    primitive drbd_mysql \
      ocf:linbit:drbd params drbd_resource="mysql"
    ms ms_drbd_mysql \
      drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
    primitive fs_mysql \
      ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/drbd/mysql" fstype="ext4"
    primitive mysqld lsb:mysqld
    
    # Group
    group     mysql fs_mysql ip_mysql mysqld
    colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
    order      mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start
    EOS
    
    crm configure load update mysql.crm
  • 現在の設定を保存する場合
    crm configure save mysql-`date +%Y%m%d`.crm
  • ip_mysql を削除する場合
    crm configure delete ip_mysql
  • heartbeatのテスト
    crm_mon -i1 -f -A
    
    Online: [ ha02.localdomain ha01.localdomain ]
    
     Master/Slave Set: ms_drbd_mysql
         Masters: [ ha01.localdomain ]
         Slaves: [ ha02.localdomain ] 
     Resource Group: mysql
         fs_mysql   (ocf::heartbeat:Filesystem):    Started ha01.localdomain
         mysqld     (lsb:mysqld):   Started ha01.localdomain                
    
    Node Attributes:
    * Node ha02.localdomain:
        + ha01.localdomain-eth0             : up        
        + master-drbd_mysql:0               : 5         
    * Node ha01.localdomain:
        + ha02.localdomain-eth0             : up        
        + master-drbd_mysql:1               : 5       
    
    # Ctrl-Cで中断
    
    # ha01に /mnt/drbd/mysql がマウントされている
    [root@ha01 ~]# 
    [root@ha01 ~]# df -h
    Filesystem            Size  Used Avail Use% マウント位置
    /dev/mapper/vg_centos6-lv_root
                           28G  2.7G   24G  11% /
    tmpfs                 497M     0  497M   0% /dev/shm
    /dev/sda1             485M   52M  408M  12% /boot
    /dev/drbd0           1008M   18M  940M   2% /mnt/drbd/mysql
    
    # ha01のheartbeatを止めて、故障状態にしてみる
    service heartbeat stop
    
    # ha02での表示(ha01がOFFLINEになっている)
    crm_mon -i1 -f -A
    
    Online: [ ha02.localdomain ]
    OFFLINE: [ ha01.localdomain ]
    
     Master/Slave Set: ms_drbd_mysql
         Masters: [ ha02.localdomain ]
         Stopped: [ drbd_mysql:1 ]    
     Resource Group: mysql
         fs_mysql   (ocf::heartbeat:Filesystem):    Started ha02.localdomain
         mysqld     (lsb:mysqld):   Started ha02.localdomain                
    
    Node Attributes:
    * Node ha02.localdomain:
        + ha01.localdomain-eth0             : up        
        + master-drbd_mysql:0               : 5         
    
    # ha02に /mnt/drbd/mysql がマウントされている
    df -h
    Filesystem            Size  Used Avail Use% マウント位置
    /dev/mapper/vg_centos6-lv_root
                           28G  2.7G   24G  11% /
    tmpfs                 497M     0  497M   0% /dev/shm
    /dev/sda1             485M   52M  408M  12% /boot
    /dev/drbd0           1008M   47M  911M   5% /mnt/drbd/mysql
    
    # ha02でmysqlも稼働している
    mysql -e "show databases;"                                                                                         
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    
    # failcountの表示。
    
    
    # ha01のheartbeat再開させてみる
    service heartbeat start
    
    # ha01がオンラインにはなったが、ha02がマスターのまま
    crm_mon -i1 -f -A
    
    Online: [ ha02.localdomain ha01.localdomain ]
    
     Master/Slave Set: ms_drbd_mysql
         Masters: [ ha02.localdomain ]
         Slaves: [ ha01.localdomain ] 
     Resource Group: mysql
         fs_mysql   (ocf::heartbeat:Filesystem):    Started ha02.localdomain
         mysqld     (lsb:mysqld):   Started ha02.localdomain                
    
    Node Attributes:
    * Node ha02.localdomain:
        + ha01.localdomain-eth0             : up        
        + master-drbd_mysql:0               : 5         
    * Node ha01.localdomain:
        + ha02.localdomain-eth0             : up        
        + master-drbd_mysql:1               : 5         
    
    # MySQLグループをha01に変える。
    # move と unmove はセット
    crm resource move mysql ha01.localdomain force
    
    # ha01:"inf", ha02:"-inf" オプションが付いた
    crm configure show | grep -i inf:
            rule $id="cli-prefer-rule-mysql" inf: #uname eq ha01.localdomain
            rule $id="cli-standby-rule-mysql" -inf: #uname eq ha02.localdomain
    
    # リソース移動制約の解除。この状態でha01が故障すると、"-inf"が付いたha02へリソースの移動ができないため "-inf"を削除する
    crm resource unmove mysql
  • リソース設定の初期化
    # すべてのサーバをスタンバイに
    crm node standby ha01
    crm node standby ha02
    
    # リソース設定を削除、リソースをオンライン状態へ戻す
    crm configure erase
    crm node online ha01
    crm node online ha02
  • リソース設定をすべて削除する場合。全サーバのheartbeatを停止、全サーバの/var/lib/heartbeat/crm/以下のファイルを削除
    service heartbeat stop
    
    rm -f /var/lib/heartbeat/crm/*
  • crm_monを1回実行してすぐ終了させたい場合 "-1"オプション
    crm_mon -fA -1
  • failcountの表示と削除
    故障履歴の表示
    crm resource failcount mysql show ha01.localdomain
    
    # 故障履歴のクリア
    crm resource cleanup mysql
  • RAの開始と停止。指定リソースより上位リソースも停止するので注意
    crm resource stop [リソース名/グループ名]
    
    crm resource start [リソース名/グループ名]
  • ha.cfの編集のため、Pacemakerだけ止めたい。メンテナンスモードにしたい。リソース異常検知も停止する。crm_monが"unmanaged"になる
    crm configure property maintenance-mode=true
    
    crm configure property maintenance-mode=false

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-15 (土) 07:31:38 (9d)