前回の続き
構成
こんな感じ
keepalivedの設定
マスター1のkeepalivedの設定
/etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { enable_script_security } vrrp_script mysqlchk { script "/etc/keepalived/mysqlchk.sh" interval 2 weight 2 fall 2 rise 2 } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress { 192.168.20.11 #VIP } unicast_src_ip 192.168.1.1 unicast_peer { 192.168.1.2 } track_script { mysqlchk } notify_master /etc/keepalived/master.sh notify_backup /etc/keepalived/backup.sh notify_stop /etc/keepalived/backup.sh notify_fault /etc/keepalived/backup.sh }
マスター2のkeepalivedの設定
/etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { enable_script_security } vrrp_script mysqlchk { script "/etc/keepalived/mysqlchk.sh" interval 2 weight 2 fall 2 rise 2 } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 100 advert_int 1 virtual_ipaddress { 192.168.20.11 #VIP } unicast_src_ip 192.168.1.2 unicast_peer { 192.168.1.1 } track_script { mysqlchk } notify_master /etc/keepalived/master.sh notify_backup /etc/keepalived/backup.sh notify_stop /etc/keepalived/backup.sh notify_fault /etc/keepalived/backup.sh }
設定ファイルの細かい仕様はこのへんがわかりやすい
CentOS 7 と keepalived でクラスタ環境を構築する
スクリプト
mysqlチェックスクリプト
/etc/keepalived/mysqlchk.sh
#!/bin/bash TIMEOUT=60 SOCK=/var/lib/mysql/mysql.sock sudo mysql -S $SOCK --connect-timeout=$TIMEOUT -e "show variables like 'server_id';"
master変更時のスクリプト
/etc/keepalived/master.sh
#!/bin/bash SOCK=/var/lib/mysql/mysql.sock while true ; do sudo mysql -S $SOCK -e "show slave status\G;"|egrep "Seconds_Behind_Master: 0|Seconds_Behind_Master: NULL" if [ "$?" = "0" ] ; then break else echo Waiting until sql thread finish. fi sleep 1 done sudo mysql -S $SOCK -e "set @@global.read_only=0;"
backup変更時のスクリプト
/etc/keepalived/backup.sh
#!/bin/bash TIMEOUT=2 SOCK=/var/lib/mysql/mysql.sock sudo mysql -S $SOCK --connect-timeout=$TIMEOUT -e "set @@global.read_only=1;"
backup時には「global.read_only=1」を設定してreadonlyとしています。
master時には「global.read_only=0」を設定してます。
こうすることで間違ってもbackup設定側に書き込まれないようにします。
各スクリプトに対して実行権限を付けてください
chmod +x /etc/keepalived/*.sh
keepalivedのユーザ作成
上で作ったスクリプトをkeepalivedが実行するにはkeepalivedのユーザを作れって怒られます。
useradd keepalived_script
さらにこのユーザーがsudo実行できないと上で作ったスクリプトで結果がとれません
visudoでいかを追記
keepalived_script ALL=(ALL) NOPASSWD:ALL
確認
マスター側keepalivedにVIPがついてること
マスター側keepalivedをstopしたときにbackup側keepalivedが昇格してVIPがつくこと
マスター側のmysqlを止めてkeepalivedがbackup側に切り替わること
マスター変更時、バックアップ変更時にスクリプトがうごくこと