社内サーバーの状況は、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の便利な使い方を考えて、実践してみたいと思います。