Memo/Linux/Pacemaker

http://dexlab.net/pukiwiki/index.php?Memo%2FLinux%2FPacemaker
 

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)
    1. cat /etc/sysconfig/network
    2.  
    3. NETWORKING=yes
    4. HOSTNAME=ha01.localdomain
  • hostname(ha02)
    1. cat /etc/sysconfig/network
    2.  
    3. NETWORKING=yes
    4. HOSTNAME=ha02.localdomain
  • hosts(ha01, ha02)
    1. cat /etc/hosts
    2.  
    3. 127.0.0.1   localhost server.localdomain
    4. 10.0.1.101   ha01.localdomain                                                                                                      
    5. 10.0.1.102   ha02.localdomain                                                                                                      
  • DRDBインストール(ha01, ha02)
    1. rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm
    2.  
    3. yum search drbd --enablerepo=elrepo
    4. drbd83-utils.x86_64 : Management utilities for DRBD
    5. drbd84-utils.x86_64 : Management utilities for DRBD
    6. kmod-drbd83.x86_64 : drbd83 kernel module(s)
    7. kmod-drbd84.x86_64 : drbd84 kernel module(s)
    8.  
    9. yum install drbd84-utils kmod-drbd84 --enablerepo=elrepo -y
  • DRDB 設定(ha01, ha02)
    1. cat > /etc/drbd.d/mysql.res << 'EOS'
    2. resource mysql {
    3.     protocol C;
    4.     device /dev/drbd0;
    5.     meta-disk internal;
    6.  
    7.     on ha01.localdomain {
    8.         address 10.0.1.101:7789;
    9.         disk /dev/sdb;
    10.     }
    11.     on ha02.localdomain {
    12.         address 10.0.1.102:7789;
    13.         disk /dev/sdb;
    14.     }
    15. }
    16. EOS
  • DRDB 構築(ha01, ha02)
    1. # ファイルシステムを初期化してから実行しないとエラーになる
    2. dd if=/dev/zero bs=1M count=1 of=/dev/sdb; sync
    3.  
    4. drbdadm create-md mysql
    5.  
    6. mkdir -p /mnt/drbd/mysql
    7.  
    8. cat >> /etc/fstab << 'EOS'
    9. /dev/drbd0              /mnt/drbd/mysql         ext4    defaults        0 0
    10. EOS
  • DRDB起動(ha01, ha02) 両方ほぼ同時に起動させる必要がある
    1. service drbd start
    2.  
    3. # PacemakerのDRBD OCF RA(リソースエージェント)を利用する場合はRAに任せるためOFFにしておく
    4. chkconfig drbd off
  • ファイルシステムの作成(ha01)
    1. drbdsetup /dev/drbd0 primary --o
    2. mkfs.ext4 /dev/drbd0
  • ファイルシステムのマウント(ha01)
    1. mount /mnt/drbd/mysql
  • DRDBテスト
    1. # ha01上で適当なファイルを作り、アンマウント、セカンダリに切り替え
    2. touch /mnt/drbd/mysql/test1.txt
    3. umount /mnt/drbd/mysql
    4. drbdsetup /dev/drbd0 secondary
    5.  
    6. # ha02上でプライマリに切り替え、マウント、確認
    7. drbdsetup /dev/drbd0 primary
    8. mkdir -p /mnt/drbd/mysql
    9. cat >> /etc/fstab << 'EOS'
    10. /dev/drbd0              /mnt/drbd/mysql         ext4    defaults        0 0
    11. EOS
    12. mount /mnt/drbd/mysql
    13.  
    14. ls -la /mnt/drbd/mysql/
    15. 合計 24
    16. drwxr-xr-x 3 root root  4096  913 18:45 2012 .
    17. drwxr-xr-x 3 root root  4096  913 18:47 2012 ..
    18. drwx------ 2 root root 16384  913 18:39 2012 lost+found
    19. -rw-r--r-- 1 root root     0  913 18:45 2012 test1.txt
    20.  
    21. # ha01上でプライマリに戻す
    22. drbdsetup /dev/drbd0 primary
  • DRDB確認
    1. cat /proc/drbd
    2. # または
    3. service drbd status
  • mysqlサーバのインストール(ha01, ha02)
    1. yum -y install mysql-server --enablerepo=remi
    2.  
    3. mkdir -p /mnt/drbd/mysql/mysql
    4. chown mysql:mysql /mnt/drbd/mysql/mysql
    5. rm -rf /var/lib/mysql
    6. ln -s /mnt/drbd/mysql/mysql /var/lib/mysql
  • DB作成(ha01) ha01がDRBDプライマリとした場合
    1. service mysqld restart
    2.  
    3. # Pacemakerのmysqld OCF RA(リソースエージェント)を利用する場合はRAに任せるためOFFにしておく
    4. chkconfig mysqld off
  • Heartbeatのインストール。yumリポジトリがtar.gzであるので入れる(ha01, ha02) バージョンを指定必須
    1. cd /tmp
    2. 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"
    3. tar xvfz pacemaker-1.0.12-1.1.el6.x86_64.repo.tar.gz
    4. cd pacemaker-1.0.12-1.1.el6.x86_64.repo
    5. 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)
    1. vi /etc/yum.repos.d/CentOS-Base.repo
    2. ----
    3. [base]
    4. ...
    5. exclude=pacemaker pacemaker-libs corosync cluster-glue heartbeat resource-agents
    6. ----
  • 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」でインターコネクト通信が正常か確認できるようになる
      1. cat >> /etc/ha.d/ha.cf << 'EOS'
      2. pacemaker   on
      3. #crm         on
      4. debug       0
      5. debugfile   /var/log/ha-debug
      6. logfile     /var/log/ha-log
      7. logfacility local0
      8. keepalive   2
      9. deadtime    30
      10. initdead    120
      11. udpport     694
      12.  
      13. ucast       eth1 10.0.1.101
      14. ucast       eth1 10.0.1.102
      15.  
      16. node        ha01.localdomain
      17. node        ha02.localdomain
      18.  
      19. uuidfrom    nodename
      20. respawn root /usr/lib64/heartbeat/ifcheckd
      21. EOS
  • authkeysの設定(ha01, ha02)
    1. cat >> /etc/ha.d/authkeys << 'EOS'
    2. auth 1
    3. 1 crc
    4. #2 sha1 HI!
    5. #3 md5 Hello!
    6. EOS
    7.  
    8. chmod 600 /etc/ha.d/authkeys
  • /var/log/messages に多量のログが出るため、ログ分離。local0〜local7までのうち使用していないものをha.cfと合わせて指定
    1. vi /etc/rsyslog.conf
    2. ----
    3. *.info;mail.none;authpriv.none;cron.none;local0.none                /var/log/messages
    4. local0.info                                             /var/log/ha-log
    5. ----
    6. service rsyslog restart
  • heartbeatの起動(ha01, ha02)
    1. service heartbeat restart
    2. chkconfig heartbeat on
  • pacemakerを使う場合。/etc/ha.d/haresources は使わない。
    1. # 別コンソールで crm_mon -i1 -f -A でモニタリングしながら実行してみると良い
    2.  
    3. # ステップbyステップモードで入力
    4. crm configure
    5. crm(live)configure#
    6.  
    7. # 全体オプションの設定
    8. # no-quorum-policy: 2台構成の場合ignore。Heartbeatの場合は問題がありignoreのみ動作する。3台以上でCorosyncを使っている場合はfreeze + STONITHが推奨
    9. # stonith-enabled: 監視対象ノードの異常を検出したときに、強制的にそのノードをダウンさせる
    10. # startup-fencing: Pacemaker起動時に相手のサーバの状態が把握できない場合に念のために相手をフェンシング(Pacemakerからサーバを強制停止)する
    11. crm(live)configure# property no-quorum-policy="ignore" stonith-enabled="false" startup-fencing="false"
    12.  
    13. # リソース動作のデフォルト値を設定
    14. # resource-stickiness: リソース移動を固定する優先度。INFINITYは不具合がなければリソース移動はしない。
    15. # migration-threshold: 故障を検知した場合に同一サーバでリソースの再起動を試みる回数
    16. crm(live)configure# rsc_defaults resource-stickiness="INFINITY" migration-threshold="1"
    17.  
    18. # 仮想IPの設定 10.0.0.100 を割り当て。このIPにアプリがアクセスする。仮想IPを割り当てられないAmazon VPC等ではEIP等を用いる
    19. crm(live)configure# primitive ip_mysql ocf:heartbeat:IPaddr2 params ip="10.0.0.100" nic="eth0"
    20.  
    21. # DRBDリソースの追加
    22. crm(live)configure# primitive drbd_mysql ocf:linbit:drbd params drbd_resource="mysql"
    23. # MySQLマスタースレーブ構成リソースの追加
    24. 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"
    25.  
    26. # ファイルシステムリソースの追加(マウント定義)
    27. crm(live)configure# primitive fs_mysql ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/drbd/mysql" fstype="ext4"
    28.  
    29. # MySQLリソースの追加
    30. crm(live)configure# primitive mysqld lsb:mysqld
    31.  
    32. # リソースグループ: mysql グループにfs_mysql ip_mysql mysqld を追加
    33. crm(live)configure# group     mysql fs_mysql ip_mysql mysqld
    34.  
    35. # リソース間の制約:mysqlグループとDRBDマスターは同時に存在
    36. crm(live)configure# colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
    37.  
    38. # リソース順序の設定:DRBDマスター起動後に、mysqlグループが起動
    39. crm(live)configure# order      mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start
    40.  
    41. # 設定変更後 commit が必要
    42. crm(live)configure# commit
    43.  
    44. # 終了
    45. crm(live)configure# exit
    46. bye
  • エディタで設定の編集モード
    1. crm configure edit
  • バッチモードで現在の設定を確認する場合
    1. crm configure show
  • 別ファイルからロードする場合
    1. cat >> mysql.crm << 'EOS'
    2. # Cluster Option
    3. property \
    4.   no-quorum-policy="ignore" \
    5.   stonith-enabled="false" \
    6.   startup-fencing="false"
    7.  
    8. # Resource Defaults
    9. rsc_defaults \
    10.   resource-stickiness="INFINITY" \
    11.   migration-threshold="1"
    12.  
    13. # MySQL
    14. primitive ip_mysql \
    15.   ocf:heartbeat:IPaddr2 params ip="10.0.0.100" nic="eth0"
    16. primitive drbd_mysql \
    17.   ocf:linbit:drbd params drbd_resource="mysql"
    18. ms ms_drbd_mysql \
    19.   drbd_mysql meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
    20. primitive fs_mysql \
    21.   ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mnt/drbd/mysql" fstype="ext4"
    22. primitive mysqld lsb:mysqld
    23.  
    24. # Group
    25. group     mysql fs_mysql ip_mysql mysqld
    26. colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
    27. order      mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start
    28. EOS
    29.  
    30. crm configure load update mysql.crm
  • 現在の設定を保存する場合
    1. crm configure save mysql-`date +%Y%m%d`.crm
  • ip_mysql を削除する場合
    1. crm configure delete ip_mysql
  • heartbeatのテスト
    1. crm_mon -i1 -f -A
    2.  
    3. Online: [ ha02.localdomain ha01.localdomain ]
    4.  
    5.  Master/Slave Set: ms_drbd_mysql
    6.      Masters: [ ha01.localdomain ]
    7.      Slaves: [ ha02.localdomain ] 
    8.  Resource Group: mysql
    9.      fs_mysql   (ocf::heartbeat:Filesystem):    Started ha01.localdomain
    10.      mysqld     (lsb:mysqld):   Started ha01.localdomain                
    11.  
    12. Node Attributes:
    13. * Node ha02.localdomain:
    14.     + ha01.localdomain-eth0             : up        
    15.     + master-drbd_mysql:0               : 5         
    16. * Node ha01.localdomain:
    17.     + ha02.localdomain-eth0             : up        
    18.     + master-drbd_mysql:1               : 5       
    19.  
    20. # Ctrl-Cで中断
    21.  
    22. # ha01に /mnt/drbd/mysql がマウントされている
    23. [root@ha01 ~]#
    24. [root@ha01 ~]# df -h
    25. Filesystem            Size  Used Avail Use% マウント位置
    26. /dev/mapper/vg_centos6-lv_root
    27.                        28G  2.7G   24G  11% /
    28. tmpfs                 497M     0  497M   0% /dev/shm
    29. /dev/sda1             485M   52M  408M  12% /boot
    30. /dev/drbd0           1008M   18M  940M   2% /mnt/drbd/mysql
    31.  
    32. # ha01のheartbeatを止めて、故障状態にしてみる
    33. service heartbeat stop
    34.  
    35. # ha02での表示(ha01がOFFLINEになっている)
    36. crm_mon -i1 -f -A
    37.  
    38. Online: [ ha02.localdomain ]
    39. OFFLINE: [ ha01.localdomain ]
    40.  
    41.  Master/Slave Set: ms_drbd_mysql
    42.      Masters: [ ha02.localdomain ]
    43.      Stopped: [ drbd_mysql:1 ]   
    44.  Resource Group: mysql
    45.      fs_mysql   (ocf::heartbeat:Filesystem):    Started ha02.localdomain
    46.      mysqld     (lsb:mysqld):   Started ha02.localdomain                
    47.  
    48. Node Attributes:
    49. * Node ha02.localdomain:
    50.     + ha01.localdomain-eth0             : up        
    51.     + master-drbd_mysql:0               : 5         
    52.  
    53. # ha02に /mnt/drbd/mysql がマウントされている
    54. df -h
    55. Filesystem            Size  Used Avail Use% マウント位置
    56. /dev/mapper/vg_centos6-lv_root
    57.                        28G  2.7G   24G  11% /
    58. tmpfs                 497M     0  497M   0% /dev/shm
    59. /dev/sda1             485M   52M  408M  12% /boot
    60. /dev/drbd0           1008M   47M  911M   5% /mnt/drbd/mysql
    61.  
    62. # ha02でmysqlも稼働している
    63. mysql -e "show databases;"                                                                                         
    64. +--------------------+
    65. | Database           |
    66. +--------------------+
    67. | information_schema |
    68. | mysql              |
    69. | performance_schema |
    70. | test               |
    71. +--------------------+
    72.  
    73. # failcountの表示。
    74.  
    75.  
    76. # ha01のheartbeat再開させてみる
    77. service heartbeat start
    78.  
    79. # ha01がオンラインにはなったが、ha02がマスターのまま
    80. crm_mon -i1 -f -A
    81.  
    82. Online: [ ha02.localdomain ha01.localdomain ]
    83.  
    84.  Master/Slave Set: ms_drbd_mysql
    85.      Masters: [ ha02.localdomain ]
    86.      Slaves: [ ha01.localdomain ] 
    87.  Resource Group: mysql
    88.      fs_mysql   (ocf::heartbeat:Filesystem):    Started ha02.localdomain
    89.      mysqld     (lsb:mysqld):   Started ha02.localdomain                
    90.  
    91. Node Attributes:
    92. * Node ha02.localdomain:
    93.     + ha01.localdomain-eth0             : up        
    94.     + master-drbd_mysql:0               : 5         
    95. * Node ha01.localdomain:
    96.     + ha02.localdomain-eth0             : up        
    97.     + master-drbd_mysql:1               : 5         
    98.  
    99. # MySQLグループをha01に変える。
    100. # move と unmove はセット
    101. crm resource move mysql ha01.localdomain force
    102.  
    103. # ha01:"inf", ha02:"-inf" オプションが付いた
    104. crm configure show | grep -i inf:
    105.         rule $id="cli-prefer-rule-mysql" inf: #uname eq ha01.localdomain
    106.         rule $id="cli-standby-rule-mysql" -inf: #uname eq ha02.localdomain
    107.  
    108. # リソース移動制約の解除。この状態でha01が故障すると、"-inf"が付いたha02へリソースの移動ができないため "-inf"を削除する
    109. crm resource unmove mysql
  • リソース設定の初期化
    1. # すべてのサーバをスタンバイに
    2. crm node standby ha01
    3. crm node standby ha02
    4.  
    5. # リソース設定を削除、リソースをオンライン状態へ戻す
    6. crm configure erase
    7. crm node online ha01
    8. crm node online ha02
  • リソース設定をすべて削除する場合。全サーバのheartbeatを停止、全サーバの/var/lib/heartbeat/crm/以下のファイルを削除
    1. service heartbeat stop
    2.  
    3. rm -f /var/lib/heartbeat/crm/*
  • crm_monを1回実行してすぐ終了させたい場合 "-1"オプション
    1. crm_mon -fA -1
  • failcountの表示と削除
    1. 故障履歴の表示
    2. crm resource failcount mysql show ha01.localdomain
    3.  
    4. # 故障履歴のクリア
    5. crm resource cleanup mysql
  • RAの開始と停止。指定リソースより上位リソースも停止するので注意
    1. crm resource stop [リソース名/グループ名]
    2.  
    3. crm resource start [リソース名/グループ名]
  • ha.cfの編集のため、Pacemakerだけ止めたい。メンテナンスモードにしたい。リソース異常検知も停止する。crm_monが"unmanaged"になる
    1. crm configure property maintenance-mode=true
    2.  
    3. crm configure property maintenance-mode=false

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-22 (月) 17:42:20 (1737d)