ゾンビDBの作り方 at AWS
概要
開発メンバーからの要望で毎日、本番DBから取ったバックアップを元にデータをリフレッシュするDBを作りました。 何度データを壊しても次の朝には復活してるので社内ではコレをゾンビDBと呼んでいます。
やってることは、
1.定期的に取ってるsnapshotからvolumeを作成 2.mysql止める 3.古いvolumeをアンマウント 4.古いvolumeをdetach 5.新しいvolumeをattach 6.新しいvolumeをマウント 7.mysql起動
やりたいことはシンプルですが、awsから必要な情報を取ってくるのが少々面倒です。
前提条件
シェルスクリプト
#!/bin/bash date=`date +%Y%m%d%H` DESCRIPTION="DB_backup_$date" instance=`curl http://169.254.169.254/latest/meta-data/instance-id` # Create new DB volume snap=`/usr/local/bin/aws ec2 describe-snapshots --filters Name=description,Values=$DESCRIPTION"*" --query Snapshots[*].SnapshotId --output text` VAR="$snap" ary=($VAR) attach_volume=`/usr/local/bin/aws ec2 create-volume --availability-zone us-east-1d --volume-type gp2 --snapshot-id ${ary[0]} --query VolumeId --output text` # Stop mysql sleep 10 sudo /usr/sbin/service mysql stop #/sbin/swapoff /var/lib/mysql/swap # Unmount sleep 10 sudo /bin/umount -f /var/lib/mysql # Detach old volume sleep 10 detach_volume=`/usr/local/bin/aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$instance Name=attachment.device,Values=/dev/sdf --query Volumes[].Attachments[].[VolumeId] --output text` /usr/local/bin/aws ec2 detach-volume --volume-id $detach_volume --instance-id $instance # Attach new volume sleep 60 /usr/local/bin/aws ec2 attach-volume --volume-id $attach_volume --instance-id $instance --device /dev/sdf # Remount volume sleep 60 sudo /bin/mount -a # Start mysql sleep 10 sudo /usr/sbin/service mysql start # Delete old volume /usr/local/bin/aws ec2 delete-volume --volume-id $detach_volume
その他
前の処理が完全に終わってなかったりするので適当にsleepを入れてます。