2012年01月21日
HAProxyの設定メモ
HAProxy関連のメモ書き。
ローカルのメモがひどい状況になってるので少しずつまとめる予定。
前回の記事 HAProxyで作るL7ロードバランサ
■HAProxyのステータスを表示
--------------------------------------------------
listen hastats 192.168.0.254:80
mode http
maxconn 64
contimeout 5000
clitimeout 10000
srvtimeout 10000
stats enable
stats show-legends
stats uri /haproxy?hastats
stats auth haadmin:adminpass * 認証用のIDとPassを書く
--------------------------------------------------
haproxy reload後、http://192.168.0.254/haproxy?hastats へアクセスするとこんな画面が見れるようになる。
Sessions数だとか、TrafficのIn/Outなんかも見れて中々便利。
ただし、haproxyをrestartなんかさせるとデータが初期化されてしまうので、統計データをとる必要がある場合は、"CSV export"からGETして、DBかなんかに突っ込んでおけば良いと思う。
■URLバランシングの設定
例えば、http://192.168.0.100/ 以下のリクエスト内容により、バランシングするサーバを分けたい場合に利用する。
(設定例)
"/" → srv01, srv02 でバランシング
"/cms/" → srv03 のみへ振り分け
"/phpmyadmin/" → srv04 のみへ振り分け
* srv03, srv04 は特にヘルスチェックを行わない。
--------------------------------------------------
listen www
bind 192.168.0.100:80
mode http
balance leastconn
maxconn 1024
contimeout 5000
clitimeout 10000
srvtimeout 10000
option httpchk GET /check.html HTTP/1.0
option log-health-checks
option forwardfor
reqisetbe ^[^\ ]*\ /cms/ www:cms
reqisetbe ^[^\ ]*\ /phppgadmin/ www:myadmin
server srv01 192.168.0.1:80 check inter 2000 fall 2
server srv02 192.168.0.2:80 check inter 2000 fall 2
backend www:cms
mode http
balance leastconn
contimeout 5000
srvtimeout 10000
server srv03 192.168.0.3:80
backend www:myadmin
mode http
balance leastconn
contimeout 5000
srvtimeout 10000
server srv04 192.168.0.4:80
--------------------------------------------------
reqisetbeで正規表現を書いて、それにマッチした場合は"www:cms"と結びついた"backend www:cms"(のサーバ)に振り分けるという設定になる。
便宜上、"www:***"と書いているが、ここはhogeでもhugaでも何でも良い。
当たり前だけどhaproxyが1セッション毎にHTTPヘッダを読んで処理するので、LB上で何でもかんでもやってしまったり、途方も無い処理量だったりすると当然パフォーマンスは落ちる。
設定の見直しが一番だけど、kernelや、haproxy自体のチューニングを弄れば多少は良くなるかも。深く調べてないがhaproxyだと下記パラメータあたりだと思う。
"nbproc", "maxconn", "tune.bufsize", "tune.maxaccept", "tune.maxpollevents", "tune.maxrewrite"
設定はシンプルだけど、アクセスが尋常なくてLBが死にそうなんだけどって人は、haproxyをL4モードで動かすとかなり早くなるはず。
具体的な設定例としては、haproxy.cfgの"mode http"を"mode tcp"に変えるだけ。ただし、forwardforとかのオプションは利用できなくなるので悩ましいところ。
あとは、DNSラウンドロビンとheartbeat何かをうまく使えば、LBのなんちゃってデュアルプライマリ構成も取れると思うんだけどこちらは未検証。
セッション管理さえクリアすれば冗長したLBを無駄なく使えてよさそうな気がしてる。
今度試してみるかな。
ローカルのメモがひどい状況になってるので少しずつまとめる予定。
前回の記事 HAProxyで作るL7ロードバランサ
■HAProxyのステータスを表示
--------------------------------------------------
listen hastats 192.168.0.254:80
mode http
maxconn 64
contimeout 5000
clitimeout 10000
srvtimeout 10000
stats enable
stats show-legends
stats uri /haproxy?hastats
stats auth haadmin:adminpass * 認証用のIDとPassを書く
--------------------------------------------------
haproxy reload後、http://192.168.0.254/haproxy?hastats へアクセスするとこんな画面が見れるようになる。
Sessions数だとか、TrafficのIn/Outなんかも見れて中々便利。
ただし、haproxyをrestartなんかさせるとデータが初期化されてしまうので、統計データをとる必要がある場合は、"CSV export"からGETして、DBかなんかに突っ込んでおけば良いと思う。
■URLバランシングの設定
例えば、http://192.168.0.100/ 以下のリクエスト内容により、バランシングするサーバを分けたい場合に利用する。
(設定例)
"/" → srv01, srv02 でバランシング
"/cms/" → srv03 のみへ振り分け
"/phpmyadmin/" → srv04 のみへ振り分け
* srv03, srv04 は特にヘルスチェックを行わない。
--------------------------------------------------
listen www
bind 192.168.0.100:80
mode http
balance leastconn
maxconn 1024
contimeout 5000
clitimeout 10000
srvtimeout 10000
option httpchk GET /check.html HTTP/1.0
option log-health-checks
option forwardfor
reqisetbe ^[^\ ]*\ /cms/ www:cms
reqisetbe ^[^\ ]*\ /phppgadmin/ www:myadmin
server srv01 192.168.0.1:80 check inter 2000 fall 2
server srv02 192.168.0.2:80 check inter 2000 fall 2
backend www:cms
mode http
balance leastconn
contimeout 5000
srvtimeout 10000
server srv03 192.168.0.3:80
backend www:myadmin
mode http
balance leastconn
contimeout 5000
srvtimeout 10000
server srv04 192.168.0.4:80
--------------------------------------------------
reqisetbeで正規表現を書いて、それにマッチした場合は"www:cms"と結びついた"backend www:cms"(のサーバ)に振り分けるという設定になる。
便宜上、"www:***"と書いているが、ここはhogeでもhugaでも何でも良い。
当たり前だけどhaproxyが1セッション毎にHTTPヘッダを読んで処理するので、LB上で何でもかんでもやってしまったり、途方も無い処理量だったりすると当然パフォーマンスは落ちる。
設定の見直しが一番だけど、kernelや、haproxy自体のチューニングを弄れば多少は良くなるかも。深く調べてないがhaproxyだと下記パラメータあたりだと思う。
"nbproc", "maxconn", "tune.bufsize", "tune.maxaccept", "tune.maxpollevents", "tune.maxrewrite"
設定はシンプルだけど、アクセスが尋常なくてLBが死にそうなんだけどって人は、haproxyをL4モードで動かすとかなり早くなるはず。
具体的な設定例としては、haproxy.cfgの"mode http"を"mode tcp"に変えるだけ。ただし、forwardforとかのオプションは利用できなくなるので悩ましいところ。
あとは、DNSラウンドロビンとheartbeat何かをうまく使えば、LBのなんちゃってデュアルプライマリ構成も取れると思うんだけどこちらは未検証。
セッション管理さえクリアすれば冗長したLBを無駄なく使えてよさそうな気がしてる。
今度試してみるかな。
2011年02月09日
HAProxyで作るL7ロードバランサ
前々から気になっていた、HAProxyを試してみた。
今回は、LinuxとHAProxyを使ってL7ロードバランサとして動かそうと思う。
よくあるロードバランサ製品は高くて手が出ないので、ソフトウェアでなんと
かしたいと思い検証。
ソフトウェアのL4だとLVSが有名で、L7だとUltraMonkey-L7とかApacheの
モジュールもあったと思う。
最終的には冗長化して、L4 - 7のバランシング、SSL終端として機能させる
予定。とりあえずはインストールと簡単な設定、動作確認から。
CentOS 5.5とHAProxy 1.4.10を使用する。IPは下記のような感じにした。
LBサーバ(HAproxy) → 192.168.0.254
Webサーバ srv01 → 192.168.0.1
Webサーバ srv02 → 192.168.0.2
----------------------------------------------------------------
■HAProxyのrpm作成とインストール
specファイルが用意されているので折角だからrpmにしてみた。依存関係
でpcre-develが必要だったのでyumでインストールしておく。
# yum -y install pcre-devel
ソースの取得と展開
# cd /usr/src/redhat/SOURCE
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.10.tar.gz
# tar xfz haproxy-1.4.10.tar.gz
# cd cd haproxy-1.4.10/
# cp examples/haproxy.spec ../SPECS
rpmbuildでrpm作成
# rpmbuild -bb ../SPECS/haproxy.spec
# cd ../RPMS/i386/
# ls
haproxy-1.4.10-1.i386.rpm haproxy-debuginfo-1.4.10-1.i386.rpm
あとは普通にインストールする
# rpm -ivh haproxy-1.4.10-1.i386.rpm
準備中... ########################################### [100%]
1:haproxy ########################################### [100%]
インストールされたファイルを確認
# rpm -qs haproxy
/etc/haproxy/haproxy.cfg
/etc/rc.d/init.d/haproxy
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.4.10/* ← サンプルコンフィグ等が色々ある
/usr/share/man/man1/haproxy.1.gz
*ソースで入れたい人は下記のように。make時にOS,CPUの種類を指定して
やる必要がある。通常は/usr/local以下にインストールされるが、Makefil
をいじれば変更できる。
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.10.tar.gz
# tar xfz haproxy-1.4.10.tar.gz
# cd cd haproxy-1.4.10/
# make TARGET=linux26 ARCH=i386
# make install
----------------------------------------------------------------
■HAProxyの設定
すでにサンプルコンフィグがあるのでリネーム
# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig
# vi /etc/haproxy/haproxy.cfg
--------------------------------------------------
global
log 127.0.0.1 local6
maxconn 4096
daemon
retries 2
contimeout 5000
clitimeout 10000
srvtimeout 10000
defaults
log global
listen www
bind 0.0.0.0:80
mode http
option httpchk GET /check.html HTTP/1.0
option log-health-checks
option forwardfor
balance roundrobin
server srv01 192.168.0.1:80 check inter 2000 fall 2
server srv02 192.168.0.2:80 check inter 2000 fall 2
--------------------------------------------------
簡単に設定したので何となく分かるとは思うが、各パラメータの意味は
下記のような感じになる。
・maxconn
最大同時接続数
・option httpchk
ヘルスチェックの方法。Webサーバのcheck.htmlに対しGETして200 OK
で死活確認する設定にした。事前にsrv01とsrv02にcheck.htmlを作成
しておく。内容はsrv01 OKと簡単なものでOK。
・option log-health-checks
コレを入れるとヘルスチェック時のアクションが詳細にログに出る
・option forwardfor
X-Forwarded-ForヘッダをWebサーバに渡すオプション。Webサーバのア
クセスログに接続元IPを記録させたい為に設定。
・balance roundrobin
ラウンドロビン方式での振り分け。こちらは重み付けも可能で、他には
static-rr、leastconn、source等色々用意されている。
・server ホスト名 IP:Port check inter 2000 fall 2
WebサーバのIPとPortを指定。checkはヘルスチェックの有効化でinter
でヘルチェック間隔の指定。単位はミリ秒なので今回は2秒。fallは2回
ヘルチェックが落ちたら振り分け対象から切り離すという意味。
----------------------------------------------------------------
■HAProxyのログ出力先の設定
今回はファシリティlocal6を指定し、個別にログを出す設定をした。
syslog-ngで適当にフィルタを書いて、/var/log/haproxy.logに出すよう
にした。
ログローテートの設定
# vi /etc/logrotate.d/haproxy
/var/log/haproxy.log {
missingok
notifempty
sharedscripts
postrotate
/sbin/service haproxy reload > /dev/null 2>/dev/null || true
endscript
}
ローテトの確認
# /usr/sbin/logrotate -dv /etc/logrotate.d/haproxy
----------------------------------------------------------------
■HAProxyの起動
とりあえずHAProxyの設定は一端完了。ここで起動して動作確認。
事前に
# /etc/init.d/haproxy start
無事起動したら192.168.0.254(LBのIP)にブラウザからアクセスしてみる。
何度かリロードしてみてsrv01とsrv02のページが交互に表示されるかを
確認してみる。
無事振り分けされているようであれば、とりあえずは成功。ただし、こ
のままではWebサーバのアクセスログがかなり残念な事になっているので
ログ周りの設定をしてやる。
----------------------------------------------------------------
■Webサーバのヘルスチェックログ停止
まずは2秒毎に出力されるヘルスチェックログを止めてやる。こんな感じ
で出続けていると思う。
192.168.0.254 - - [05/Feb/2011:16:29:04 +0900] "GET /check.html HTTP/1.0" 200 18 "-" "-"
192.168.0.254 - - [05/Feb/2011:16:29:06 +0900] "GET /check.html HTTP/1.0" 200 18 "-" "-"
ヘルスチェックで何かアクションがあれば、LB側のログに出るし、Webサーバ
の容量が勿体無いので下記のようにApacheの設定をした。
# vi /etc/httpd/conf/httpd.conf
--------------------------------------------------
ここを
CustomLog logs/access_log combined
こんな感じにする
SetEnvIf Request_URI "check.html" nolog
CustomLog logs/access_log combined env=!nolog
--------------------------------------------------
次はアクセスログにLBのIPではなく接続元のIPを記録する設定をする。
----------------------------------------------------------------
■mod_rpafのインストールと設定
mod_rpafはX-Forwarded-ForヘッダのIPを上手い具合に書き換えてくれる
モジュール。これを使えばLB経由のアクセスでもきちんと接続元IPが記
録できる。
# yum -y install httpd-devel
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar xfz mod_rpaf-0.6.tar.gz
# vi Makefile
下記を書き換え *利用しているApacheのバージョンに合わせる必要がある
----------------------------------------
jAPXS2=$(shell which apxs2)
↓
APXS2=/usr/sbin/apxs
----------------------------------------
# make rpaf-2.0
# make install-2.0
# vi /etc/httpd/conf.d/mod_rpaf.conf
以下の記述を追加
------------------------------------------------
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 192.168.0.254
------------------------------------------------
LBが複数台ある場合は 1.1.1.1 2.2.2.2 のように記述する。
Apacheを再起動して設定の反映。
# /etc/init.d/httpd restart
再びブラウザからLB経由でアクセスしてみる。Webサーバのログを確認し
てヘルスチェックのログが止まり、接続元のIPがログに残っていればOK。
HAProxyは沢山パラメータがあり、色々できそうな感じなので調べ次第細
かく書き残そうと思う。
今回は、LinuxとHAProxyを使ってL7ロードバランサとして動かそうと思う。
よくあるロードバランサ製品は高くて手が出ないので、ソフトウェアでなんと
かしたいと思い検証。
ソフトウェアのL4だとLVSが有名で、L7だとUltraMonkey-L7とかApacheの
モジュールもあったと思う。
最終的には冗長化して、L4 - 7のバランシング、SSL終端として機能させる
予定。とりあえずはインストールと簡単な設定、動作確認から。
CentOS 5.5とHAProxy 1.4.10を使用する。IPは下記のような感じにした。
LBサーバ(HAproxy) → 192.168.0.254
Webサーバ srv01 → 192.168.0.1
Webサーバ srv02 → 192.168.0.2
----------------------------------------------------------------
■HAProxyのrpm作成とインストール
specファイルが用意されているので折角だからrpmにしてみた。依存関係
でpcre-develが必要だったのでyumでインストールしておく。
# yum -y install pcre-devel
ソースの取得と展開
# cd /usr/src/redhat/SOURCE
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.10.tar.gz
# tar xfz haproxy-1.4.10.tar.gz
# cd cd haproxy-1.4.10/
# cp examples/haproxy.spec ../SPECS
rpmbuildでrpm作成
# rpmbuild -bb ../SPECS/haproxy.spec
# cd ../RPMS/i386/
# ls
haproxy-1.4.10-1.i386.rpm haproxy-debuginfo-1.4.10-1.i386.rpm
あとは普通にインストールする
# rpm -ivh haproxy-1.4.10-1.i386.rpm
準備中... ########################################### [100%]
1:haproxy ########################################### [100%]
インストールされたファイルを確認
# rpm -qs haproxy
/etc/haproxy/haproxy.cfg
/etc/rc.d/init.d/haproxy
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.4.10/* ← サンプルコンフィグ等が色々ある
/usr/share/man/man1/haproxy.1.gz
*ソースで入れたい人は下記のように。make時にOS,CPUの種類を指定して
やる必要がある。通常は/usr/local以下にインストールされるが、Makefil
をいじれば変更できる。
# wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.10.tar.gz
# tar xfz haproxy-1.4.10.tar.gz
# cd cd haproxy-1.4.10/
# make TARGET=linux26 ARCH=i386
# make install
----------------------------------------------------------------
■HAProxyの設定
すでにサンプルコンフィグがあるのでリネーム
# mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig
# vi /etc/haproxy/haproxy.cfg
--------------------------------------------------
global
log 127.0.0.1 local6
maxconn 4096
daemon
retries 2
contimeout 5000
clitimeout 10000
srvtimeout 10000
defaults
log global
listen www
bind 0.0.0.0:80
mode http
option httpchk GET /check.html HTTP/1.0
option log-health-checks
option forwardfor
balance roundrobin
server srv01 192.168.0.1:80 check inter 2000 fall 2
server srv02 192.168.0.2:80 check inter 2000 fall 2
--------------------------------------------------
簡単に設定したので何となく分かるとは思うが、各パラメータの意味は
下記のような感じになる。
・maxconn
最大同時接続数
・option httpchk
ヘルスチェックの方法。Webサーバのcheck.htmlに対しGETして200 OK
で死活確認する設定にした。事前にsrv01とsrv02にcheck.htmlを作成
しておく。内容はsrv01 OKと簡単なものでOK。
・option log-health-checks
コレを入れるとヘルスチェック時のアクションが詳細にログに出る
・option forwardfor
X-Forwarded-ForヘッダをWebサーバに渡すオプション。Webサーバのア
クセスログに接続元IPを記録させたい為に設定。
・balance roundrobin
ラウンドロビン方式での振り分け。こちらは重み付けも可能で、他には
static-rr、leastconn、source等色々用意されている。
・server ホスト名 IP:Port check inter 2000 fall 2
WebサーバのIPとPortを指定。checkはヘルスチェックの有効化でinter
でヘルチェック間隔の指定。単位はミリ秒なので今回は2秒。fallは2回
ヘルチェックが落ちたら振り分け対象から切り離すという意味。
----------------------------------------------------------------
■HAProxyのログ出力先の設定
今回はファシリティlocal6を指定し、個別にログを出す設定をした。
syslog-ngで適当にフィルタを書いて、/var/log/haproxy.logに出すよう
にした。
ログローテートの設定
# vi /etc/logrotate.d/haproxy
/var/log/haproxy.log {
missingok
notifempty
sharedscripts
postrotate
/sbin/service haproxy reload > /dev/null 2>/dev/null || true
endscript
}
ローテトの確認
# /usr/sbin/logrotate -dv /etc/logrotate.d/haproxy
----------------------------------------------------------------
■HAProxyの起動
とりあえずHAProxyの設定は一端完了。ここで起動して動作確認。
事前に
# /etc/init.d/haproxy start
無事起動したら192.168.0.254(LBのIP)にブラウザからアクセスしてみる。
何度かリロードしてみてsrv01とsrv02のページが交互に表示されるかを
確認してみる。
無事振り分けされているようであれば、とりあえずは成功。ただし、こ
のままではWebサーバのアクセスログがかなり残念な事になっているので
ログ周りの設定をしてやる。
----------------------------------------------------------------
■Webサーバのヘルスチェックログ停止
まずは2秒毎に出力されるヘルスチェックログを止めてやる。こんな感じ
で出続けていると思う。
192.168.0.254 - - [05/Feb/2011:16:29:04 +0900] "GET /check.html HTTP/1.0" 200 18 "-" "-"
192.168.0.254 - - [05/Feb/2011:16:29:06 +0900] "GET /check.html HTTP/1.0" 200 18 "-" "-"
ヘルスチェックで何かアクションがあれば、LB側のログに出るし、Webサーバ
の容量が勿体無いので下記のようにApacheの設定をした。
# vi /etc/httpd/conf/httpd.conf
--------------------------------------------------
ここを
CustomLog logs/access_log combined
こんな感じにする
SetEnvIf Request_URI "check.html" nolog
CustomLog logs/access_log combined env=!nolog
--------------------------------------------------
次はアクセスログにLBのIPではなく接続元のIPを記録する設定をする。
----------------------------------------------------------------
■mod_rpafのインストールと設定
mod_rpafはX-Forwarded-ForヘッダのIPを上手い具合に書き換えてくれる
モジュール。これを使えばLB経由のアクセスでもきちんと接続元IPが記
録できる。
# yum -y install httpd-devel
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar xfz mod_rpaf-0.6.tar.gz
# vi Makefile
下記を書き換え *利用しているApacheのバージョンに合わせる必要がある
----------------------------------------
jAPXS2=$(shell which apxs2)
↓
APXS2=/usr/sbin/apxs
----------------------------------------
# make rpaf-2.0
# make install-2.0
# vi /etc/httpd/conf.d/mod_rpaf.conf
以下の記述を追加
------------------------------------------------
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 192.168.0.254
------------------------------------------------
LBが複数台ある場合は 1.1.1.1 2.2.2.2 のように記述する。
Apacheを再起動して設定の反映。
# /etc/init.d/httpd restart
再びブラウザからLB経由でアクセスしてみる。Webサーバのログを確認し
てヘルスチェックのログが止まり、接続元のIPがログに残っていればOK。
HAProxyは沢山パラメータがあり、色々できそうな感じなので調べ次第細
かく書き残そうと思う。
2011年01月15日
lsyncdでディレクトリ間の同期をとる
自宅のファイルサーバにSambaを立てていて、この中のデータを上手い具合に玄箱に
同期できないかを探していたらlsyncdという良いものを見つけた。
これがあればDropbox的な事ができたりする。lsyncdはLinuxカーネルに含まれている
inotifyというファイルイベントを検知してくれるソフトウェアが必要となる。また、
ミラー先にファイルを転送するため、rsyncも必要。
今回の環境としては下記のような感じ。
[ミラー元] 192.168.0.1
CentOS 5.5 + Samba + lsyncd
[ミラー先] 192.168.0.2
Debian + Samba + rsync (バックアップだけならSambaはいらない)
では、早速インストールする。Sambaとrsyncのインストールについては割愛。
--------------------------------------------------
■ rsyncでrootの認証無しログインを可能にするための設定
*完全クローズドな環境なのでセキュリティは特に考慮してないのでご注意。
[ミラー元の作業]
# ssh-keygen -t rsa
# cd ~/.ssh/
# id_rsa.pub を SCP 等でミラー先へ運ぶ
[ミラー先の作業]
# mkdir ~/.ssh
# chmod 700 ~/.ssh
# touch ~/.ssh/authorized_keys
# cat id_rsa.pub > ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# vi /etc/ssh/sshd_config
rootログインを許可してやる
"PermitRootLogin yes" ← "no" を "yes" へ変更
sshdを再起動して設定反映
# /etc/init.d/sshd restart
設定反映後にミラー元からSSHしてみる。初回ログインだとkownhostがどーのと聞くい
てくるので "yes" をえらぶ。次回からは聞かれなくなる。
--------------------------------------------------
■rsyncの設定
*Xinte.d経由でも大丈夫だと思う。
[ミラー先の作業]
# vi /etc/rsyncd.conf
--------------------------------------------------
uid = root
gid = root
read only = no
hosts allow = 192.168.0.1 ← ミラー元の接続を許可
[sync_dir1] ← モジュール名
path = /backup/data1 ← ミラー先のディレクトリパス
[sync_dir2] ← 複数設定する場合はこんな感じで追加していく
path = /backup/data2
--------------------------------------------------
rsyncdの起動。忘れずに自動起動の設定もしておく。
# /etc/init.d/rsyncd start
--------------------------------------------------
■lsyncdのインストール (以降はミラー元での作業)
# yum -y install libxml2-devel
# wget http://lsyncd.googlecode.com/files/lsyncd-1.42.tar.gz
# tar zxvf lsyncd-1.26.tar.gz
*デフォルトでは "/usr/local" 以下にインストールされる
# ./configure
# make
# make install
--------------------------------------------------
■lsyncdの設定
今回はディレクトリ間を完全同期にするため、"rsync -avz --delete" を設定。
別途、CentOSとDebianでuidなんかが違っていたので適当に合わせた。
# vi /etc/lsyncd.conf.xml
注意: "<>" は全角は記述されてます。半角のままだと投稿できなかったorz
XSSとかの禁止文字列か何かかな?
--------------------------------------------------
<lsyncd version="1"\>
<settings>
<logfile filename="/var/log/lsyncd.log"/> ← ログの出力先
<binary filename="http://img03.ti-da.net/usr/bin/rsync"/> ← rsyncのパス
<callopts>
<option text="-lt%r"/> ← rsyncオプション
<option text="-avz"/>
<option text="--delete"/>
<exclude-file/>
<source/>
<destination/>
</callopts>
</settings>
<directory>
<source path="/home/data1/"/> ← コピーするディレクトリ
<target path="192.168.0.2::sync_dir1/"/> ← ミラー先IP + モジュール名
</directory>
<directory>
<source path="/home/data2/"/> ← 追加する場合はこのように
<target path="192.168.0.2::sync_dir2/"/>
</directory>
</lsyncd>
--------------------------------------------------
追加は <directory> ~ </directory> タグの間に設定をしていく。
--------------------------------------------------
■ログファイル作成 & ログローテートの設定
# touch /var/log/lsyncd.log
# vi /etc/logrotate.d/lsyncd
--------------------------------------------------
/var/log/lsyncd.log {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/lsyncd restart 2>&1 > /dev/null || true
endscript
}
--------------------------------------------------
テストする場合は "logrotate -dv /etc/logrotate.d/lsyncd" で確認。
--------------------------------------------------
■lsyncd 起動スクリプト作成
# vi /etc/init.d/lsyncd
--------------------------------------------------
#!/bin/bash
#
# lsyncd
#
# chkconfig: - 99 20
# description: lsyncd auto start script
. /etc/rc.d/init.d/functions
start() {
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "lsyncd (pid $pid) is running..."
exit
fi
/usr/local/bin/lsyncd --conf /etc/lsyncd.conf.xml
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "Starting lsyncd (pid $pid)"
else
echo "Error lsyncd is not running"
fi
}
stop() {
/bin/kill -9 `/sbin/pidof lsyncd`
until [ -z $(/sbin/pidof lsyncd) ]; do :; done
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "lsyncd (pid $pid) is running..."
else
echo "lsyncd is not running"
fi
;;
*)
echo "Usage: lsyncd {start|stop|restart|status}"
exit 1
esac
exit $?
--------------------------------------------------
# chmod 755 /etc/init.d/lsyncd
# chkconfig --add lsyncd
# chkconfig lsyncd on
--------------------------------------------------
■同期の確認
上記でインストール、設定が終わったのでlsyncdを起動して同期を開始。
# /etc/init.d/lsyncd start
転送されているかを確認するにはミラー元でログを確認。吐かれるログはrsync形式
のものだ。
# tail -f /var/log/lsyncd.log
同期が終わったら転送が成功したかを念のため確認しておいた。
[ミラー元]
# find /home/data1/ -type f -print0 | xargs -0 md5sum > md5.txt
# scp md5.txt root@192.168.0.2:
[ミラー先]
(LANG=C md5sum --check /root/md5.txt > /root/md5-check.log 2>&1)
*もし、何か異常があれば "md5-check.log" の末尾に下記のようなメッセージがでる。
md5sum: WARNING: 23 of 2783 computed checksums did NOT match
その時は対象ファイルを探して対処する。
# cat md5-check.log | grep -v "OK" > md5-NG.log
同期できないかを探していたらlsyncdという良いものを見つけた。
これがあればDropbox的な事ができたりする。lsyncdはLinuxカーネルに含まれている
inotifyというファイルイベントを検知してくれるソフトウェアが必要となる。また、
ミラー先にファイルを転送するため、rsyncも必要。
今回の環境としては下記のような感じ。
[ミラー元] 192.168.0.1
CentOS 5.5 + Samba + lsyncd
[ミラー先] 192.168.0.2
Debian + Samba + rsync (バックアップだけならSambaはいらない)
では、早速インストールする。Sambaとrsyncのインストールについては割愛。
--------------------------------------------------
■ rsyncでrootの認証無しログインを可能にするための設定
*完全クローズドな環境なのでセキュリティは特に考慮してないのでご注意。
[ミラー元の作業]
# ssh-keygen -t rsa
# cd ~/.ssh/
# id_rsa.pub を SCP 等でミラー先へ運ぶ
[ミラー先の作業]
# mkdir ~/.ssh
# chmod 700 ~/.ssh
# touch ~/.ssh/authorized_keys
# cat id_rsa.pub > ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/authorized_keys
# vi /etc/ssh/sshd_config
rootログインを許可してやる
"PermitRootLogin yes" ← "no" を "yes" へ変更
sshdを再起動して設定反映
# /etc/init.d/sshd restart
設定反映後にミラー元からSSHしてみる。初回ログインだとkownhostがどーのと聞くい
てくるので "yes" をえらぶ。次回からは聞かれなくなる。
--------------------------------------------------
■rsyncの設定
*Xinte.d経由でも大丈夫だと思う。
[ミラー先の作業]
# vi /etc/rsyncd.conf
--------------------------------------------------
uid = root
gid = root
read only = no
hosts allow = 192.168.0.1 ← ミラー元の接続を許可
[sync_dir1] ← モジュール名
path = /backup/data1 ← ミラー先のディレクトリパス
[sync_dir2] ← 複数設定する場合はこんな感じで追加していく
path = /backup/data2
--------------------------------------------------
rsyncdの起動。忘れずに自動起動の設定もしておく。
# /etc/init.d/rsyncd start
--------------------------------------------------
■lsyncdのインストール (以降はミラー元での作業)
# yum -y install libxml2-devel
# wget http://lsyncd.googlecode.com/files/lsyncd-1.42.tar.gz
# tar zxvf lsyncd-1.26.tar.gz
*デフォルトでは "/usr/local" 以下にインストールされる
# ./configure
# make
# make install
--------------------------------------------------
■lsyncdの設定
今回はディレクトリ間を完全同期にするため、"rsync -avz --delete" を設定。
別途、CentOSとDebianでuidなんかが違っていたので適当に合わせた。
# vi /etc/lsyncd.conf.xml
注意: "<>" は全角は記述されてます。半角のままだと投稿できなかったorz
XSSとかの禁止文字列か何かかな?
--------------------------------------------------
<lsyncd version="1"\>
<settings>
<logfile filename="/var/log/lsyncd.log"/> ← ログの出力先
<binary filename="http://img03.ti-da.net/usr/bin/rsync"/> ← rsyncのパス
<callopts>
<option text="-lt%r"/> ← rsyncオプション
<option text="-avz"/>
<option text="--delete"/>
<exclude-file/>
<source/>
<destination/>
</callopts>
</settings>
<directory>
<source path="/home/data1/"/> ← コピーするディレクトリ
<target path="192.168.0.2::sync_dir1/"/> ← ミラー先IP + モジュール名
</directory>
<directory>
<source path="/home/data2/"/> ← 追加する場合はこのように
<target path="192.168.0.2::sync_dir2/"/>
</directory>
</lsyncd>
--------------------------------------------------
追加は <directory> ~ </directory> タグの間に設定をしていく。
--------------------------------------------------
■ログファイル作成 & ログローテートの設定
# touch /var/log/lsyncd.log
# vi /etc/logrotate.d/lsyncd
--------------------------------------------------
/var/log/lsyncd.log {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/lsyncd restart 2>&1 > /dev/null || true
endscript
}
--------------------------------------------------
テストする場合は "logrotate -dv /etc/logrotate.d/lsyncd" で確認。
--------------------------------------------------
■lsyncd 起動スクリプト作成
# vi /etc/init.d/lsyncd
--------------------------------------------------
#!/bin/bash
#
# lsyncd
#
# chkconfig: - 99 20
# description: lsyncd auto start script
. /etc/rc.d/init.d/functions
start() {
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "lsyncd (pid $pid) is running..."
exit
fi
/usr/local/bin/lsyncd --conf /etc/lsyncd.conf.xml
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "Starting lsyncd (pid $pid)"
else
echo "Error lsyncd is not running"
fi
}
stop() {
/bin/kill -9 `/sbin/pidof lsyncd`
until [ -z $(/sbin/pidof lsyncd) ]; do :; done
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
pid=`pidof lsyncd`
if [ $? -eq 0 ]; then
echo "lsyncd (pid $pid) is running..."
else
echo "lsyncd is not running"
fi
;;
*)
echo "Usage: lsyncd {start|stop|restart|status}"
exit 1
esac
exit $?
--------------------------------------------------
# chmod 755 /etc/init.d/lsyncd
# chkconfig --add lsyncd
# chkconfig lsyncd on
--------------------------------------------------
■同期の確認
上記でインストール、設定が終わったのでlsyncdを起動して同期を開始。
# /etc/init.d/lsyncd start
転送されているかを確認するにはミラー元でログを確認。吐かれるログはrsync形式
のものだ。
# tail -f /var/log/lsyncd.log
同期が終わったら転送が成功したかを念のため確認しておいた。
[ミラー元]
# find /home/data1/ -type f -print0 | xargs -0 md5sum > md5.txt
# scp md5.txt root@192.168.0.2:
[ミラー先]
(LANG=C md5sum --check /root/md5.txt > /root/md5-check.log 2>&1)
*もし、何か異常があれば "md5-check.log" の末尾に下記のようなメッセージがでる。
md5sum: WARNING: 23 of 2783 computed checksums did NOT match
その時は対象ファイルを探して対処する。
# cat md5-check.log | grep -v "OK" > md5-NG.log
2010年11月27日
DRBDとEXT3
時間ができたので、久しぶりの更新。
フェイルオーバーのテスト中に、DRBDデバイスが突然マウント出来なくなり、
その時の原因と対処方法をメモ。
微妙に条件を変え、フェイルオーバーのテストをしていたところ、突然失敗しだした。
設定を洗ってもおかしな所もなし。というよりもDRBDデバイス自体がマウントできなくて
こけているっぽい。。。
ここは落ち着いてログを確認。messagesを覗いてみると下記のようなメッセージを発見。
「 EXT3-fs warning: maximal mount count reached, running e2fsck is recommended 」
どうも、ファイルシステムの問題らしいということでGoogle先生に聞いてみた。
要約すると、EXT2/3はfsckしていないファイルシステムのマウント回数が決まっており、
上限に達してた為、エラーが出ていることが分かった。
で、対処方法としては大人しくfsckをするか、このカウント値をクリアしてやれば良いらしい。
fsckは時間がかかるのでカウントを下記のようにクリアした。
--------------------------------------------------
■ファイルシステム(この場合はDRBDディスク)のマウント回数を確認
設定値をオーバーしている
# tune2fs -l /dev/VolGroup00/LogVol02 | grep -i "mount count"
Mount count: 42
Maximum mount count: 39
--------------------------------------------------
■カウントをクリア または fsckを実施する
tune2fs -C 0 /dev/VolGroup00/LogVol02
--------------------------------------------------
■再度確認
# tune2fs -l /dev/VolGroup00/LogVol02 | grep -i "mount count"
Mount count: 0
Maximum mount count: 39
--------------------------------------------------
これで問題なくDRBDデバイスをマウントできるようになった。
デフォルトで39だったのだが、頻繁にマウント、アンマウントを繰り返す必要がある場合は、
この値をどうにかするか、定期的にクリアしてやったほうが良い気がする。
参考 : http://japan.zdnet.com/reference/filesystem/story/0,3800080418,20366480,00.htm
フェイルオーバーのテスト中に、DRBDデバイスが突然マウント出来なくなり、
その時の原因と対処方法をメモ。
微妙に条件を変え、フェイルオーバーのテストをしていたところ、突然失敗しだした。
設定を洗ってもおかしな所もなし。というよりもDRBDデバイス自体がマウントできなくて
こけているっぽい。。。
ここは落ち着いてログを確認。messagesを覗いてみると下記のようなメッセージを発見。
「 EXT3-fs warning: maximal mount count reached, running e2fsck is recommended 」
どうも、ファイルシステムの問題らしいということでGoogle先生に聞いてみた。
要約すると、EXT2/3はfsckしていないファイルシステムのマウント回数が決まっており、
上限に達してた為、エラーが出ていることが分かった。
で、対処方法としては大人しくfsckをするか、このカウント値をクリアしてやれば良いらしい。
fsckは時間がかかるのでカウントを下記のようにクリアした。
--------------------------------------------------
■ファイルシステム(この場合はDRBDディスク)のマウント回数を確認
設定値をオーバーしている
# tune2fs -l /dev/VolGroup00/LogVol02 | grep -i "mount count"
Mount count: 42
Maximum mount count: 39
--------------------------------------------------
■カウントをクリア または fsckを実施する
tune2fs -C 0 /dev/VolGroup00/LogVol02
--------------------------------------------------
■再度確認
# tune2fs -l /dev/VolGroup00/LogVol02 | grep -i "mount count"
Mount count: 0
Maximum mount count: 39
--------------------------------------------------
これで問題なくDRBDデバイスをマウントできるようになった。
デフォルトで39だったのだが、頻繁にマウント、アンマウントを繰り返す必要がある場合は、
この値をどうにかするか、定期的にクリアしてやったほうが良い気がする。
参考 : http://japan.zdnet.com/reference/filesystem/story/0,3800080418,20366480,00.htm
2010年09月22日
Nagios+PNP4Nagiosのインストールメモ
監視ツールの「Nagios(ナギオス)」を使って監視サーバーを構築するメモ。
この手のツールは運用経験者なら馴染みがあると思う。
Nagiosは細かく監視設定できて、Nagiosプラグインと呼ばれる監視スクリプト類も
相当な種類が公開されているので使いこなせればとても便利だ。
(その分設定が複雑なのだが...)
他には「ZABBIX(ザビックス)」、「Cacti(カクタイ)」等、OSSだけでも沢山ある。
特に、Nagiosをベースに色んなツールを統合した「GroundWork」というのがあり
こちらはWebブラウザ上から全部設定ができるのでCUIに不慣れな人は良いかも。
今回はCentOS5.5にNagios3とグラフツールのPNP4Nagiosを使って
とりあえず起動するところまで構築する。
--------------------------------------------------
■yumリポジトリの追加
標準のリポジトリだと足りないものもあるのでリポジトリを追加する
# rpm --import http://www.jasonlitka.com/media/RPM
# vi /etc/yum.repos.d/utterramblings.repo
---------------------------追加---------------------------------------
[utterramblings]
name=Jason’s Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
priority=0
-------------------------ここまで-------------------------------------
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
# rpm -Uvh rpmforge-release-0.5.1-1.el5.rf.i386.rpm
# vi /etc/yum.repos.d/rpmforge.repo
ここを
enabled=1
こう変えておく
enabled=0
--------------------------------------------------
■必要なパッケージのインストール
snmp,mysql,postgresql,sshの監視プラグイン依存パッケージ
# yum install net-snmp-devel mysql-devel postgresql84-devel openssl-devel sysstat
Nagios、PNP4の依存パッケージ
# yum install libjpeg-devel libxml2-devel libart_lgpl-devel \
glib glib-devel libpng-devel freetype-devel gd-devel zlib-devel
ApacheとPHPのインストール
PNP4がPHPの5.2系を必要とするため、外部リポジトリを指定する
# yum --enablerepo=utterramblings install httpd php php-gd
rrdtoolのインストール
これもPNP4で必要
# yum --enablerepo=rpmforge install rrdtool perl-rrdtool
--------------------------------------------------
■ソースコードのダウンロード
任意のディレクトリに全てダウンロードし展開しておく
Nagios本体
# wget http://sourceforge.net/projects/nagios/files/nagios-3.x/nagios-3.2.2/nagios-3.2.2.tar.gz/download
Nagiosプラグイン
# wget http://sourceforge.net/projects/nagiosplug/files/nagiosplug/1.4.15/nagios-plugins-1.4.15.tar.gz/download
PNP4Nagios
# wget http://sourceforge.net/projects/pnp4nagios/files/PNP-0.6/pnp4nagios-0.6.6.tar.gz/download
--------------------------------------------------
■専用ユーザの作成
# /usr/sbin/useradd -d /usr/local/nagios -s /sbin/nologin nagios
# /usr/sbin/usermod -G nagios apache ← WebUIから操作する上でApacheユーザを追加する必要がある
# chmod 755 /usr/local/nagios
--------------------------------------------------
■Nagiosのインストール
# cd nagios-3.2.2/
こんな感じでコンパイルしていく
# ./configure \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--with-command-user=nagios \
--with-command-group=nagios \
--with-httpd-conf=/etc/httpd/conf.d
# make all
本体、起動スクリプト、設定ファイル等をインストールしていく
# make install
# make install-init
# make install-commandmode
# make install-configu
# make install-webconf
--------------------------------------------------
■Nagiosプラグインのインストール
# cd nagios-plugins-1.4.15/
# ./configure \
--with-nagios-user=nagios \
--with-nagios-group=nagios
# make all
# make install
--------------------------------------------------
■PNP4のインストール
# ./configure \
--prefix=/usr/local/nagios/pnp4nagios \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--with-httpd-conf=/etc/httpd/conf.d
# make all
# make install
# make install-webconf
# make install-config
# make install-init
--------------------------------------------------
■PNP4の設定
# cd /usr/local/nagios/pnp4nagios/etc
サンプルコンフィグをリネームしておく
# for file in *.cfg-sample; do mv -i $file `echo $file | sed "s/-sample//g"`; done
# vi misccommands.cfg
下記箇所のコメントアウトを外す
==================================================
#
# Synchronous mode
#
define command {
command_name process-service-perfdata
command_line /usr/bin/perl /usr/local/nagios/pnp4nagios/libexec/process_perfdata.pl
}
define command {
command_name process-host-perfdata
command_line /usr/bin/perl /usr/local/nagios/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}
==================================================
# vi /usr/local/nagios/etc/objects/commands.cfg
下記箇所をコメントアウト
==================================================
# 'process-host-perfdata' command definition
#define command{
# command_name process-host-perfdata
# command_line /usr/bin/printf "%b" "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HOSTATTEMPT$\t$HOSTSTATETYPE$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$\n" >> /usr/local/nagios/var/host-perfdata.out
# }
# 'process-service-perfdata' command definition
#define command{
# command_name process-service-perfdata# command_line /usr/bin/printf "%b" "$LASTSERVICECHECK$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICESTATE$\t$SERVICEATTEMPT$\t$SERVICESTATETYPE$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$\n" >> /usr/local/nagios/var/service-perfdata.out
# }
==================================================
--------------------------------------------------
■Nagiosの設定
# cd /usr/local/nagios/etc
cgi.cfgの編集
# cp cgi.cfg cgi.cfg.orig && sed -e "s/nagiosadmin/nagios/g" cgi.cfg.orig > cgi.cfg
メイン設定ファイルの編集
# vi nagios.cfg
==================================================
下記2行を追記
# PNP4 Nagios
cfg_file=/usr/local/nagios/pnp4nagios/etc/misccommands.cfg
ここを
process_performance_data=0
こうする
process_performance_data=1
下記箇所のコメントアウトを外す
host_perfdata_command=process-host-perfdata
service_perfdata_command=process-service-perfdata
==================================================
ホスト監視設定の編集
下記二行を追加して監視データをグラフ化したい箇所に追記していく。
process_perf_data 1
action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
試しにロードアベレージのリソースデータをグラフ化するために設定しておく
# vi /usr/local/nagios/etc/objects/localhost.cfg
==================================================
define service{
use local-service ; Name of service template to use
host_name localhost
service_description Current Load
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
ココ→ process_perf_data 1
ココ→ action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}
==================================================
--------------------------------------------------
■Apacheの設定
BASIC認証の設定
ここではパスワードのみを設定しているが、必要に応じてアクセス元などを絞っておく
# htpasswd -c /usr/local/nagios/etc/.htpasswd nagios
New password: ←BASIC認証用のパスワード入力
Re-type new password: ←上記と同じものを
Apache用設定ファイルの修正
# cd /etc/httpd/conf.d/
# cp nagios.conf nagios.conf.orig && sed -e "s/htpasswd.users/.htpasswd/g" nagios.conf.orig > nagios.conf
# cp pnp4nagios.conf pnp4nagios.conf.orig && sed -e "s/htpasswd.users/.htpasswd/g" pnp4nagios.conf.orig > pnp4nagios.conf
Apacheの設定確認
# /etc/init.d/httpd configtest
Syntax OK
Apacheの起動
# /etc/init.d/httpd start
自動起動の設定
# /sbin/chkconfig httpd on
--------------------------------------------------
■PNP4の確認
ブラウザで http://サーバIP/pnp4nagios/ へアクセス
IDとパスワードはBASIC認証で設定したものを
下記画像のようになっていれば大丈夫
もし不足事項があれば赤く表示されるのでもう一度手順を見直す

問題がなければinstall.phpをリネームしておく
# cd /usr/local/nagios/pnp4nagios/share
# mv install.php install.php.orig
# chmod 600 install.php.orig
--------------------------------------------------
■Nagiosの確認
設定ファイルのチェック
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
警告およびエラーが出ないことを確認
==================================================
Total Warnings: 0
Total Errors: 0
==================================================
Nagiosの起動
# /etc/init.d/nagios start
起動確認
# ps -ef | grep nagios | grep -v grep
nagios 8176 1 0 17:42 ? 00:00:00 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
自動起動の設定
# /sbin/chkconfig nagios on
ブラウザで http://サーバIP/nagios/ へアクセス
TOP画面が表示されたあらサイドバーより「Services」を選択し、
監視ステータスを表示させる
緑は正常、黄色は警告、赤は致命的、オレンジは不明といった意味のステータス表示となる
丸で囲んだ赤いアイコンをクリックするとグラフを表示させることができる

グラフはサービスチェックと共に描画される為、初回は20分程度待ってから表示させてみる
下記画像のようにきちんと描画されていればOKだ

これで一通り基本的な構築は完了。
次回は監視設定について細かく書こうと思う。
この手のツールは運用経験者なら馴染みがあると思う。
Nagiosは細かく監視設定できて、Nagiosプラグインと呼ばれる監視スクリプト類も
相当な種類が公開されているので使いこなせればとても便利だ。
(その分設定が複雑なのだが...)
他には「ZABBIX(ザビックス)」、「Cacti(カクタイ)」等、OSSだけでも沢山ある。
特に、Nagiosをベースに色んなツールを統合した「GroundWork」というのがあり
こちらはWebブラウザ上から全部設定ができるのでCUIに不慣れな人は良いかも。
今回はCentOS5.5にNagios3とグラフツールのPNP4Nagiosを使って
とりあえず起動するところまで構築する。
--------------------------------------------------
■yumリポジトリの追加
標準のリポジトリだと足りないものもあるのでリポジトリを追加する
# rpm --import http://www.jasonlitka.com/media/RPM
# vi /etc/yum.repos.d/utterramblings.repo
---------------------------追加---------------------------------------
[utterramblings]
name=Jason’s Utter Ramblings Repo
baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
priority=0
-------------------------ここまで-------------------------------------
# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
# rpm -Uvh rpmforge-release-0.5.1-1.el5.rf.i386.rpm
# vi /etc/yum.repos.d/rpmforge.repo
ここを
enabled=1
こう変えておく
enabled=0
--------------------------------------------------
■必要なパッケージのインストール
snmp,mysql,postgresql,sshの監視プラグイン依存パッケージ
# yum install net-snmp-devel mysql-devel postgresql84-devel openssl-devel sysstat
Nagios、PNP4の依存パッケージ
# yum install libjpeg-devel libxml2-devel libart_lgpl-devel \
glib glib-devel libpng-devel freetype-devel gd-devel zlib-devel
ApacheとPHPのインストール
PNP4がPHPの5.2系を必要とするため、外部リポジトリを指定する
# yum --enablerepo=utterramblings install httpd php php-gd
rrdtoolのインストール
これもPNP4で必要
# yum --enablerepo=rpmforge install rrdtool perl-rrdtool
--------------------------------------------------
■ソースコードのダウンロード
任意のディレクトリに全てダウンロードし展開しておく
Nagios本体
# wget http://sourceforge.net/projects/nagios/files/nagios-3.x/nagios-3.2.2/nagios-3.2.2.tar.gz/download
Nagiosプラグイン
# wget http://sourceforge.net/projects/nagiosplug/files/nagiosplug/1.4.15/nagios-plugins-1.4.15.tar.gz/download
PNP4Nagios
# wget http://sourceforge.net/projects/pnp4nagios/files/PNP-0.6/pnp4nagios-0.6.6.tar.gz/download
--------------------------------------------------
■専用ユーザの作成
# /usr/sbin/useradd -d /usr/local/nagios -s /sbin/nologin nagios
# /usr/sbin/usermod -G nagios apache ← WebUIから操作する上でApacheユーザを追加する必要がある
# chmod 755 /usr/local/nagios
--------------------------------------------------
■Nagiosのインストール
# cd nagios-3.2.2/
こんな感じでコンパイルしていく
# ./configure \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--with-command-user=nagios \
--with-command-group=nagios \
--with-httpd-conf=/etc/httpd/conf.d
# make all
本体、起動スクリプト、設定ファイル等をインストールしていく
# make install
# make install-init
# make install-commandmode
# make install-configu
# make install-webconf
--------------------------------------------------
■Nagiosプラグインのインストール
# cd nagios-plugins-1.4.15/
# ./configure \
--with-nagios-user=nagios \
--with-nagios-group=nagios
# make all
# make install
--------------------------------------------------
■PNP4のインストール
# ./configure \
--prefix=/usr/local/nagios/pnp4nagios \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--with-httpd-conf=/etc/httpd/conf.d
# make all
# make install
# make install-webconf
# make install-config
# make install-init
--------------------------------------------------
■PNP4の設定
# cd /usr/local/nagios/pnp4nagios/etc
サンプルコンフィグをリネームしておく
# for file in *.cfg-sample; do mv -i $file `echo $file | sed "s/-sample//g"`; done
# vi misccommands.cfg
下記箇所のコメントアウトを外す
==================================================
#
# Synchronous mode
#
define command {
command_name process-service-perfdata
command_line /usr/bin/perl /usr/local/nagios/pnp4nagios/libexec/process_perfdata.pl
}
define command {
command_name process-host-perfdata
command_line /usr/bin/perl /usr/local/nagios/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
}
==================================================
# vi /usr/local/nagios/etc/objects/commands.cfg
下記箇所をコメントアウト
==================================================
# 'process-host-perfdata' command definition
#define command{
# command_name process-host-perfdata
# command_line /usr/bin/printf "%b" "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HOSTATTEMPT$\t$HOSTSTATETYPE$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$\n" >> /usr/local/nagios/var/host-perfdata.out
# }
# 'process-service-perfdata' command definition
#define command{
# command_name process-service-perfdata# command_line /usr/bin/printf "%b" "$LASTSERVICECHECK$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICESTATE$\t$SERVICEATTEMPT$\t$SERVICESTATETYPE$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$\n" >> /usr/local/nagios/var/service-perfdata.out
# }
==================================================
--------------------------------------------------
■Nagiosの設定
# cd /usr/local/nagios/etc
cgi.cfgの編集
# cp cgi.cfg cgi.cfg.orig && sed -e "s/nagiosadmin/nagios/g" cgi.cfg.orig > cgi.cfg
メイン設定ファイルの編集
# vi nagios.cfg
==================================================
下記2行を追記
# PNP4 Nagios
cfg_file=/usr/local/nagios/pnp4nagios/etc/misccommands.cfg
ここを
process_performance_data=0
こうする
process_performance_data=1
下記箇所のコメントアウトを外す
host_perfdata_command=process-host-perfdata
service_perfdata_command=process-service-perfdata
==================================================
ホスト監視設定の編集
下記二行を追加して監視データをグラフ化したい箇所に追記していく。
process_perf_data 1
action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
試しにロードアベレージのリソースデータをグラフ化するために設定しておく
# vi /usr/local/nagios/etc/objects/localhost.cfg
==================================================
define service{
use local-service ; Name of service template to use
host_name localhost
service_description Current Load
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
ココ→ process_perf_data 1
ココ→ action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
}
==================================================
--------------------------------------------------
■Apacheの設定
BASIC認証の設定
ここではパスワードのみを設定しているが、必要に応じてアクセス元などを絞っておく
# htpasswd -c /usr/local/nagios/etc/.htpasswd nagios
New password: ←BASIC認証用のパスワード入力
Re-type new password: ←上記と同じものを
Apache用設定ファイルの修正
# cd /etc/httpd/conf.d/
# cp nagios.conf nagios.conf.orig && sed -e "s/htpasswd.users/.htpasswd/g" nagios.conf.orig > nagios.conf
# cp pnp4nagios.conf pnp4nagios.conf.orig && sed -e "s/htpasswd.users/.htpasswd/g" pnp4nagios.conf.orig > pnp4nagios.conf
Apacheの設定確認
# /etc/init.d/httpd configtest
Syntax OK
Apacheの起動
# /etc/init.d/httpd start
自動起動の設定
# /sbin/chkconfig httpd on
--------------------------------------------------
■PNP4の確認
ブラウザで http://サーバIP/pnp4nagios/ へアクセス
IDとパスワードはBASIC認証で設定したものを
下記画像のようになっていれば大丈夫
もし不足事項があれば赤く表示されるのでもう一度手順を見直す

問題がなければinstall.phpをリネームしておく
# cd /usr/local/nagios/pnp4nagios/share
# mv install.php install.php.orig
# chmod 600 install.php.orig
--------------------------------------------------
■Nagiosの確認
設定ファイルのチェック
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
警告およびエラーが出ないことを確認
==================================================
Total Warnings: 0
Total Errors: 0
==================================================
Nagiosの起動
# /etc/init.d/nagios start
起動確認
# ps -ef | grep nagios | grep -v grep
nagios 8176 1 0 17:42 ? 00:00:00 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
自動起動の設定
# /sbin/chkconfig nagios on
ブラウザで http://サーバIP/nagios/ へアクセス
TOP画面が表示されたあらサイドバーより「Services」を選択し、
監視ステータスを表示させる
緑は正常、黄色は警告、赤は致命的、オレンジは不明といった意味のステータス表示となる
丸で囲んだ赤いアイコンをクリックするとグラフを表示させることができる

グラフはサービスチェックと共に描画される為、初回は20分程度待ってから表示させてみる
下記画像のようにきちんと描画されていればOKだ

これで一通り基本的な構築は完了。
次回は監視設定について細かく書こうと思う。
2010年09月19日
LinuxでPPTPクライアント
LinuxをPPTPクライアントとして動かした時のメモ。
自宅サーバを外部のPPTPサーバに接続する必要があったのでやってみた。
OSはCentOS5.4を使用した。RedHat系であれば似たような方法で行けると思う。
--------------------------------------------------
■使用するパッケージ
pptp-1.7.2-3.rhel5.i386.rpm
ppp-2.4.4-2.el5.i386.rpm(yumで最新版を入れてください)
--------------------------------------------------
■インストール
# wget http://sourceforge.net/projects/pptpclient/files/pptp/pptp-1.7.2/pptp-1.7.2-3.rhel5.i386.rpm/download?use_mirror=jaist
# yum -y install ppp
# rpm -Uvh pptp-1.7.2-3.rhel5.i386.rpm
--------------------------------------------------
■接続パスワードの設定
# vi /etc/ppp/chap-secrets
# client server secret IP addresses
user01 pptpd password *
※client=ユーザーID、secret=接続する際のパスワード
--------------------------------------------------
■クライアントスクリプトの作成
ここを参考に自分用に書き換えてみた。
# vi /etc/init.d/pptp-client
====================ここから======================
#!/bin/sh
#
# Setting
#
########################################
SERVER="192.168.1.10" ←PPTPサーバのIP or ホスト名
USER="user01" ←ユーザーID
HOSTNET="10.0.1.0/24" ←接続するプライベートネットワーク
########################################
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
case "$1" in
start)
if [ -z $(/sbin/pidof pppd) ]; then
echo "Starting pptp-client"
echo ""
/usr/sbin/pppd \
noauth nodetach noipdefault \
defaultroute \
name $USER \
require-mppe require-mppe-40 require-mppe-128 \
pty "/usr/sbin/pptp $SERVER --nolaunchpppd --loglevel 0" &
sleep 10
route add $HOSTNET dev ppp0
else
echo "pptp-client is already started"
fi
;;
stop)
if [ ! -z $(/sbin/pidof pppd) ]; then
echo "Shutting down pptp-client"
echo ""
/usr/bin/killall pppd
else
echo "pptp-client is not running"
fi
;;
status)
if [ ! -z $(/sbin/pidof pppd) ] ; then
echo -n "pptp-client (pid"
echo -n " `/sbin/pidof pppd`"
echo ") is running..."
else
echo "pptp-client is stopped"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
;;
esac
exit 0
====================ここまで======================
--------------------------------------------------
■接続テスト
# /etc/init.d/pptp-client start
これで問題なく接続できた。
対向のサーバにPINGを飛ばして確認してみる。
切断する時は下記のように
# /etc/init.d/pptp-client stop
--------------------------------------------------
■iptablesの設定
PPTP接続後はお互い自由に行き来できるようになる為、
必要なパケットのみを通すようにしたほうがセキュリティ上好ましい。
気をつける点としてはTCP1723ポートとGRE(47)プロトコルの許可設定を忘れずに。
自宅サーバを外部のPPTPサーバに接続する必要があったのでやってみた。
OSはCentOS5.4を使用した。RedHat系であれば似たような方法で行けると思う。
--------------------------------------------------
■使用するパッケージ
pptp-1.7.2-3.rhel5.i386.rpm
ppp-2.4.4-2.el5.i386.rpm(yumで最新版を入れてください)
--------------------------------------------------
■インストール
# wget http://sourceforge.net/projects/pptpclient/files/pptp/pptp-1.7.2/pptp-1.7.2-3.rhel5.i386.rpm/download?use_mirror=jaist
# yum -y install ppp
# rpm -Uvh pptp-1.7.2-3.rhel5.i386.rpm
--------------------------------------------------
■接続パスワードの設定
# vi /etc/ppp/chap-secrets
# client server secret IP addresses
user01 pptpd password *
※client=ユーザーID、secret=接続する際のパスワード
--------------------------------------------------
■クライアントスクリプトの作成
ここを参考に自分用に書き換えてみた。
# vi /etc/init.d/pptp-client
====================ここから======================
#!/bin/sh
#
# Setting
#
########################################
SERVER="192.168.1.10" ←PPTPサーバのIP or ホスト名
USER="user01" ←ユーザーID
HOSTNET="10.0.1.0/24" ←接続するプライベートネットワーク
########################################
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
case "$1" in
start)
if [ -z $(/sbin/pidof pppd) ]; then
echo "Starting pptp-client"
echo ""
/usr/sbin/pppd \
noauth nodetach noipdefault \
defaultroute \
name $USER \
require-mppe require-mppe-40 require-mppe-128 \
pty "/usr/sbin/pptp $SERVER --nolaunchpppd --loglevel 0" &
sleep 10
route add $HOSTNET dev ppp0
else
echo "pptp-client is already started"
fi
;;
stop)
if [ ! -z $(/sbin/pidof pppd) ]; then
echo "Shutting down pptp-client"
echo ""
/usr/bin/killall pppd
else
echo "pptp-client is not running"
fi
;;
status)
if [ ! -z $(/sbin/pidof pppd) ] ; then
echo -n "pptp-client (pid"
echo -n " `/sbin/pidof pppd`"
echo ") is running..."
else
echo "pptp-client is stopped"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
;;
esac
exit 0
====================ここまで======================
--------------------------------------------------
■接続テスト
# /etc/init.d/pptp-client start
これで問題なく接続できた。
対向のサーバにPINGを飛ばして確認してみる。
切断する時は下記のように
# /etc/init.d/pptp-client stop
--------------------------------------------------
■iptablesの設定
PPTP接続後はお互い自由に行き来できるようになる為、
必要なパケットのみを通すようにしたほうがセキュリティ上好ましい。
気をつける点としてはTCP1723ポートとGRE(47)プロトコルの許可設定を忘れずに。
2010年09月15日
Heartbeat+DRBDでHAクラスタの構築
Heartbeatを使ってDRBDの自動切換え(フェイルオーバー)を実現させるメモ。
Heartbeatを利用するとサーバがダウンした際に、代替機に処理を引き継ぎ
サービスのダウン時間の短縮と、処理を継続させることができるようになる。
同じようなもので「keepalived」というものもあり同じようなことができるが、
スクリプトを書いたりしなきゃならない。
その点、HeartbeatはDRBD用に書かれたスクリプトの
RA(リソースエージェント)が用意されていたり、
フェイルオーバーの条件を細かく設定できる。
欠点は設定が難しいという点かな。
ここではHeartbeatのインストールとアクティブ/スタンバイの設定をし、
管理するリソースとして「DRBD」、「VIP」、「MySQL」を設定してみる。
ちなみにHeartbeatは1系~3系まであり設定方法がバラバラなのだが、
今回は3系を使って構築する。
DRBDの時と同様に2台で設定する必要がある。
※3系ではheartbeatとpacemakerの二つのソフトウェアを利用する。
heartbeatはノード管理、pacemakerはリソース管理を担当する。
両者はもともと一つだったが、今は独立したものとなっている。
--------------------------------------------------
■サーバの構成について
heartbeatは死活確認のUDPパケットを対向ノードに送信し、お互いの死活を確認している。
この通信はとても重要な為、heartbeat専用のラインを用意するのが好ましい。
シリアルケーブルを使うとか、クロスケーブルで2台を直結するなど。
そんなの用意できないって場合は、スイッチなんかを経由しても良いが
その機器自体が障害ポイントとなる可能性もある。
ここではサービス専用のLANとは別に
heartbeat専用のラインにクロスケーブルを使った。
--------------------------------------------------
■heartbeat、pacemakerのインストール
yumリポジトリをサーバに追加して、yumでさくっとインストール
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# wget -O /etc/yum.repos.d/clusterlabs.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
# vi /etc/yum.repos.d/epel.repo
enabled=1 を enabled=0 に変える
# yum --enablerepo=epel --enablerepo=clusterlabs install pacemaker corosync heartbeat
--------------------------------------------------
■ha.cfの設定
heartbeatのメイン設定
# vi /etc/ha.d/ha.cf
crm on ←これをoffにするとV1モードでの運用になる
use_logd yes ←専用ログデーモンの有効化
conn_logd_time 60
debug 0
udpport 694 ←heartbeatパケットを待ち受けるポート
keepalive 2 ←heartbeatパケットを送信する間隔(秒)
warntime 20 ←相手からのパケットの受信がこれを超えると警告とする時間(秒)
deadtime 24 ←相手からのパケットの受信がこれを超えると故障とする時間(秒)
initdead 48 ←初回起動時のウェイト時間(秒)
bcast eth2 ←eth2側にheartbeatパケットをブロードキャストする設定
ping 10.0.1.254 ←pingでデフォルトゲートウェイを指定する
このpingが失敗すると相手にフェイルオーバーをする
node srv-01 ←対象のサーバをホスト名で指定
node srv-02 ←対象のサーバをホスト名で指定
watchdog /dev/watchdog ←watchdogを有効化しておく
respawn root /usr/lib/heartbeat/pingd -m 100 -a default_ping_set
--------------------------------------------------
■authkeysの設定
ノード間の認証設定
# vi /etc/ha.d/authkeys
auth 1
1 sha1 PASSWORD!
これをやり忘れると起動時に怒られます
# chmod 600 /etc/ha.d/authkeys
--------------------------------------------------
■logd.cfの設定
専用ログデーモンの設定
# vi /etc/logd.cf
logfile /var/log/ha-log
debugfile /var/log/ha-debug
logfacility none
--------------------------------------------------
■heartbeatの起動
# /etc/init.d/heartbeat start
--------------------------------------------------
■mysqlのデータディレクトリを変更
# vi /etc/my.cnf
これを
datadir=/var/lib/mysql
こんな感じに設定
datadir=/mnt/mysql
--------------------------------------------------
■リソースの設定(どちらか片方のサーバで)
crmコマンドを使って設定モードへ移動する
crmの使い方については「help」などで確認
#crm
crm(live)# configure edit
ここでheartbeatに管理させるリソースを設定していく。
下記のように設定するととりあえずは動くと思います。
実際には、コメントアウト部分、空行は入ってないです。
#現在参加しているノードリスト、自動で設定されるので編集する必要はない
node $id="122fc6ee-d2ab-4c86-b293-568dc0192006" srv-01
node $id="76243338-438e-4394-aa11-40c08420b438" srv-02
#DRBDの設定
primitive drbd_r0 ocf:linbit:drbd \
params drbd_resource="r0" \
op monitor interval="10s"
#DRBDデバイスのマウント設定
primitive filesystem ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/mnt" fstype="ext3" \
options="noatime" op monitor interval="10s"
#MySQLの設定
primitive mysql ocf:heartbeat:mysql \
params binary= "/usr/bin/mysqld_safe" datadir="/mnt/mysql" \
pid="/var/run/mysqld/mysqld.pid" \
op monitor interval="10s" \
meta is-managed="true"
#VIPの設定
primitive vip_10.0.1.100 ocf:heartbeat:IPaddr \
params ip="10.0.1.100" cidr_netmask="24" \
op monitor interval="10s"
#リソースをグループにまとめる設定
group Group1 vip_192.168.1.100 filesystem mysql \
meta is-managed="true" target-role="Started"
#DRBDのスプリットブレイン防止
ms ms_drbd_r0 drbd_r0 \
meta master-max="1" master-node-max="1" clone-max="2" \
clone-node-max="1" notify="true" is-managed="true" \
target-role="Started"
#srv-01をアクティブノードとする設定
location Locaton1 Group1 100: srv-01
location cli-prefer-Group1 Group1 \
rule $id="cli-prefer-rule-Group1" inf: #uname eq srv-01
#DRBDがアクティブとなっているホストで残りのリソース(Group1)を起動させる設定
colocation Colocation1 inf: Group1 ms_drbd_r0:Master
#リソースの起動順
order Order1 0: ms_drbd_r0:promote Group1:start
複雑で長い.....
設定には慣れが必要だ。
設定完了後はコンフィグを保存し反映させる
crm(live)# configure commit
ここで間違いがあるとエラーが出る
--------------------------------------------------
■設定したリソースの確認
設定モードのプロンプトから確認する場合
crm(live)# status
設定モードを抜けたあとの確認方法
# crm_mon -i 1
まずはheartbeatがきちんとリソースを管理できているかを確認する。
正しく設定されていないとリソースが上手く起動せず、failステータスとなってしまう。
ここで問題がなければ、ケーブルを抜いてみたりしてフェイルオーバーするかテストを行う。
省略した箇所もあるがインストール、設定はこんなものだろう。
過去に構築した時のメモを元に書いてあるのでもしかしたら間違いがあるかもしれないです。
そのときはすみません。
次回は実際の運用メモを書いていきたいと思う。
Heartbeatを利用するとサーバがダウンした際に、代替機に処理を引き継ぎ
サービスのダウン時間の短縮と、処理を継続させることができるようになる。
同じようなもので「keepalived」というものもあり同じようなことができるが、
スクリプトを書いたりしなきゃならない。
その点、HeartbeatはDRBD用に書かれたスクリプトの
RA(リソースエージェント)が用意されていたり、
フェイルオーバーの条件を細かく設定できる。
欠点は設定が難しいという点かな。
ここではHeartbeatのインストールとアクティブ/スタンバイの設定をし、
管理するリソースとして「DRBD」、「VIP」、「MySQL」を設定してみる。
ちなみにHeartbeatは1系~3系まであり設定方法がバラバラなのだが、
今回は3系を使って構築する。
DRBDの時と同様に2台で設定する必要がある。
※3系ではheartbeatとpacemakerの二つのソフトウェアを利用する。
heartbeatはノード管理、pacemakerはリソース管理を担当する。
両者はもともと一つだったが、今は独立したものとなっている。
--------------------------------------------------
■サーバの構成について
heartbeatは死活確認のUDPパケットを対向ノードに送信し、お互いの死活を確認している。
この通信はとても重要な為、heartbeat専用のラインを用意するのが好ましい。
シリアルケーブルを使うとか、クロスケーブルで2台を直結するなど。
そんなの用意できないって場合は、スイッチなんかを経由しても良いが
その機器自体が障害ポイントとなる可能性もある。
ここではサービス専用のLANとは別に
heartbeat専用のラインにクロスケーブルを使った。
--------------------------------------------------
■heartbeat、pacemakerのインストール
yumリポジトリをサーバに追加して、yumでさくっとインストール
# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
# wget -O /etc/yum.repos.d/clusterlabs.repo http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
# vi /etc/yum.repos.d/epel.repo
enabled=1 を enabled=0 に変える
# yum --enablerepo=epel --enablerepo=clusterlabs install pacemaker corosync heartbeat
--------------------------------------------------
■ha.cfの設定
heartbeatのメイン設定
# vi /etc/ha.d/ha.cf
crm on ←これをoffにするとV1モードでの運用になる
use_logd yes ←専用ログデーモンの有効化
conn_logd_time 60
debug 0
udpport 694 ←heartbeatパケットを待ち受けるポート
keepalive 2 ←heartbeatパケットを送信する間隔(秒)
warntime 20 ←相手からのパケットの受信がこれを超えると警告とする時間(秒)
deadtime 24 ←相手からのパケットの受信がこれを超えると故障とする時間(秒)
initdead 48 ←初回起動時のウェイト時間(秒)
bcast eth2 ←eth2側にheartbeatパケットをブロードキャストする設定
ping 10.0.1.254 ←pingでデフォルトゲートウェイを指定する
このpingが失敗すると相手にフェイルオーバーをする
node srv-01 ←対象のサーバをホスト名で指定
node srv-02 ←対象のサーバをホスト名で指定
watchdog /dev/watchdog ←watchdogを有効化しておく
respawn root /usr/lib/heartbeat/pingd -m 100 -a default_ping_set
--------------------------------------------------
■authkeysの設定
ノード間の認証設定
# vi /etc/ha.d/authkeys
auth 1
1 sha1 PASSWORD!
これをやり忘れると起動時に怒られます
# chmod 600 /etc/ha.d/authkeys
--------------------------------------------------
■logd.cfの設定
専用ログデーモンの設定
# vi /etc/logd.cf
logfile /var/log/ha-log
debugfile /var/log/ha-debug
logfacility none
--------------------------------------------------
■heartbeatの起動
# /etc/init.d/heartbeat start
--------------------------------------------------
■mysqlのデータディレクトリを変更
# vi /etc/my.cnf
これを
datadir=/var/lib/mysql
こんな感じに設定
datadir=/mnt/mysql
--------------------------------------------------
■リソースの設定(どちらか片方のサーバで)
crmコマンドを使って設定モードへ移動する
crmの使い方については「help」などで確認
#crm
crm(live)# configure edit
ここでheartbeatに管理させるリソースを設定していく。
下記のように設定するととりあえずは動くと思います。
実際には、コメントアウト部分、空行は入ってないです。
#現在参加しているノードリスト、自動で設定されるので編集する必要はない
node $id="122fc6ee-d2ab-4c86-b293-568dc0192006" srv-01
node $id="76243338-438e-4394-aa11-40c08420b438" srv-02
#DRBDの設定
primitive drbd_r0 ocf:linbit:drbd \
params drbd_resource="r0" \
op monitor interval="10s"
#DRBDデバイスのマウント設定
primitive filesystem ocf:heartbeat:Filesystem \
params device="/dev/drbd0" directory="/mnt" fstype="ext3" \
options="noatime" op monitor interval="10s"
#MySQLの設定
primitive mysql ocf:heartbeat:mysql \
params binary= "/usr/bin/mysqld_safe" datadir="/mnt/mysql" \
pid="/var/run/mysqld/mysqld.pid" \
op monitor interval="10s" \
meta is-managed="true"
#VIPの設定
primitive vip_10.0.1.100 ocf:heartbeat:IPaddr \
params ip="10.0.1.100" cidr_netmask="24" \
op monitor interval="10s"
#リソースをグループにまとめる設定
group Group1 vip_192.168.1.100 filesystem mysql \
meta is-managed="true" target-role="Started"
#DRBDのスプリットブレイン防止
ms ms_drbd_r0 drbd_r0 \
meta master-max="1" master-node-max="1" clone-max="2" \
clone-node-max="1" notify="true" is-managed="true" \
target-role="Started"
#srv-01をアクティブノードとする設定
location Locaton1 Group1 100: srv-01
location cli-prefer-Group1 Group1 \
rule $id="cli-prefer-rule-Group1" inf: #uname eq srv-01
#DRBDがアクティブとなっているホストで残りのリソース(Group1)を起動させる設定
colocation Colocation1 inf: Group1 ms_drbd_r0:Master
#リソースの起動順
order Order1 0: ms_drbd_r0:promote Group1:start
複雑で長い.....
設定には慣れが必要だ。
設定完了後はコンフィグを保存し反映させる
crm(live)# configure commit
ここで間違いがあるとエラーが出る
--------------------------------------------------
■設定したリソースの確認
設定モードのプロンプトから確認する場合
crm(live)# status
設定モードを抜けたあとの確認方法
# crm_mon -i 1
まずはheartbeatがきちんとリソースを管理できているかを確認する。
正しく設定されていないとリソースが上手く起動せず、failステータスとなってしまう。
ここで問題がなければ、ケーブルを抜いてみたりしてフェイルオーバーするかテストを行う。
省略した箇所もあるがインストール、設定はこんなものだろう。
過去に構築した時のメモを元に書いてあるのでもしかしたら間違いがあるかもしれないです。
そのときはすみません。
次回は実際の運用メモを書いていきたいと思う。
2010年09月14日
DRBDでHAクラスタの構築
DRBDのインストールと設定のメモ。
DRBDとはネットワーク経由でディスクをミラーリングしてくれるソフトウェアだ。
簡単に言うと2台のサーバでRAID1を組むような感覚になる。
DRBDで作成したデータ領域は普通のHDDとして認識するので
そこをマウントしてデータベースのデータ領域に使うもよし、
メールスプールに使うもよしといった具合になる。
動作にはLinuxカーネルを必要とするので、ここではCentOS5を使い、
もっともベーシックなアクティブ/スタンバイ構成で設定してみる。
下記の設定は2台の機器で行う。
--------------------------------------------------
■DRBD専用の領域を確保
DRBDは専用に、ディスク空き領域をを確保しておく必要がある。
OSインストール前なら比較的設計しやすいが、既存へのインストールだと
新しくディスクを追加するほか無いかな。
--------------------------------------------------
■RPMの作成
DRBDはyumでもインストールできるがバージョンが古いのでソースコードよりRPMを作成する
まずはkernel-develのインストール
# yum install kernel-devel
本家サイトよりソースコードをダウンロードしてRPMを作成する
# wget http://oss.linbit.com/drbd/8.3/drbd-8.3.7.tar.gz
# tar xfz drbd-8.3.7.tar.gz
# cd drbd-8.3.7/
# ./configure
# make rpm
※下記パッケージが作成される
/usr/src/redhat/RPMS/i386/drbd-debuginfo-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-xen-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-utils-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-pacemaker-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-heartbeat-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-bash-completion-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-udev-8.3.7-1.i386.rpm
# make km-rpm
※下記パッケージが作成される
/usr/src/redhat/RPMS/i386/drbd-km-debuginfo-8.3.7-12.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-km-2.6.18_164.15.1.el5xen-8.3.7-12.i386.rpm
--------------------------------------------------
■インストール
# rpm -Uvh \
drbd-8.3.7-1.i386.rpm \
drbd-km-2.6.18_164.11.1.el5-8.3.7-12.i386.rpm \
drbd-utils-8.3.7-1.i386.rpm \
drbd-bash-completion-8.3.7-1.i386.rpm \
drbd-xen-8.3.7-1.i386.rpm \
drbd-pacemaker-8.3.7-1.i386.rpm \
drbd-heartbeat-8.3.7-1.i386.rpm \
drbd-udev-8.3.7-1.i386.rpm
--------------------------------------------------
■kernel、DRBDをyumの対象から除外する
# vi /etc/yum.conf
※追記
exclude=kernel* drbd* kmod-drbd*
--------------------------------------------------
■ホスト名の名前解決
DNS、hostsを使って名前解決をできるようにしておく
今回はお手軽にhostsで設定
# vi /etc/hosts
192.168.1.1 srv-01
192.168.1.2 srv-02
--------------------------------------------------
■DRBDの設定
global { usage-count yes; }← これを有効にするとLinbit社の利用統計にカウントされるようになります
common { syncer { rate 10M; } }
resource r0 {
protocol C; ← 同期方法の指定(※1)
startup {
degr-wfc-timeout 120; ← 対向ノードのタイムアウト値(秒)
}
net {
cram-hmac-alg sha1; ← 認証の方式
shared-secret "password"; ← 認証用パスフレーズ
}
on srv-01 { ← "uname -n"で表示されるホスト名
device /dev/drbd0; ← 使用するデバイス名
disk /dev/VolGroup00/LogVol02; ← 使用するディスク名
address 192.168.1.1:7789; ← IPとポート
meta-disk internal;
}
on srv-02 { ← "uname -n"で表示されるホスト名
device /dev/drbd0; ← 使用するデバイス名
disk /dev/VolGroup00/LogVol02; ← 使用するディスク名
address 192.168.1.2:7789; ← IPとポート
meta-disk internal;
}
}
※1
A: ローカルディスクとローカルTCP送信バッファにデータを書き込んだら
ディスクへの書き込みが完了したと判断する。
B: ローカルディスクとリモートバッファキャッシュにデータを書き込んだら
ディスクへの書き込みが完了したと判断する。
C: ローカルディスクとリモートディスクの両方にデータを書き込んだら
ディスクへの書き込みが完了したと判断する。
--------------------------------------------------
■DRBD専用デバイスの作成
ディスクにDRBD専用領域を作成する
詳細は長くなるのでコマンドだけ、パラメータは環境に合わせる
空き領域の確認
# fdisk -l
空き領域をフォーマット
# fdisk /dev/sda
PV(物理ボリューム)の作成
# pvcreate /dev/sda3
作成したPVをVG(ボリュームグループ)へ追加
# vgextend VolGroup00 /dev/sda3
確認
# vgdisplay -v VolGroup00
30GBの領域をLogVol02という名前でLV(論理ボリューム)を作成
# lvcreate -L 30G -n LogVol02 VolGroup00
--------------------------------------------------
■DRBDメタデータ作成
# drbdadm create-md r0
※質問には全てyesで応答
--------------------------------------------------
■DRBDの起動
アクティブ、スタンバイの順に起動させる
# /etc/rc.d/init.d/drbd start
--------------------------------------------------
■DRBDデバイスの作成(アクティブ側のみ)
データの初期同期(容量により時間がかかる)
# drbdadm -- --overwrite-data-of-peer primary all
同期ステータスの確認方法
# /etc/init.d/drbd status
※同期中の表示
--------------------------------------------------------------------------------------------------------
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:48
m:res cs st ds p mounted fstype
0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C
... sync'ed: 7.3% (942492/1015740)K ← 同期中
※同期完了の表示
--------------------------------------------------------------------------------------------------------
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:48
m:res cs st ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C ← 同期完了
--------------------------------------------------------------------------------------------------------
DRBDデバイスにファイルシステムの作成
# mkfs -t ext3 /dev/drbd0
--------------------------------------------------
■動作確認
DRBDデバイスをマウントしてみる
マウントできるのはアクティブ側のみ、
スタンバイ側でマウントしようとすると怒られます。
# mount /dev/drbd0 /mnt
ついでに何かを書き込んでみる
# touch test.txt
# ls /mnt
test.txt
スタンバイ側でもマウントしてみるには下記のように
アクティブ側でマウント解除
# umount /mnt
プライマリからスレーブへ降格
# drbdadm secondary all
スタンバイ側でプライマリに昇格
# drbdadm primary all
マウント
# mount /dev/drbd0 /mnt
ちゃんと同期されているかを確認
# ls /mnt
test.txt
これでDRBDのインストール、設定は完了。
めでたくデータの可用性が向上したわけだが、このままでは切り替えについては手動です。
アクティブがこけると切り替えるまでは落ちたままなので全体の可用性としてはあまり向上してないです。
そこで次回はアクティブ/スタンバイを自動で切り替えてくれるHeartbeatを紹介してみます。
DRBDとはネットワーク経由でディスクをミラーリングしてくれるソフトウェアだ。
簡単に言うと2台のサーバでRAID1を組むような感覚になる。
DRBDで作成したデータ領域は普通のHDDとして認識するので
そこをマウントしてデータベースのデータ領域に使うもよし、
メールスプールに使うもよしといった具合になる。
動作にはLinuxカーネルを必要とするので、ここではCentOS5を使い、
もっともベーシックなアクティブ/スタンバイ構成で設定してみる。
下記の設定は2台の機器で行う。
--------------------------------------------------
■DRBD専用の領域を確保
DRBDは専用に、ディスク空き領域をを確保しておく必要がある。
OSインストール前なら比較的設計しやすいが、既存へのインストールだと
新しくディスクを追加するほか無いかな。
--------------------------------------------------
■RPMの作成
DRBDはyumでもインストールできるがバージョンが古いのでソースコードよりRPMを作成する
まずはkernel-develのインストール
# yum install kernel-devel
本家サイトよりソースコードをダウンロードしてRPMを作成する
# wget http://oss.linbit.com/drbd/8.3/drbd-8.3.7.tar.gz
# tar xfz drbd-8.3.7.tar.gz
# cd drbd-8.3.7/
# ./configure
# make rpm
※下記パッケージが作成される
/usr/src/redhat/RPMS/i386/drbd-debuginfo-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-xen-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-utils-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-pacemaker-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-heartbeat-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-bash-completion-8.3.7-1.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-udev-8.3.7-1.i386.rpm
# make km-rpm
※下記パッケージが作成される
/usr/src/redhat/RPMS/i386/drbd-km-debuginfo-8.3.7-12.i386.rpm
/usr/src/redhat/RPMS/i386/drbd-km-2.6.18_164.15.1.el5xen-8.3.7-12.i386.rpm
--------------------------------------------------
■インストール
# rpm -Uvh \
drbd-8.3.7-1.i386.rpm \
drbd-km-2.6.18_164.11.1.el5-8.3.7-12.i386.rpm \
drbd-utils-8.3.7-1.i386.rpm \
drbd-bash-completion-8.3.7-1.i386.rpm \
drbd-xen-8.3.7-1.i386.rpm \
drbd-pacemaker-8.3.7-1.i386.rpm \
drbd-heartbeat-8.3.7-1.i386.rpm \
drbd-udev-8.3.7-1.i386.rpm
--------------------------------------------------
■kernel、DRBDをyumの対象から除外する
# vi /etc/yum.conf
※追記
exclude=kernel* drbd* kmod-drbd*
--------------------------------------------------
■ホスト名の名前解決
DNS、hostsを使って名前解決をできるようにしておく
今回はお手軽にhostsで設定
# vi /etc/hosts
192.168.1.1 srv-01
192.168.1.2 srv-02
--------------------------------------------------
■DRBDの設定
global { usage-count yes; }← これを有効にするとLinbit社の利用統計にカウントされるようになります
common { syncer { rate 10M; } }
resource r0 {
protocol C; ← 同期方法の指定(※1)
startup {
degr-wfc-timeout 120; ← 対向ノードのタイムアウト値(秒)
}
net {
cram-hmac-alg sha1; ← 認証の方式
shared-secret "password"; ← 認証用パスフレーズ
}
on srv-01 { ← "uname -n"で表示されるホスト名
device /dev/drbd0; ← 使用するデバイス名
disk /dev/VolGroup00/LogVol02; ← 使用するディスク名
address 192.168.1.1:7789; ← IPとポート
meta-disk internal;
}
on srv-02 { ← "uname -n"で表示されるホスト名
device /dev/drbd0; ← 使用するデバイス名
disk /dev/VolGroup00/LogVol02; ← 使用するディスク名
address 192.168.1.2:7789; ← IPとポート
meta-disk internal;
}
}
※1
A: ローカルディスクとローカルTCP送信バッファにデータを書き込んだら
ディスクへの書き込みが完了したと判断する。
B: ローカルディスクとリモートバッファキャッシュにデータを書き込んだら
ディスクへの書き込みが完了したと判断する。
C: ローカルディスクとリモートディスクの両方にデータを書き込んだら
ディスクへの書き込みが完了したと判断する。
--------------------------------------------------
■DRBD専用デバイスの作成
ディスクにDRBD専用領域を作成する
詳細は長くなるのでコマンドだけ、パラメータは環境に合わせる
空き領域の確認
# fdisk -l
空き領域をフォーマット
# fdisk /dev/sda
PV(物理ボリューム)の作成
# pvcreate /dev/sda3
作成したPVをVG(ボリュームグループ)へ追加
# vgextend VolGroup00 /dev/sda3
確認
# vgdisplay -v VolGroup00
30GBの領域をLogVol02という名前でLV(論理ボリューム)を作成
# lvcreate -L 30G -n LogVol02 VolGroup00
--------------------------------------------------
■DRBDメタデータ作成
# drbdadm create-md r0
※質問には全てyesで応答
--------------------------------------------------
■DRBDの起動
アクティブ、スタンバイの順に起動させる
# /etc/rc.d/init.d/drbd start
--------------------------------------------------
■DRBDデバイスの作成(アクティブ側のみ)
データの初期同期(容量により時間がかかる)
# drbdadm -- --overwrite-data-of-peer primary all
同期ステータスの確認方法
# /etc/init.d/drbd status
※同期中の表示
--------------------------------------------------------------------------------------------------------
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:48
m:res cs st ds p mounted fstype
0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C
... sync'ed: 7.3% (942492/1015740)K ← 同期中
※同期完了の表示
--------------------------------------------------------------------------------------------------------
drbd driver loaded OK; device status:
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-i386-build, 2008-10-03 11:42:48
m:res cs st ds p mounted fstype
0:r0 Connected Primary/Secondary UpToDate/UpToDate C ← 同期完了
--------------------------------------------------------------------------------------------------------
DRBDデバイスにファイルシステムの作成
# mkfs -t ext3 /dev/drbd0
--------------------------------------------------
■動作確認
DRBDデバイスをマウントしてみる
マウントできるのはアクティブ側のみ、
スタンバイ側でマウントしようとすると怒られます。
# mount /dev/drbd0 /mnt
ついでに何かを書き込んでみる
# touch test.txt
# ls /mnt
test.txt
スタンバイ側でもマウントしてみるには下記のように
アクティブ側でマウント解除
# umount /mnt
プライマリからスレーブへ降格
# drbdadm secondary all
スタンバイ側でプライマリに昇格
# drbdadm primary all
マウント
# mount /dev/drbd0 /mnt
ちゃんと同期されているかを確認
# ls /mnt
test.txt
これでDRBDのインストール、設定は完了。
めでたくデータの可用性が向上したわけだが、このままでは切り替えについては手動です。
アクティブがこけると切り替えるまでは落ちたままなので全体の可用性としてはあまり向上してないです。
そこで次回はアクティブ/スタンバイを自動で切り替えてくれるHeartbeatを紹介してみます。
2010年09月14日
CentOSのネットワークインストール
OSインストールでハマッたのでその時の対処法をメモ。
データセンターでのOSインストール作業で、下記のような状況に陥りました。
ちなみにOSはCentOS5.4です。
1. サーバのDVDドライブが壊れているのかメディアを認識せず
2. 予備の外付けドライブを利用するとCDブート後に「CD Not found」と出てエラーになる
3. 保険で持ってきた別のインストールメディアに変えてやっても同じ現象が...
ドライブ、インストールメディアについては過去に何度か使っているから問題ないと思うし、
何でかなーと思いつつも、早くインストールをしなければと思いネットワークインストールへ変更することにしました。
幸いにもCDブートはするわけだから、ファイルの読み出し先をCDからHTTP経由に変えて、
TCPの設定でIPを振って、ネットワーク経由でインストールを開始。
とは言ってもファイルをネット上から取ってくるだけなので特に特別なことは無いです。
しいて言うなら予想外の無駄なパケットを流してしまったくらい。
それは置いといて、とりあえず無事インストール完了。よかったよかった。
あとから調べてみたら同じような症状が起きている人を発見。
コメントでISOをもう一回落としてチェックしろと言っているけど...うーん。
実はCentOS5.4のインストールについては過去にも大ハマリした経験が。
そのときはとある仮想ハイパーバイザの仕様だったんだけど個人的に相性が悪い気がする。
データセンターでのOSインストール作業で、下記のような状況に陥りました。
ちなみにOSはCentOS5.4です。
1. サーバのDVDドライブが壊れているのかメディアを認識せず
2. 予備の外付けドライブを利用するとCDブート後に「CD Not found」と出てエラーになる
3. 保険で持ってきた別のインストールメディアに変えてやっても同じ現象が...
ドライブ、インストールメディアについては過去に何度か使っているから問題ないと思うし、
何でかなーと思いつつも、早くインストールをしなければと思いネットワークインストールへ変更することにしました。
幸いにもCDブートはするわけだから、ファイルの読み出し先をCDからHTTP経由に変えて、
TCPの設定でIPを振って、ネットワーク経由でインストールを開始。
とは言ってもファイルをネット上から取ってくるだけなので特に特別なことは無いです。
しいて言うなら予想外の無駄なパケットを流してしまったくらい。
それは置いといて、とりあえず無事インストール完了。よかったよかった。
あとから調べてみたら同じような症状が起きている人を発見。
コメントでISOをもう一回落としてチェックしろと言っているけど...うーん。
実はCentOS5.4のインストールについては過去にも大ハマリした経験が。
そのときはとある仮想ハイパーバイザの仕様だったんだけど個人的に相性が悪い気がする。
2010年09月13日
Vyattaをさわってみた
Vyatta(ヴィヤッタ)というソフトウェアルーターをさわってみた。
Linux(Debian)をベースに各種OSSを使って構成しているみたいだ。
(Quaggaをはじめiptables、net-snmp、keepalived等)
今回は仮想アプライアンス版(ESX)を使った。
真面目に設定とかしていないのでここでは使用感の感想のみ。
CLIはまあ普通かな。ただコンフィグが確認しづらいかも。
GUIはごちゃごちゃしていて使いづらいなーという印象、ただしこれは慣れの問題かと。
設定はCLIで確認はGUIってのが良いのかも。
利用シーンとしてはクラウド環境で重宝しそうだな。ハードをあまり意識しなくても良いし。
そのうち真剣にいじってみます。
Linux(Debian)をベースに各種OSSを使って構成しているみたいだ。
(Quaggaをはじめiptables、net-snmp、keepalived等)
今回は仮想アプライアンス版(ESX)を使った。
真面目に設定とかしていないのでここでは使用感の感想のみ。
CLIはまあ普通かな。ただコンフィグが確認しづらいかも。
GUIはごちゃごちゃしていて使いづらいなーという印象、ただしこれは慣れの問題かと。
設定はCLIで確認はGUIってのが良いのかも。
利用シーンとしてはクラウド環境で重宝しそうだな。ハードをあまり意識しなくても良いし。
そのうち真剣にいじってみます。
2010年09月10日
LinuxでPPTPサーバの構築
LinuxとPPTPを使ってVPN環境を構築した時のメモ。
メンテナンスなんかで、リモートサーバにログインしようと思ったときに、
踏み台を経由したり、ポートフォワードをしないとアクセスできない環境があると思うんですが、
これって台数が増えるとアクセスするだけでも面倒なんですよね。
もちろんある程度規模が大きいと管理用のNWなんてものがあったりするんですが、
数台程度であれば用意されていないことも。
VPNがあればなーってときにこの方法を使ってます。
ここでは、サーバにCentOS5.4、クライアントにWinXPを使って説明します。
CentOSなら5系、WindowsはXP、2003、7で動作確認しています。
以下の設定は環境に合わせて適当に読み替えてください。
--------------------------------------------------
■使用するパッケージ
pptpd-1.3.4-1.rhel5.1.i386.rpm
ppp-2.4.4-2.el5.i386.rpm(yumで最新版を入れてください)
--------------------------------------------------
■インストール
# yum -y install ppp
# rpm -ivh pptpd-1.3.4-1.rhel5.1.i386.rpm
--------------------------------------------------
■pptpd.confの設定
# vi /etc/pptpd.conf
localip 192.168.1.10 ← サーバIP
remoteip 192.168.1.50 ← クライアントに割り振るIP
--------------------------------------------------
■options.pptpdの設定
# vi /etc/ppp/options.pptpd
name pptpd ← pptpサーバ名
ms-dns 192.168.1.10 ← 内部DNSを使いたい場合
--------------------------------------------------
■chap-secretsの設定
# vi /etc/ppp/chap-secrets
# client server secret IP addresses
user01 pptpd password *
※client=ユーザーID、secret=接続する際のパスワード
--------------------------------------------------
■LAN内のサーバにアクセスできるようにする
PPTPサーバでパケット転送を有効にします。
# vi /etc/sysctl.conf
ここを
net.ipv4.ip_forward = 0
こう変更する
net.ipv4.ip_forward = 1
設定反映
#sysctl -p
確認
# cat /proc/sys/net/ipv4/ip_forward
1 ←有効になった
--------------------------------------------------
■pptpdの起動
# /etc/init.d/pptpd start
# /sbin/chkconfig pptpd on
--------------------------------------------------
■FWフィルタの変更
PPTPとGREの通信を許可設定します。
TCPの1723ポートと、GRE(47)の2048ポートを許可してください。
自宅環境はNetscreenでNAPTしているので↓のような感じで設定しています。
※PPTPのサービス登録(PPTPとGREを統合)
set service "PPTP + GRE" protocol tcp src-port 0-65535 dst-port 1723-1723
set service "PPTP + GRE" + 47 src-port 2048-2048 dst-port 2048-2048
※VIPの設定
set interface untrust vip untrust 1723 "PPTP + GRE" 192.168.1.10
※ポリシーの追加(GRE 2048をPPTPサーバへNAPTする)
set policy id 16 name "PPTP" from "Untrust" to "Trust" "ANY" "VIP(untrust)" "PPTP + GRE" nat dst ip 192.168.1.10 port 2048 permit log
--------------------------------------------------
これで一通り作業は完了です。
WinXPにPPTPクライアントの設定をして接続テストをしてみます。
クライアントの設定はこことかが分かりやすいです。
接続が成功したら、対向側のサーバ郡にpingなどを打って確認します。
ここで接続ができない場合には下記のようなことが考えられます。
・pptpの設定ミス
・サーバ側のフィルタ設定ミス
・クライアント側のフィルタ設定ミス
それでも駄目な場合は、
サーバのポートが開いているかを確認したり、パケットダンプをしてみてください。
きっと手がかりが見つかるはずです。
メンテナンスなんかで、リモートサーバにログインしようと思ったときに、
踏み台を経由したり、ポートフォワードをしないとアクセスできない環境があると思うんですが、
これって台数が増えるとアクセスするだけでも面倒なんですよね。
もちろんある程度規模が大きいと管理用のNWなんてものがあったりするんですが、
数台程度であれば用意されていないことも。
VPNがあればなーってときにこの方法を使ってます。
ここでは、サーバにCentOS5.4、クライアントにWinXPを使って説明します。
CentOSなら5系、WindowsはXP、2003、7で動作確認しています。
以下の設定は環境に合わせて適当に読み替えてください。
--------------------------------------------------
■使用するパッケージ
pptpd-1.3.4-1.rhel5.1.i386.rpm
ppp-2.4.4-2.el5.i386.rpm(yumで最新版を入れてください)
--------------------------------------------------
■インストール
# yum -y install ppp
# rpm -ivh pptpd-1.3.4-1.rhel5.1.i386.rpm
--------------------------------------------------
■pptpd.confの設定
# vi /etc/pptpd.conf
localip 192.168.1.10 ← サーバIP
remoteip 192.168.1.50 ← クライアントに割り振るIP
--------------------------------------------------
■options.pptpdの設定
# vi /etc/ppp/options.pptpd
name pptpd ← pptpサーバ名
ms-dns 192.168.1.10 ← 内部DNSを使いたい場合
--------------------------------------------------
■chap-secretsの設定
# vi /etc/ppp/chap-secrets
# client server secret IP addresses
user01 pptpd password *
※client=ユーザーID、secret=接続する際のパスワード
--------------------------------------------------
■LAN内のサーバにアクセスできるようにする
PPTPサーバでパケット転送を有効にします。
# vi /etc/sysctl.conf
ここを
net.ipv4.ip_forward = 0
こう変更する
net.ipv4.ip_forward = 1
設定反映
#sysctl -p
確認
# cat /proc/sys/net/ipv4/ip_forward
1 ←有効になった
--------------------------------------------------
■pptpdの起動
# /etc/init.d/pptpd start
# /sbin/chkconfig pptpd on
--------------------------------------------------
■FWフィルタの変更
PPTPとGREの通信を許可設定します。
TCPの1723ポートと、GRE(47)の2048ポートを許可してください。
自宅環境はNetscreenでNAPTしているので↓のような感じで設定しています。
※PPTPのサービス登録(PPTPとGREを統合)
set service "PPTP + GRE" protocol tcp src-port 0-65535 dst-port 1723-1723
set service "PPTP + GRE" + 47 src-port 2048-2048 dst-port 2048-2048
※VIPの設定
set interface untrust vip untrust 1723 "PPTP + GRE" 192.168.1.10
※ポリシーの追加(GRE 2048をPPTPサーバへNAPTする)
set policy id 16 name "PPTP" from "Untrust" to "Trust" "ANY" "VIP(untrust)" "PPTP + GRE" nat dst ip 192.168.1.10 port 2048 permit log
--------------------------------------------------
これで一通り作業は完了です。
WinXPにPPTPクライアントの設定をして接続テストをしてみます。
クライアントの設定はこことかが分かりやすいです。
接続が成功したら、対向側のサーバ郡にpingなどを打って確認します。
ここで接続ができない場合には下記のようなことが考えられます。
・pptpの設定ミス
・サーバ側のフィルタ設定ミス
・クライアント側のフィルタ設定ミス
それでも駄目な場合は、
サーバのポートが開いているかを確認したり、パケットダンプをしてみてください。
きっと手がかりが見つかるはずです。


