2&>1

AWSとかGCPとかGolangとかとか

keepalivedとmysqlで冗長構成組んだ2

前回の続き

dev-error.hatenablog.com

構成

こんな感じ

f:id:piyojir0:20200519201533j:plain

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

確認

  1. マスター側keepalivedにVIPがついてること

  2. マスター側keepalivedをstopしたときにbackup側keepalivedが昇格してVIPがつくこと

  3. マスター側のmysqlを止めてkeepalivedがbackup側に切り替わること

  4. マスター変更時、バックアップ変更時にスクリプトがうごくこと