Midnightjapan

Tag: Lsync

AJAX on PHP WEB Aplication Lsync+Rsyncシンクロミラーサーバー稼動!

by jun on 6月.28, 2010, under Linux

AJAXとutf8には、いろいろと悲惨な目にあいましたが、なんとか開発も無事に完了して仮稼動しました。

このサーバーを利用した面白い構成を紹介します。

通常はこの手のシステムはcronなどでバックアップを作成しておいて、トラブルがあった場合はそこから復旧のようなことを行いますがLsync+Rsyncを利用して、2台のサーバーを稼動させてほぼリアルタイムでバックアップを実現する構成を構築しましたので紹介します。

サーバー構成

◇ Apache[WEBサーバー]
設定ファイルはすべて[/etc/httpd/]にあります。シンボリックリンクもありますが、まぁいいでしょう。

◇ PHP[PHPシステム]
なにかと追加ライブラリなどを追加だ削除だと結構な頻度で更新されます。設定ファイルは[/etc/php.ini]のみ。Centosからはほぼ
すべてのライブラリをyumで受けつとることができてしまうため・・・あんまり意味ないかw

◇ MYSQLサーバー[SQLサーバー]
設定ファイルは[/etc/my.ini]。一度設定したら、ほぼ再設定はないでしょう。少なくとも私はほぼそうです。

◇ Sambaサーバー[Windowsファイル共有サーバー]
このサーバーの微妙なところが、ユーザー・グループごとの権限もあり、ユーザーの追加もユニックスユーザーとは別に行う必要があるため、設定が複雑になりやすく、完全にシンクロはむつかしいでしょうねぇ。ディレクトリにでもしてしまってもいいのですが・・・

このサーバーの目的は、かなり以前からの目標であった、クラウドの一環として考えられているため大人数とか少人数とか関係ありません。

それを特定企業の社内用に利用したいということなので、少人数の場合でも利用が容易になるようコストも抑えられ、クライアントライセンスも無制限になっています。

なので、セキュリティーはあまり考慮されていませんでの、決して単純に真似して乗っ取られないようにしてくださいね。

要するに数人しかいないので、ディレクトリまではいらないってことですね。
さて、これをどのようにするかというと・・・

1)各種設定をシンクしてみる。

各サーバーをみてみると、みんな/etcのなかにあるので、ためしにシンクしてみました。簡単にわかることですが、まぁためしに。

メインサーバー[192.1.1.1] → [/etc]シンク → セカンダリーサーバー[192.1.1.2]

当然ながら、ユーザー情報、サーバー情報(IPアドレス等)が違うので、まともにうごくわけもなく。バックアップどころか、セカンダリーサーバーで動いているサーバーはすべて停止して、システムエラーになり、無駄なプロセスがどんどん起動して、お話になりません。

そこで、考えます。

設定はダメだろう。

じゃデータだけやってみる。

ところが、Mysqlはデーターベースサーバー起動しているとコピーはできない。もちろんできたとしても破損の可能性大。シンクロは絶対にできない。

では、mysqlhotcopyを使ってコピーを行う。なるほど、これなら定期実行をcronで行える。

そこで

メインサーバー[192.1.1.1] → [mysqlhotcopy]Cronで定時実行 → [/share/mysql/]

メインサーバー[192.1.1.1][/share/mysql/] → [Lsync]でシンクロ → セカンダリーサーバー[192.1.1.2][/var/lib/mysql]

なるほど、いい考えだった。

実際にセカンダリーを起動してみると、稼動しました。

ん?起動したら?

じゃあ普段はとめておいて、どうやって起動するの?

そこはapacheからsudoすればいいじゃん!・・・?apacheユーザーがsudoできたらやばくね?たしかにやばいんですが、ここは社内用途専用ということで、やってみます。PHPではこのようにパスワードをパイプで渡して-Sモードで実行すればいいので、このように記述すると実行してくれます。

<?php
$cmd = "echo 'password' | sudo -S ls -la /root"; #rootのデフォルトフォルダをリスト表示
exec($cmd, $output);
?>

ところが、apacheユーザーには権限がありません。そこでまずはapacheにパスワードを設定します。

#passwd apache

次にsudoをApacheに許可します。

#visudo
Defaults requiretty           # コメントアウトされていないのでコメントアウトする
=># Defaults requiretty
=> apache  ALL=(ALL)       ALL # 末尾に追加

この、[Defaults requiretty]はsudoユーザーはtty(端末)を必ず必要とする設定なので、apacheのように端末が起動しない命令の場合実行してくれないわけです。ただし、セキュリティーとしては非常に危険な設定なので、普段は必須項目としてみてよろしいかと思います。
これで、apacheからのsudoが可能になります。
今回の目的となる命令的には[/etc/rc.d/init.d/mysqld start]を実行してあげればブラウザから実行されます。
共有ユーザーの同期はできないにしても、共有ファイルはシンクロしても問題ない!これをすべてサーバーに実装すると。

1.crontabでmysqlhotcopyを定時に実行

メインサーバー[192.1.1.1] → [mysqlhotcopy]Cronで定時実行 → [/share/mysql/]

2.シンクロしてセカンダリーと同期。

メインサーバー[192.1.1.1][/share/mysql/] → [Lsync]でシンクロ → セカンダリーサーバー[192.1.1.2][/var/lib/mysql]
メインサーバー[192.1.1.1][/var/www/html] → [Lsync]でシンクロ → セカンダリーサーバー[192.1.1.2][/var/www/html]
メインサーバー[192.1.1.1][/share/hoge/] → [Lsync]でシンクロ → セカンダリーサーバー[192.1.1.2][/share/hoge/]

3.緊急時にはブラウザからセカンダリーサーバーにアクセスする。PHPでsudoでステータス取得を行い、mysqlが起動していたらシステムを表示。起動していない場合はシステムを起動させるスイッチを表示させる。

4.スイッチをブラウザから実行[index.php]

<?php
//DB接続
$db_host = '192.1.1.1';
$db_user = 'hoge';
$db_pass = 'hoge';
$db = mysql_connect($db_host,$db_user,$db_pass);
$errorstr= mysql_errno();		//起動していない場合はエラーコード(2002)を返す
$apachepassword ='password';   //ユーザーapacheに設定したパスワード

if($input_mysqlexec == "start"){     //これは実行命令がきた場合の処理
	// シェルスクリプト実行
	$shell_start_cmd = "echo {$apachepassword} | sudo -S /root/mysqlswitch start";
	exec($shell_start_cmd,$output);
	 header("Location: index.php");
	 exit();

}elseif($errorstr==2002){		//Mysqlが起動していないので起動スイッチを表示
	 //内部文字コードを変更
	 mb_language("uni");
	 mb_internal_encoding("utf-8");
	 mb_http_input("auto");
	 mb_http_output("utf-8");
	 $page_content .= "<h4>MySQLサーバーは現在停止しています。</h4>\n";
	 $page_content .= "<hr />\n";
	 $page_content .= "<p align=\"center\">このサーバーのデータベースサーバーを起動しますか?</p>\n";
	 $page_content .= "<p align=\"center\"><input type=\"button\" value=\" データベースサーバー起動 \" onClick=\"location.href='index.php?mysqlexec=start'\"></p>\n";
	 print $page_content;
	exit();
?>

このときに[/root/mysqlswitch]で実行される、シェルスクリプトで下記のコマンドが実行される。

# sudo /etc/rc.d/init.d/mysqld start //DBサーバー起動
# sudo /etc/rc.d/init.d/smb start  //ファイル共有サーバー起動
# sudo /root/sharepermitautoexec.sh //権限再設定実行処理

最後の[/root/sharepermitautoexec.sh]なにかというと、すべてのファイルの権限を自動で設定してくれるシェルスクリプトです。ま、こんなのはサンプルに書く必要もないでしょうから、ご自身でGoogle活用してください。

これでファイル共有とWEBDBシステムのシンクロナイズ差分1時間遅れの完全シンクロシステムの設計と設定が完成しました。

ここからは実際ののLsync+Rsyncの設定です。

■rsyncサーバー設定(ミラー先)

[root@sub ~]# vi /etc/rsyncd.conf ← rsyncサーバー設定ファイル作成
[mysql]
        path = /var/lib/mysql
        hosts allow = 192.1.1.1/24
        read only = false
        list = true
        uid = mysql
        gid = mysql
[sharespot]
        path = /share/sharespot
        hosts allow = 192.1.1.1/24
        read only = false
        uid = root
        gid = root
[www]
        path = /var/www/html
        hosts allow = 192.1.1.1/24
        read only = false
        uid = root
        gid = root
~

設定ファイルを作成したら、xintedを再起動。自動起動に設定します。

[root@sub~]# yum -y install xinetd ← xinetdインストール
[root@sub~]# /etc/rc.d/init.d/xinetd restart ← xinetd再起動
xinetd を停止中:                                           [  OK  ]
xinetd を起動中:                                           [  OK  ]
[root@sub ~]# chkconfig rsync on

これでsubサーバーの設定は完了。

Lsyncdインストール(ミラー元)

[root@main ~]# yum -y install libxml2-devel ← lsyncdインストールに必要なパッケージをインストール
[root@main ~]# wget http://lsyncd.googlecode.com/files/lsyncd-1.26.tar.gz
[root@main ~]# tar zxvf lsyncd-1.26.tar.gz
[root@main ~]# cd lsyncd-1.26
[root@main lsyncd-1.26]# ./configure && make && make install
[root@main lsyncd-1.26] # cp -p lsyncd.conf.xml /etc/lsyncd.conf.xml ← lsyncdconfigを流用

次にlsyncのコンフィグを編集(下記を追加)

[root@main ~]# vi /etc/lsyncd.conf.xml
<directory>
        <source path="/share/mysql/"/>
        <target path="192.1.1.2::mysql/"/>
        <!--
        or it can also be an absolute path for localhost
        <target path="/absolute/path/to/target">
        -->
</directory>
<directory>
        <source path="/share/sharespot/"/>
        <target path="192.1.1.2::sharespot/"/>
        <!--
        or it can also be an absolute path for localhost
        <target path="/absolute/path/to/target">
        -->
</directory>
<directory>
        <source path="/var/www/html/"/>
        <target path="192.1.1.2::www/"/>
        <!--
        or it can also be an absolute path for localhost
        <target path="/absolute/path/to/target">
        -->
</directory>

次に起動スクリプトを作成

[root@main ~] #  cp -p /etc/init.d/xinetd /etc/init.d/lsyncd
[root@main ~] # vi /etc/rc.d/init.d/lsyncd
#!/bin/bash
## lsyncd: Starts the lsync Daemon
## chkconfig: 345 99 90
# description: Lsyncd uses rsync to synchronize local directories with a remote
#machine running rsyncd. Lsyncd watches multiple directories
#trees through inotify. The first step after adding the watches
#is to, rsync all directories with the remote host, and then sync
#single file buy collecting the inotify events.
# processname: lsyncd

. /etc/rc.d/init.d/functions

config="/etc/lsyncd.conf.xml"
lsyncd="/usr/local/bin/lsyncd"
lockfile="/var/lock/subsys/lsyncd"
prog="lsyncd"
RETVAL=0

start() {
if [ -f $lockfile ]; then
echo -n $"$prog is already running: "
echo
else
echo -n $"Starting $prog: "
daemon $lsyncd --conf=$config
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch $lockfile
return $RETVAL
fi
}

stop() {
echo -n $"Stopping $prog: "
killproc $lsyncd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f $lockfile
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status $lsyncd
;;
*)

また監視フォルダーが増加するとプロセス足りなくなると思うので32,768に設定。

# vi /etc/sysctl.conf
  -> fs.inotify.max_user_watches = 32768 # 新しい行を末尾に追加
# /sbin/sysctl -p

これで、完成。あとはシステムの設定をDBにいれるんですが、セカンダリー用とメインサーバー用の2つの設定をきちんともたせて、PHPで切り替えるようにしてあげればOKです。

こんな雑なメモは参考にならないと思いますが、私的なメモなので・・・

コメントなし :, , , more...

[Centos5.4-64bit] Lsync+Rsyncでのリアルタイムバックアップが停止(続編1)けど動いて調子に乗ってまたとめた!?

by jun on 5月.13, 2010, under Linux

/etc/sysctl.conf 内の設定を変更して1UIDあたりの最大プロセス数を増加させて動作するようになったLsync。

ならばとやめればいいのに、ほかのフォルダーのバックアップも本格的に実行したくなってしまい、Lsyncのコンフィグから再度設定。

起動スクリプトを下記のとおり変更。

!/bin/bash
## lsyncd
## chkconfig: 345 56 50
# description: xinetd is a powerful replacement for inetd. \n# xinetd has access control mechanisms, extensive \n# logging capabilities, the ability to make services \n# available based on time, and can place \n# limits on the number of servers that can be started, \n# among other things.## processname: /opt/lsyncd/binlsyncd
#Source function library
. /etc/rc.d/init.d/functions
PATH=$PATH:/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/lsyncd/bin
# Soruce networking configuration
[ -r /etc/sysconfig/lsync ] && . /etc/sysconfig/lsyncd
option="$SHORT_LOG $IGNORE_START_ERRORS $DEBUG"
RETVAL=0
prog="/usr/local/bin/lsyncd"
start(){
echo -n $"Starting $prog: "
daemon $prog $option
RETVAL=$?
echo
touch /var/lock/subsys/lsyncd
return $RETVAL
}
stop(){
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
rm -f /var/lock/subsys/lsyncd
return $RETVAL

}

reload(){
echo -n $"Reloading configuration: "
killproc $prog -HUP
RETVAL=$?
echo
return $RETVAL
}

restart(){
stop
start
}

condrestart(){
[ -e /var/lock/subsys/lsyncd ] && restart
return 0
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
RETVAL=1
esac

exit $RETVAL

ここで、設定(/etc/lsyncd.conf を利用せず、あらたにXMLで設定できるように /etc/lsyncd.conf.xml)を下記のように追加して変更します。

<lsyncd version="1">
		<!--
		This is a default config file template for lsyncd.
		Actually all settings are optional, if you delete them
		lsyncd will use the option value (which is likely identical
		to the values specified as defaults in this template)
		- Happy Syncing! -
		-->
		<settings>
		<!--uncomment to log all debug messages.-->
		<!--debug/-->
		<!--uncomment to log only errors.-->
		<!--scarce/-->

		<!--uncomment to not detach, log to stdout/stderr.-->
		<!--no-daemon/-->
 		<!--uncomment to not call any actions, run dry only.-->
		<!--dryrun/-->
		<!--uncomment to exclude file handled to rsync.-->
		<!--exclude-from filename="/tmp/exclude"/-->
		<!-- the file to log messages -->
		<logfile      filename="/var/log/lsyncd"/>
		<!--Specify the rsync (or other) binary to call-->
		<binary       filename="/usr/bin/rsync"/>
		<!--uncomment to create a file containing pid of the daemon-->
		<!--pidfile      filename="/var/run/lsyncd.pid"/-->
		<!--this specifies the arguments handled to the rsync (or other)
		binary.

		option is the default literal.
		only '%r' will be replaced with r when recursive
		operation is wanted, d when not.
		exclude-file will be replaced with -exclude-from FILE
		source will be the source path to sync from
		destination will be the destination path to sync to -->
		<callopts>
		<option text="-lt%r"/>
		<option text="--delete"/>
		<exclude-file/>
		<source/>
		<destination/>
		</callopts>
		</settings>

		<directory>
		<source path="/共有1"/>
		<target path="rsync側IPアドレス::設定名1"/>
		</directory>
		<directory>
		<source path="/共有2"/>
		<target path="rsync側IPアドレス::設定名2"/>
		</directory>
		<!--
		You can specify even more than one source/destination pair,
		all will be synced.
		 Please take care you do not make any with other source/target pairs.
		-->
		<!--directory>
		<source path="/home/axel/lsyncd-svn/3"/>
		<target path="/home/axel/lsyncd-svn/4"/>
		</directory-->
</lsyncd>
# /etc/rc.d/init.d/lsync restart
これでエラーなしに起動したら問題なし

無事にLsyncとRsyncが打ち合わせをはじめ、膨大なログの記録がはじまりました。

ところが、またエラーでLsync側が止まりました。

Thu May 13 19:33:20 2010: ERROR: Cannot add watch /共有場所2 (28:No space left on device)

またプロセス足りなくなったみたい。フォルダーはいったいいくつのあるのかしら・・・調べてみると。+14,469フォルダ。
というわけで4倍の32,768に設定。

# vi /etc/sysctl.conf
  -> fs.inotify.max_user_watches = 32768 # 新しい行を末尾に追加
# /sbin/sysctl -p
これで設定は完了して、反映されます。
#/etc/rc.d/init.d/lsyncd restart

問題なく動いてくれるはずだが・・・セキュリティーの面で本当に問題ないんだろうか・・・1つのUIDで多量のプロセスが扱えるように設定してしまった。
PHPの送信されてくるデータの最大バッファサイズの設定のようなものだが、あれとはレベルが違う。
ネットを探してもあまりいい参考はでてこなかった。

コメントなし :, , , , , more...

[Centos5.4-64bit] Lsync+Rsyncでのリアルタイムバックアップが停止

by jun on 5月.13, 2010, under Linux

現在Centosサーバー2台にてLsync+Rsyncによるリアルタイムバックアップが稼動しています。

むむむ・・更新されていないフォルダーがある。

本日問題が発生しました。

いや、以前にもおきていたかもしれない。

まずは受け取り側Rsyncは、とくに以上がない。念のためxintedを再起動してみる。

うんともすんともいわない。

ということは送り側が仕事してないのではと、Lsync側を除いてみる。

Logがすごいでかいので、課題が増えた。Logローテーションを組まねば・・・

結果、昨日の12時にとまっている。

たしかにWEBサイトの更新作業ファイルがものすごい細かいファイルを転送している最中にこんなメッセージが。

Wed May 12 09:20:06 2010: ERROR: Cannot add watch /○○共有フォルダー/ (28:No space left on device)

なにー!このデバイスに空きが無いだと!

# df -Th
Filesystem    Type  サイズ  使用  残り 使用% マウント位置
/dev/mapper/??秘密??
              ext3     53G   22G   28G  44% /
/dev/hda1     ext3     99M   24M   70M  26% /boot
/dev/sda1     ext3    231G  136G   83G  63% /共有フォルダ
/dev/sdb1     ext3    147G   63G   77G  46% /バックアップフォルダ
tmpfs        tmpfs    506M     0  506M   0% /仮想記憶

なんだよ・・・容量まだまだあるじゃんか。

ググってみるとlsyncはinotifyというAPIを利用してつくられているそうです。そこで1 つの実ユーザ ID に対して生成できる inotify?インスタンスの数の上限を指定する。下記ファイル内の設定値を読み込んで

/proc/sys/fs/inotify/max_user_watches

作成可能な監視対象の数の実 UID 単位の上限を指定しているそうです。

標準では8192がinotifyで監視できるファイル数の上限となっています。と、書いてありますが、元々すべてのファイルを監視しているならもっと以前に足らなくなっているので、/va/log/lsyncdを調べてみるとどうもフォルダー単位で監視しているみたいだし、スレッドの数なのでフォルダー数を超えてればいいのかなと判断します。

# cat /proc/sys/fs/inotify/max_user_watches
8192

自分の環境もこんな感じでした。ファイル共有フォルダーを丸ごとバックアップしているため、実ファイル数はもっと多く、ファイル数:120,808/フォルダー数:13,462/要領:57GBです。

とりあえず探したサイトでも、まずは倍にしてみましょうとあるので、倍の数値にしてみました。

ちなみにこの数値を設定すると:この制限を超えたイベントは破棄されるが、 IN_Q_OVERFLOW イベントが常に生成される。ということはオーバーフローイベントを呼び出すのね。

これは極端な数値にすると、あちこちからエラーでてサーバーがとまりかねないので、おすすめどおり倍の設定にしたほうがよさそうです。

ただし設定を反映するためには再起動を伴うため、/etc/sysctl.confに記述してあげるらしいです。

# cp -ip /etc/sysctl.conf{,.org}         # 設定ファイルをバックアップ
# vi /etc/sysctl.conf
  -> fs.inotify.max_user_watches = 16394 # 新しい行を末尾に追加
# /sbin/sysctl -p
これで設定は完了して、反映されます。
#/etc/rc.d/init.d/lsyncd restart

無事にLsyncとRsyncが打ち合わせをはじめ、膨大なログの記録がはじまりました。

更新されていなかったファイルはあっというまに更新され、ためしにテストフォルダーを作成、削除して、Rsync側が更新されるかテストしてみると、無事に更新されました。

しばらくこれで様子をみてみます。

コメントなし :, , , , , more...



何かお探しですか?

以下にキーワードを入力してサイト内検索が可能です:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!