社内サーバーの状況は、zabbixである程度管理出来るようになったんですが、ちょっと不安になってきたのがバックアップです。
開発用サーバーも含めてmysqlが色々なところで立ち上がっているのですが、このバックアップを楽に出来ないものか、と。
要件的には、
- mysqldumpを各サーバーで行う
- リモートでmysqldumpを行うのではなく、各サーバーでdumpし、出力ファイルを回収する形で。リモート接続を許可していないmysqlもあるので。
- 各サーバーでdumpしたsqlファイルをまとめて、圧縮して固めておく
- 圧縮したバックアップは数日間、履歴管理出来るようにする(10日間ぐらい)
- 対象となるサーバーのリストは簡単に更新出来るようにする
各サーバーにログインする必要がありそうなので、fabricの出番です。
問題は履歴管理。
logrotate等色々とやり方があると思うのですが、練習がてらjenkinsの成果物保存を利用してみました。
pythonスクリプトを作成する
作成したスクリプトは↓
mysqldumper.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from fabric.api import env, sudo, cd , hosts, get, local
from fabric.contrib.files import exists
from db_server_config import db_server_config
############
_dir = "%s/" % os.path.dirname(os.path.abspath(__file__))
RESULT_TAR = 'dumpsql.tar.gz'
MYSQLDUMP_OPT="--single-transaction --default-character-set=binary"
MYSQLDUMP="/usr/bin/mysqldump %s -u %s -h %s -p%s %s > %s "
DUMP_SQL = '/tmp/mysql_backup.sql'
def mysqldumper(server_config):
env.host_string = server_config['host']
env.user = server_config['user']
env.password = server_config['password']
env.port = server_config['port']
mysql_cmd = MYSQLDUMP % (MYSQLDUMP_OPT, server_config['db_user'], '127.0.0.1', server_config['db_password'], server_config['db_name'] , DUMP_SQL)
sudo( mysql_cmd )
if exists( DUMP_SQL ):
get( DUMP_SQL, '%ssql/%s.sql' % (_dir, server_config['host']))
if __name__ == "__main__":
for key, each_config in db_server_config.items():
mysqldumper(each_config)
local('tar zcf %s%s %ssql' % (_dir, RESULT_TAR, _dir ))
設定は↓のような感じ
db_server_config.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
db_server_config = {
'hoge' : {
'host':'172.16.0.100',
'user':'root',
'password':'vagrant',
'port':22,
'db_user':'dbmanager',
'db_password':'hugahuga',
'db_name':'hogedb',
},
'redmine' : {
'host':'172.16.0.111',
'user':'root',
'password':'rootpass',
'port':22,
'db_user':'user_redmine',
'db_password':'user_redminepass',
'db_name':'db_redmine',
},
}
勢いだけで書いたかなり適当なスクリプトですが、こいつを社内Gitレポジトリに放り込んでおきます。
ディレクトリ構造は↓な感じです。
mysqldumper ┣mysqldumper.py ┣db_server_config.py ┣.gitkeep ┣.gitignore ┗sql(ディレクトリ)
jenkinsの設定
そしてJenkinsの設定
- 古いビルドを破棄
- ビルドの保存日数: 10
- ビルドの保存最大数: 10
- ソースコード管理 : Git
- Repositories: http://社内gitlab/tomita/mysqldumper.git
- ビルド・トリガ: 定期的に実行
- スケジュール: H 9 * * *(毎日9時ぐらいに実行)
- ビルド: シェルスクリプトの実行
- シェルスクリプト
python ./mysqldumper.py
- シェルスクリプト
- ビルド後の処理: 成果物を保存
- 保存するファイル: dumpsql.tar.gz
動かしてみる
jenkins-slave側にmysqlとfabricをインストールし、jenkinsのジョブ管理画面から試しに実行してみます。
あとは、ビルド(?)に成功すれば、成果物としてdumpsql.tar.gzをダウンロード出来るはず。です。
まとめ
サーバーエンジニアは普段あまり使わないjenkinsを利用してみました。
mysqldumpの履歴をブラウザから確認出来るのは良いですね!
ただ、馬鹿でかいデータベースをdumpしてしまうとjenkinsサーバーのディスクを消費してしまうので注意です。
また何かjenkinsの便利な使い方を考えて、実践してみたいと思います。























ピックアップ
