メニュー

Jenkinsでmysqldumpをスケジューリングしてみる

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

この記事をシェアする

  • twitter
  • facebook
  • Google+
  • B!はてブ
  • pocket
トップへ戻る

CONTACT

ゲーム開発、Webサイト制作に関するご相談等ございましたら、お気軽にお問い合わせください。

ゲーム開発に関する
お問い合わせはこちら

Webサイト制作に関する
お問い合わせはこちら