2009年4月28日火曜日

MySQLで Host '...' is blocked エラー

どうも俺です。
先日とあるサーバのログにMySQLが吐き出したとおぼしき
Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
というエラーが出ていました。

これはMySQLが接続エラーを数回繰り返し出すと、そのホストからの接続を遮断するという機能によるものらしいです。
参照:http://dev.mysql.com/doc/refman/4.1/ja/blocked-host.html

この場合はログに書いてある通り
# mysqladmin flush-hosts
で解決できます。
デフォルトでは10回の接続エラーでなるようですが、変更する場合は
# mysqld_safe -O max_connect_errors=10000 &
を実行して変更できます。

パスワードなどの認証エラーも考えられますが、分かりにくいのがネットワーク関連のエラーで接続できない場合などです。
その場合は、値を増やしておく方が良いかもしれません。

2009年4月15日水曜日

mysqldumpで文字化けデータを頑張ってダンプ&リストア

どうも俺です。
昨日に引き続きMySQL関連のテーマをメモします。

mysqldumpでデータをダンプ&別サーバへリストアなんて事あると思います。
その時に文字化けで少しハマったのでメモしておきます。

色んなブログにも記されていますが、mysqldumpでデータを取得すると自動でutf8で取得されてしまいます。
利用しているデータベースがsjis(cp932)を利用しているとします。
mysql> show variables like '%char%';
+--------------------------+---------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------+
| character_set_client | cp932 |
| character_set_connection | cp932 |
| character_set_database | cp932 |
| character_set_filesystem | binary |
| character_set_results | cp932 |
| character_set_server | cp932 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/data/mysql/charsets/ |
+--------------------------+---------------------------------------+
この状態でダンプと取ります。
# mysqldump DATABASE_NAME > msyql.dump
これをこのままリストアすると
# mysql DATABASE_NAME < mysql.dmp
文字化けが原因でリストアできない場合があります。

こんな場合は使用している文字コードに関係なく
# mysqldump DATABASE_NAME --default-character-set=binary > mysql.dump
と --default-character-set=binary オプションを付けてダンプを取り
# mysql DATABASE_NAME --default-character-set=binary < mysql.dump
と --default-character-set=binary オプションを付けてリストアすれば大丈夫です。

2009年4月14日火曜日

mysqldump でスキーマ(テーブル構成)のみ取得

どうも僕です。
忘れやすいのでメモ。

mysqldumpで中のデータは要らないけどテーブル構成のみ取得したい場合。
# mysqldump DATABASE_NAME -d > schema.sql
または
# mysqldump DATABASE_NAME --no-data > schema.sql
です。

以上、終わり( ´艸`)

2009年4月3日金曜日

cpanモジュール

どうも。
muninの設定ついでにcpanについてもメモします。

cpanとはPerlモジュール群を置いているサイトのことで、cpanコマンドを使えば簡単にPerlモジュールをインストールできます。

# cpan install <モジュール名>
でもいいし、

# cpan
cpan> install <モジュール名>
でもOKです。
僕は仕事柄あまりPerlモジュールを利用することがないのですが、、。

Cpan::Miniというモジュールもあり、これはモジュール群を自分のローカルサーバへ落とす事ができます。

# cpan install Cpan::Mini
# minicpan -r http://ftp.cpan.jp/ -l ~/minicpan
これで1時間~半日かけてモジュール群を落としてきます。

ローカルへ落としたモジュールをインストールするには

# cpan
cpan> o conf urllist unshift ftp:///root/minicpan
cpan> o conf commit
でとりあえずローカルへ見に行くようになります。
あとは

# cpan
cpan> install <モジュール名>
でOK!

簡単ですね。
ちなみに、cpanで設定した項目をリセットするには

# cpan
cpan> o conf init
です。

muninインストールめも

どうも俺です。
今まで仕事でサーバ監視ツールはMRTGを使っていましたが、今回思いつきでmuninを使ってみようと思いインストールしたのでメモします。

既に数多くの解説サイトがあるのでそれらを参考にしていたのですが、ほとんどがyumでインストールだったのですが、muninの内容を理解するためにソースからインストールしました。

今回は監視対象サーバ(munin-node)と監視サーバ(munin)は同一サーバで行います。
監視対象サーバと監視サーバを分ける場合は、都度読み替えたり付け加えたりしてください。僕もいずれ監視対象サーバーを増やす予定です。

まずは、muninユーザとグループ作成
<監視サーバ/監視対象サーバ>
# groupadd -g 4949 munin
# useradd -u 4949 -g munin -s /sbin/nologin munin
なぜかグループIDとユーザIDは4949ですが、これはmuninが仕様するポートがデフォルトで4949だからだと思います。
気になる人はIDを指定しなくても問題ありません。

次にmuninはRRDToolを必要とするのでインストール。これもソースから。
<監視サーバ>
# wget 'http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.0.x/rrdtool-1.0.49.tar.gz'
# tar zxvf rrdtool-1.0.49.tar.gz
# rrdtool-1.0.49
# ./configure
# make
# make install
RRDToolは1.0.x系でないと正常に動作しません。(munin_1.2.6の場合)

次にCPANモジュールをインストール。
CPANとはPerlモジュールを入手できるサイトのこと。CPANサーバへつなぎモジュールインストールを自動化してくれます。
<監視サーバー>
# cpan
と打つと対話モードになり、初回は設定をあれこれ聞かれます。
基本全て「Enter」でOKですが、最後に接続サーバを選択するよう質問されるので、そこはきちんと選んでください。
僕は「Asia」→「Japan」→「ftp.ringo.gr.jp」というところを選択しました。

<監視サーバ>
# cpan install Time::HiRes
# cpan install HTML::Template
# cpan install Net::SNMP ←SNMP利用する場合
結構時間かかりますが気長に待ってください。

では、munin本体のインストールです。
<監視サーバ/監視対象サーバ>
# wget 'http://jaist.dl.sourceforge.net/sourceforge/munin/munin_1.2.6.tar.gz'
# tar zxvf munin_1.2.6.tar.gz
# cd munin-1.2.6
ここで初期設定を変更したい場合は、Makefile.configを適宜修正
とりあえずこのままデフォルト設定で進めます。
# make install-main ←監視サーバ
これで監視サーバ側のインストールは終わりです。後はMRTGのようにcronでデータを取得できればグラフができます。

まだ監視対象サーバの設定ができていないので、監視対象サーバの設定を行います。
まず、CPANモジュールのインストール。
<監視対象サーバ>
# cpan install Net::Server::Fork
※よくあると思うけど、もし監視対象サーバがローカル接続のみの場合、
cpanコマンドは使えないので、グローバルに出ているサーバへ
# cpan install Net::Server::Fork
してから、@NICにあるNew::Server::Forkモジュールをftpかなんかで落とします。
僕の環境の場合、
/usr/lib/perl5/site_perl/5.8.5/Net
以下のファイル・ディレクトリ全てを持っていきました。


次に、先ほどのmunin-1.2.6で
<監視対象サーバ>
# make install-node install-node-plugins
/etc/opt/munin/plugins内へプラグインへのシンボリックリンクを作成
# /opt/munin/sbin/munin-node-configure --shell | sh

munin-nodeの自動起動設定
<監視対象サーバ>
# cp ${MUNIN-SRC-DIR}/dists/redhat/munin-node.rc /etc/init.d/munin-node ←環境に合わせてファイルを変えてください。
# chkconfig --add munin-node
# chkconfig munin-node on
# service munin-node start
ここでエラーの出る場合は/etc/init.d/munin-nodeを修正
24行目:/usr/sbin/munin-node → /opt/munin/sbin/munin-node
ひとまずココで監視対象側の設定は終わりです。


では設定ファイルを書き換えます。
<監視サーバ>
# vim /etc/opt/munin/munin.conf ←監視サーバ用設定ファイル
特に問題なければそのままでOK。

<監視対象サーバ>
# vim /etc/opt/munin/munin-node.conf ←監視対象サーバ用設定ファイル
これも問題なければそのままでOK。

cron設定
<監視サーバ>
# crontab -e -u munin
*/5 * * * * /opt/munin/bin/munin-cron 2>&1
このcronの設定を行う前に一度手動でテストしたほうが良い。
# /opt/munin/bin/munin-cron
と打つと
Can't locate RRDs.pm in @INC (@INC contains: 
というエラーが出ました。
これはRPDs.pmが見つからない(${PATH}に見つからないと言う事だと思う)ので
# cd /usr/local/src/rrdtool-1.0.x/perl-shared
# perl Makefile.PL
# make && make install
でサクッと解決。

でまた
# /opt/munin/bin/munin-cron
と打つと、
「これはmuninユーザでやった方がエエで!rootでやるなら--force-rootオプション付けたほうがエエけど、あまりスマートちゃうやん」と怒られました。
とりあえずこれでOKです。
--force-rootオプションを付けてやると、コマンドは成功するのですが生成されるファイルの所有者がrootになってしまうので、munin-cronのcronをmuninユーザで設定していると問題です。ま、rootでcron動かせばいいんだろうけどね。。。

<監視対象サーバ>
# service munin-node restart


以上で、終わりです。
あとはApacheの設定を
<監視サーバ>
# vim /usr/local/apache2/conf/httpd.conf
Alias /munin /opt/munin/var/www ←追加

ブラウザで
http://localhost/munin
とすればグラフが表示されます。

グラフが生成されない場合は、munin.confとmunin-node.conf内に書いてある
-- munin.conf
dbdir データ保存先
htmldirhtml ファイル保存先
logdir ログ保存先
rundirlock ファイル保存先

-- munin-node.conf
log_file ログファイル名
pid_filepid ファイル名

で指定されたディレクトリの所有者をmunin:muninにしてください。
特にlog_file / pid_fileは見落としやすいです。

mysql系のnodeをmuninに追加する場合は、
# vim /etc/opt/munin/plugin-conf.d/plugins.conf
[mysql*]
env.mysqladmin /usr/local/mysql/bin/mysqladmin
と、mysqladminへのパスを書く。

apache系のnodeをmuninに追加する場合は、
# vim /usr/local/apache2/conf/httpd.conf
Include conf/extra/httpd-info.conf

# vim /usr/local/apache2/conf/extra/httpd-info.conf
<Location /server-status>
  SetHandler server-status
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 localhost
</Location>
ExtendedStatus On
を追加すればヨロシ。

postfix系の監視で
find: deferred: Permission denied
find: active: Permission denied
find: maildrop: Permission denied
find: incoming: Permission denied
find: corrupt: Permission denied
find: hold: Permission denied
のようなログが出る場合は、
# vim /etc/opt/munin/plugin-conf.d/plugins.conf
[postfix_mailqueue]
user root
を追加でOK。

2009年4月2日木曜日

linuxでのユーザ管理

俺です。

今日はLinuxでユーザーを追加、修正、削除する管理コマンドについてメモります。
OS:CentOS 4.3

1)ユーザーの追加

# useradd -d [ホームディレクトリ] -s [ログインシェル] -g [グループ] ユーザー名

2)ユーザー情報の確認

# finger ユーザー名

3)パスワード変更

# passwd ユーザー名

4)ユーザー情報まとめて変更

# usermod -d [ホームディレクトリ] -s [ログインシェル] -g [グループ] ユーザー名

5)ユーザー削除

# userdel -r ユーザー名
-rオプションはホームディレクトリごと削除


fingerコマンドとusermodコマンドはあまり知られてないかも(俺だけ?)なので要チェックです。

NAGIOS nrpeで「Could not complete SSL handshake」

仕事でNAGIOS+nrpeの設定をしていたとき少しハマりました。

NAGIOS監視サーバー側でnrpeを利用してエージェントサーバー側を監視しようとしたのですが、タイトルの通り
Could not complete SSL handshake
エラーが出て接続できない、、、。

nrpeのバージョンは2.0
SSLに原因があると思って、監視サーバー側の呼び出しコマンドに -n オプションを付けてSSL無効にしたが×。
エージェントサーバー側にも -n オプションを付けたが×。

エージェント側のログ(/var/log/messages)を見てみてると、
Host xxx.xxx.xxx.xxx is not allowed to talk to us!
というログが、、、。

原因は、、
nrpe.cfgファイルのallowed_hosts=の項目に、CIDR形式(xxx.xxx.xxx.0/28みたいな形式)で許可するIPアドレスを書いていました、、。
というか、それでOKだと思ってました、、、。

だって、そこに
I would highly recommend adding entries in your /etc/hosts.allow file to allow .....
て書いてあるから。。。

正解は、
allowd_hosts=127.0.0.1,xxx.xxx.xx.xxx,yyy.yyy.yyy.yyy(←許可するIPをカンマでつなぐ)
ちなみにエージェントサーバー側で
# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d
と打ってnrpeを起動する場合は、nrpe.cfgファイルのallowd_hosts=項目を見て許可IPを決めますが、デーモンに登録し
# /sbin/service nrpe start
みたいに起動する場合は、/etc/xinetd.d/nrpe(ファイル名は任意)内のonly_from=の項目が有効になります。

以上でーす。

再マウント

linuxにおいて、新たなデバイスをマウントする場合は

# mount [デバイス] [マウントポジション] -t [タイプ] -o [オプション,[オプション],,,]
でマウントします。

例えば

# mount tmpfs /tmpfs -t tmpfs -o rw,mode=777,size=512m
では、
/tmpfsへtmpfsファイルシステムを、ReadWrite、パーミッション0777、512MBでマウントします。


これを途中で1024MBへ変更したい場合は
一旦umountしたあとで、mountする方法もありますが

# mount tmpfs /tmpfs -t tmpfs -o rw,mode=777,size=1024m,remount
と、オプションにremountを付けてもOKです。