とある要件で、サイトのミラーリングが必要になり、工数少な目でさっとやる形で実装したのでスクリプトをご紹介。
前提:
・メインと、セカンダリサーバの2台構成
・メインは、AP/DB/WEBの機能
・セカンダリサーバも同様にAP/DB/WEBの機能
・今回の同期範囲はユーザデータベースの内容のみ
・サーバ間はSSHでの通信のみ可であり、FTPは使用しない
・アラートはslack
大まかな流れ:
1. cronでメインでDBバックアップ
2. バックアップファイルをSCPでセカンダリサーバへ転送
3. セカンダリサーバでDB Drop / Create DB / ダンプインポート
■スクリプト1(on コピー元サーバ)
cronがこいつをキックする
#!/bin/sh SLAVE_HOST="セカンダリダリサーバIP" SLAVE_SSH_PORT="セカンダリサーバのSSHポート" BASE_PATH="セカンダリサーバ側のスクリプトのパス" DUMP="メインサーバ側から吐き出すダンプファイル名フルパス" LOGFILE="ログファイルフルパス" script_path="メインサーバ側のスクリプトパス" echo "#####################################################" > $LOGFILE echo " なんかメッセージ " >> $LOGFILE echo "#####################################################" >> $LOGFILE # db backup echo `date +%Y%m%d_%H-%M-%S`" : [INF] DB backup start ..." >> $LOGFILE /bin/mysqldump --opt -c --host=localhost -u<DBユーザ名> -p<DBパスワード> <DB名> | gzip > $DUMP if [ $? = 0 ]; then echo `date +%Y%m%d_%H-%M-%S`" : [OK ] DB backup end ..." >> $LOGFILE else echo '[ERR] return code ' $? $script_path/slack.sh $LOGFILE >> $LOGFILE exit 1 fi # file copy to remote server echo `date +%Y%m%d_%H-%M-%S`" : [INF] file copy start ..." >> $LOGFILE scp -P $SLAVE_SSH_PORT -C $DUMP <セカンダリサーバOSユーザ名>@<セカンダリサーバIP>:<コピー先ファイル名フルパス> if [ $? = 0 ]; then echo `date +%Y%m%d_%H-%M-%S`" : [OK ] file copy end ..." >> $LOGFILE else echo '[ERR] return code ' $? $script_path/slack.sh $LOGFILE >> $LOGFILE exit 1 fi # dump import(dropdb/createdb/d:s:u/import) echo `date +%Y%m%d_%H-%M-%S`" : [INF] Refresh Process in remote server start ..." >> $LOGFILE ssh -p $SLAVE_SSH_PORT $SLAVE_HOST "cd $BASE_PATH; ./refresh_db.sh" if [ $? = 0 ]; then echo `date +%Y%m%d_%H-%M-%S`" : [OK ] All Steps end ..." >> $LOGFILE else echo '[ERR] return code ' $? >> $LOGFILE $script_path/slack.sh $LOGFILE exit 1 fi $script_path/slack.sh $LOGFILE >> $LOGFILE
■スクリプト2、4(on コピー元サーバとセカンダリの両方)
slack.shのファイルの中身。引数にログファイル名を渡すとログファイルの中身をslackで教えてくれる。
#!/bin/sh WEBHOOKURL="WEBHOOKのURL" msg=`cat $1` DATA_PAYLOAD=`cat <<_EOT_ payload={ \ "channel": "チャンネル名", \ "username": "ユーザ名", \ "text": "${msg}" \ } _EOT_` curl -s -S -X POST --data-urlencode "${DATA_PAYLOAD}" "${WEBHOOKURL}"
■スクリプト3(on セカンダリサーバ)
#!/bin/sh LOGFILE="ログファイル名フルパス" script_path="スクリプトのパス" # このスクリプトのディレクトリの絶対パスを取得 DUMP="とんでくるダンプのフルパス" DUMP_SQL="解凍したファイルのフルパス" echo "#####################################################" > $LOGFILE echo " なんか書く " >> $LOGFILE echo "#####################################################" >> $LOGFILE # 移動 cd ダンプのディレクトリ移動 # ファイル存在チェック if [ ! -e $DUMP ]; then echo '[ERR] no dump file found ' >> $LOGFILE $script_path/slack.sh $LOGFILE >> $LOGFILE exit 1 fi # ファイル存在チェック if [ -e $DUMP_SQL ]; then rm $DUMP_SQL fi # 解凍 gzip -d $DUMP # MySQLをバッチモードで実行するコマンド CMD_MYSQL="mysql -u <ユーザ> -p<パスワード>" # Drop database echo `date +%Y%m%d_%H-%M-%S`" : [INF] Drop Database start ..." > $LOGFILE $CMD_MYSQL -e "drop database <DB名>" if [ $? = 0 ]; then echo `date +%Y%m%d_%H-%M-%S`" : [OK ] Drop dabase end ..." >> $LOGFILE else echo '[ERR] return code ' $? $script_path/slack.sh $LOGFILE >> $LOGFILE exit 1 fi # Create Database; echo `date +%Y%m%d_%H-%M-%S`" : [INF] Create Database start ..." > $LOGFILE $CMD_MYSQL -e "create database <DB名> default character set utf8;" # Grant rights echo `date +%Y%m%d_%H-%M-%S`" : [INF] Grant Database start ..." > $LOGFILE $CMD_MYSQL -e "grant all privileges on <DB名>.* to <DBユーザ名>@localhost identified by '<DBユーザパスワード>';"