rsyncでバックアップ

昔業務系システムを自分で管理していた時代はtarをcronで定期実行していましたが、コンテンツ系システムだとファイル数が非常に多く、差分バックアップを使わないとディスクスペースや処理時間がかかってしまうのでrsyncを使ってローカルに差分バックアップをとるようにしてみました。
本当はディスクシステムを使ったスナップショットやらちゃんとした市販ソフトの適応を検討するべきなのでしょうが小規模ならばこれでもよいかなと。

とりあえず動いているみたいなので置いておきます。OSはcentos5.5です。
rsyncエラー時の処理はテストしてみていません。

サンプルコード

#!/bin/bash 
# 
# rsyncを使った差分バックアップ 
#  $BACKUPDIR配下にbackup0〜backup$BACKUPGENのフォルダ名でバックアップ 
#  backup0が最新バックアップで実行する毎にbackupフォルダをずらす   
#  backup日時はフォルダの日時で判別可能なので特に取らない 
#  rsyncの差分はbackup1とバックアップ対象を比較 
#  backup0が存在していない場合はフルバックアップ 
# 

#--- 設定 --- 
#バックアップ履歴数 
BACKUPGEN=4 
#バックアップ対象 
BACKUPFROMDIR="/var/www/moodle01" 
#バックアップ先フォルダ 
BACKUPDIR="/backup" 

#前準備 
echo "`date` backup start" 

CNT=$BACKUPGEN 
while [ $CNT -ge 0 ] 
do 
     if [ $CNT -eq $BACKUPGEN ] 
     then 
          # 最後の1つを削除 
          if [ -d $BACKUPDIR/backup$CNT ]; then 
               echo "rm -fr $BACKUPDIR/backup$CNT" 
               rm -fr $BACKUPDIR/backup$CNT 
          fi 
     else 
          MVCNT=`expr $CNT + 1` 

          #バックアップディレクトリをずらす 
          if [ -d $BACKUPDIR/backup$CNT ] 
          then 
               echo "mv $BACKUPDIR/backup$CNT $BACKUPDIR/backup$MVCNT" 
               mv $BACKUPDIR/backup$CNT $BACKUPDIR/backup$MVCNT 
          fi 
     fi 
     CNT=`expr $CNT - 1` 
done 
#rsync準備 
RSYNCCMD="rsync -av --delete" 

if [ -d $BACKUPDIR/backup1 ]; then 
     #backup1との差分をbackup0にバックアップ 
     echo "$RSYNCCMD --link-dest=../backup1 $BACKUPFROMDIR $BACKUPDIR/backup0" 
     $RSYNCCMD --link-dest=../backup1 $BACKUPFROMDIR $BACKUPDIR/backup0 
else 
     #初回のフルバックアップ 
     echo "$RSYNCCMD $BACKUPFROMDIR $BACKUPDIR/backup0" 
     $RSYNCCMD $BACKUPFROMDIR $BACKUPDIR/backup0 
fi 
code=$? 
if [ $code -ne 0 ]; then 
        mail -s "BACKUP NG CODE IS $code" root 
     exit 1 
fi 
echo "`date` backup end" 

exit 0 

余談

あと久々にsh弄るとけっこう忘れていてショックが大きかった・・・。久々に下記の本を引っ張り出して書いていました。
もともとWebアプリよりはクラサバ系のアプリをUNIXで組んでいたので、linuxを初めて使ったとき、各種資源がどう扱われるのか知りたくてこの本を買いましたが、今でも十分通用する良書かと思います。
Webだけやるならここまでのことを知らなくともどうにでもなりますが、このあたりをちゃんと知っているエンジニアはトラブルシューティング能力が段違いですね。こういった要素がちゃんと評価される世の中になってほしいです。

Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて

Linuxプログラミング―例題で学ぶUNIXプログラミング環境のすべて

CentOS5.5にpostgresql8.4構築

moodleとかmaharaを使うのにどうもmySQLよりpostgreSQLの方が推奨されているようなので、CentOS5.5+Apache+PostgreSQL8.4+PHPのLAPP環境を作ってみました。
postgreSQLについてはRedhat7.3のころはかなり使っていたのですが大分変わっているようで以外と苦戦したのでメモを残しておきます。
方針はコンパイルせずにyumで出来るだけ済ませるようにしています。

インストールするpostgreSQL

公式だとpostgreSQLのバージョンが8.1系となっています。Windowsだとバイナリのリリースがすでに終わっているなど今から利用するには若干古いしその後のvacumの改良などを考えると新しいものが入れたいと思い、新しいバージョンを入れました。
yumでインストールするにはpostgresが置いてあるリポジトリを追加する必要があります。
http://yum.pgsqlrpms.org/reporpms/repoview/letter_p.group.html
こちらから該当のディストリビューションとpostgresのバージョンに対応したrpmをダウンロードしてインストールします。
yumコマンドでこちらを利用するように /etc/yum.repos.d/CentOS-Base.repo を編集して[base],[upfates]にexcludeにpostgresを
追加します。
参照:@IT:特定のファイルをyumのアップデート対象から外すには

[base]
priority=1
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
exclude=postgres* php-pgsql*

これで希望するバージョンのpostgreSQLがインストールできるはずです。
あとは通常と同様です。

tcpip接続の有効化

postgresqlの場合、phpからローカル接続する場合もtcp/ipが利用されます。そこでtcp/ip接続を有効化する必要があります。
listen_addressesがコメントアウトされているので外します。外部から接続する場合はIPを設定します。
接続ポートを変える場合はportのコメントアウトを外して変更します。変更してしまうと他の設定個所にもいろいろ影響があるのでそのままにしておいた方がよいかと。

listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost', '*' = all
port = 5432 # (change requires restart)

設定を反映させるにはpostgresqlをリロードします。

# /sbin/service postgresql reload

SELINUXの設定変更

SELINUXを有効にしているとローカル接続であってもはじかれます。
はじかれているかどうかはログで確認できます。
これを通すようにするにはhttpd_can_network_connect_dbを有効にします。
mySQLpostgreSQLに有効らしいです。

# /usr/sbin/setsebool -P httpd_can_network_connect_db on

ちなみにmySQLでローカル接続の場合は無効の場合でも繋がりました。
接続ポートを変えた場合は他の処置が必要かと。
参考:SELinuxを使ってみる入門BoF

pg_hda.confによるクライアント認証設定

デフォルトのままだとほとんどの場合、接続できません。認証付でローカルだけ接続できるように設定してみます。
よくtrustにしている例がありますが、こうしてしまうとセキュリティが低すぎるのでmd5による認証ができるようにします。

  • /var/lib/pgsql/data/pg_hda.conf抜粋

# IPv4 local connections:
host all all 127.0.0.1/32 md5

変更したらpostgresqlをreloadします。

phpPgAdmin

Webによるphp管理ツールとしてphpPgAdminをインストールします。
これが動けばLAPP環境は出来たことになるかと。
インストールはrpmなどを使わず、公式サイトから落としたものを使いました。

設定ファイル

conf/config.inc.phpファイルが必要ですが、初めはありません。conf/config.inc.php-distをコピーして編集します。
とりあえず接続するpostgresqlサーバのホスト名を登録しておきます。($conf['servers'][0]['host'] = 'localhost';)|

  • conf/config.inc.php抜粋

// Hostname or IP address for server. Use '' for UNIX domain socket.
// use 'localhost' for TCP/IP connection on this computer
$conf['servers'][0]['host'] = 'localhost';

ログインですが、postgesやrootなどのよく使うユーザ名はphpPgAdminではじくようになっています。conf/config.inc.phpの設定で変更出来ますが、セキュリティ上このままのほうが好ましいでので専用のパスワード付のユーザをpostgresqlに作成しておく必要があります。
実際の運用時はphpPgAdminのページに対してIPアドレス規制やら認証などをつけてセキュリティーを高くする処置が必要です。

間違い等ありましたらご指摘いただけると助かります。

追記

2010/7/20: /etc/yum.repos.d/CentOS-Base.repoのexcludeの設定にミスがあったので修正しました。

データのコピー

CSVファイルによりコピーします。

コピー元

moodle.orgのサイトだと「現在、データベースのデータを簡単にエクスポートできる方法はありません。 」になってますが、現在はできるようになっています。データベースエントリの追加 - MoodleDocs

    1. コピー対象のデータベースで「エクスポート」タブを選択します。ここでエクスポート形式としてCSVテキストを選択して「データベースレコードをエクスポートする」を実行します。
    2. 本処理はバックアップのようにMoodleの「ファイル」には作成されず直接ローカルに作成されます。「ファイルに保存する」を選択してEXCEL等で直接開かないようにしましょう。

コピー先

「インポート」という処理は用意されていません。「エントリを追加する」でデータを登録します。(インポートがあるのでエクスポートがあると思い探してしまいました)

    1. 先ほど「データベース構造そのもののコピー」でコピーしたデータベースを選択します。
    2. 「エントリを追加する」タグを選択してスクロールします。ページの終わりの方に「ファイルからエントリをアップロードする」リンクがあるのでこれを選択します。
    3. 画面の下に「ファイルからエントリをアップロードする」欄が追加されます。ここで先ほどエクスポートしたファイルを選択します。
    4. 「ファイルをアップロードする」ボタンをクリックして処理を実行してください。処理が正常に終わったら一覧でエントリが追加されていることを確認してください。

備考

画像などのフィ−ルドを使った場合はこの方法では無理だと思います。このモジュール、どれくらい活用されているのかな?

データベース構造そのもののコピー

コピー元

    1. コースバックアップを使用します。このとき、バックアップはコピーしたデータベースのみチェックします。あとのユーザ情報等はすべてチェックを外します。
    2. 作成したバックアップファイルをダウンロードします。

コピー先

    1. コースリストアによりデータベースを配置したいコースに追加します。
    2. バックアップファイルをコピー先のMoodleにアップロードします。コースはリストアの画面で指定できるのでどこにアップロードしても良いのですが、追加するコースにアップロードしたほうが管理上楽です。
    3. コースリストアを使用します。バックアップファイルを指定すると処理が進み、ファイルの中身を表示後、どのようにリストアするか問い合わせ画面となります。この画面の「リストア」項目で「現在のコース、データを追加する」を選択します。ここで間違えるとコースがすべて消えてしまうので注意してください。「現在のコース、データを追加する」を選択した場合、項目「カテゴリ」「省略名」「名称」「開講日」は無効項目となります。
    4. 正常に完了するとコピー先のコースにデータベースが追加されているはずです。位置はコピー元のカテゴリ番号となるので、必要に応じて移動させます。

データベースモジュールのコピー方法

Moodleのデータベース課題モジュールで作成したデータベースを別のMoodleに持って行こうとしたところ、ちょっとはまったのでやり方を書き留めておきます。
わかりにくい要因としてはデータベースモジュールは活動に属するのでデータはユーザデータとなる点かと思います。

効果

ESXiの場合、インベントリの構成でCPU温度などのセンサー系が参照できます。ML115G5はさすがにサーバ機だけあってちゃんと情報が表示されています。
こちらで温度やファンスピードを確認してみました。

項目 対処前 対処後
CPU温度 45度〜41度 35度〜38度
フロント温度 32〜34度 32〜34度
CPUファン 2000rpm 2000rpm
ケースファン 3500〜4000rpm 1600rpm

CPUファンとケースファンのコネクタを逆さまにしているので実際にはケースファンが2000rpm,CPUファンが1600rpmで動作しています。
ケースを開けたままなので条件はことなりますが、ちゃんと冷えた上でファンのスピードが抑えられているので静音にはなりました。
CPUファンはPWMを捨てて2000rpmのものを取り付けてコネクタは元に戻した方が安定しそうなので、変更予定です。
クーラーを刀に変えてケースがちゃんとしまる方にした方が良いとは思いますが、とりあえずこのまま使っていく予定です。

サイズ 刀3クーラー SCKTN-3000

サイズ 刀3クーラー SCKTN-3000

アイネックス LGA用バックプレート リテールクーラー用 BS-775

アイネックス LGA用バックプレート リテールクーラー用 BS-775

失敗

失敗その1

 クーラーが大きすぎて、ケースが閉まらなくなってしまいました。ごく数ミリ飛び出てしまいました。刀3だと大丈夫みたいですね。仕方がないので開けたまま使うことにします。

失敗その2

 CPUファンのスピードが足りず、起動できない。
 ML1115G5の場合、サーバ機ということもありファンの回転数がシビアで回転数が低いと起動できません。今回CPUファンにPWM対応で1700rpmまで回るものを用意したのですが、どうも最低でも2000rpmはないと駄目っぽく起動できなくなりました。
 暫定手段としてケースファンとCPUファンのコネクタを逆にしてみました。こうすることで初期起動時の回転数テストには引っかからないようになりました。