2014年1月31日金曜日

ニフティクラウド RDBをzabbixで監視する方法

■概要
ニフティクラウドRDBにはモニタリングの機能がありコントールパネル上からCPU使用率やDBのコネクション数を確認することができます
ただ、グラフで閲覧できるだけで閾値を設定してアラートを上げたりすることはできません
また監視データも過去1週間しか確認できないため過去のデータに遡ることが限定されてしまいます
ニフティクラウドRDBでは3306ポートと通信できるだけなのでこのポートを使用してzabbixで監視をしてみたいと思います

■環境
CentOS 5.10 (64bit)
Zabbix 2.2.1
MySQL 5.5.32 (ニフティクラウドRDB)

■設定手順
以下の手順はすべてzabbixサーバ側で実施します
当たり前ですが、ニフティクラウドRDB側のサーバにsshログインして何かするといことはありません(できません)

1. 監視スクリプトの作成
emacs /etc/zabbix/externalscripts/mysql_watch_scrpt.sh
Zabbix 2.2.1 では外部スクリプトは上記のパスにファイルを作成すると自動で読み込んでくれるようです
※すいません、スクリプトは参考サイトさんのものをそのまま利用させていただきました
#!/bin/sh

USER=$1
PASS=$2
HOST=$3
KEY=$4

mysqladmin -u $USER -p$PASS -h $HOST  extended-status | awk '{if($2 == "'$KEY'") print $4}'
chown zabbix:zabbix /etc/zabbix/externalscripts/mysql_watch_scrpt.sh
chmod 755 /etc/zabbix/externalscripts/mysql_watch_scrpt.sh
zabbixユーザが実行できるように権限を付与します

sh /etc/zabbix/externalscripts/mysql_watch_scrpt.sh [username] [password] [ニフティクラウドRDBで提供されているIPアドレス] [mysqladminで取得できる項目名]
実行して問題なく値が取得できることを確認します
存在しない項目名を入力すると空文字が返ってきます

2. zabbix_server.conf設定(確認)
emacs /etc/zabbix/zabbix_server.conf
ExternalScripts=/etc/zabbix/externalscripts
上記の設定が記載されていることを確認します

3. ニフティクラウドRDBサーバのホスト追加
設定 -> ホスト -> ホストの作成からニフティクラウドRDBのサーバを追加します
IPアドレスにニフティクラウドRDBで提供されたIPアドレスを入力します(プライベート側のIPで大丈夫です)
ホストグループやホスト名は適宜変更してください

マクロのタグから以下のとおりマクロを設定します
  • {$RDB.IP}・・・ニフティクラウドRDBで提供されたIPアドレス
  • {$RDB.USERNAME}・・・mysqlに接続するためのユーザ名
  • {$RDB.PASSWORD}・・・上記ユーザのパスワード
※マクロ名も適宜変更して問題ございません

4. アイテム追加
設定 -> ホスト -> [追加したホスト名のアイテム] -> アイテムの作成でホストにアイテムを追加します
ホストにテンプレートを紐付けてテンプレートに対してアイテムを追加しても問題ございません
以下のように設定します

ポイントは
  • タイプ:外部チェック
  • キー:mysql_watch_scrpt.sh[{$RDB.USERNAME},{$RDB.PASSWORD},{$RDB.IP},"Open_files"]
を設定できていれば問題ないです
仕組みとしては作成したスクリプトの引数にマクロで設定した値を渡すことでスクリプトを実行し取得します
更新間隔やヒストリ、トレンドの値はデフォルの値を使用しておりますので適宜変更してください
また、キーの最後の"Open_files"の部分を変更することが他の項目を監視することができます(今回は例としてOpen_filesを入れております)

5. トリガー追加
設定 -> ホスト -> [追加したホスト名のトリガー] -> トリガーの作成でホストにトリガーを追加します
こちらもアイテム同様テンプレートが紐付いているならばテンプレートに追加しても問題ございません
今回は以下のように設定しました

必ずアラートが上がるように閾値は1を設定しています

6. 動作確認
設定が完了したらデータが取得できているか確認します
監視データ -> 概要 -> タイプ:データ を選択し作成したアイテムの項目が取得できている確認します
値が取得できていない場合は権限が付与できているかやアイテムの指定にスペルミスがないか等確認してください
それでもダメな場合はzabbix_server.confでDebugLevel=2に設定しエラーの内容を出力してどんなエラーになっているか確認してトラブルシュートしてください

mysqladminコマンドを使用して監視できる項目を監視することができました
が、これではサーバ自体のリソースCPUやメモリ使用量を監視することができないのでなんとかその辺も監視することができないか模索してみたいと思います
(というかそもそもそういうのを運用、監視しなくていいためにiPaaSという分野が生まれたような。。。相反することを実はやっている。。。)

■参考サイト

2014年1月29日水曜日

Zabbixでロックファイルを監視する方法

■概要
よくあるケースとしてロックファイルが正常に削除されているか、ずっとロック状態になっていないか
という確認をしたいことがあるかと思います
今回はzabbixでロックファイルの存在を監視する例を紹介したいと思います

■環境
CentOS 5.9 64bit
zabbix 2.2.1

■アイテムを追加
以下のアイテムを作成します
  • 名前:lockfile exists check
  • タイプ:Zabbixエージェント
  • キー:vfs.file.exists[/tmp/test.lock]
  • 更新間隔(秒):30
名前、キーで指定するlockfile名は適宜変更してください
その他の項目については特に変更する必要はございません
更新間隔は30秒を指定していますがここの設定によってlockファイルが何秒存在していたらアラートをあげるという部分の条件になるので必要に応じて変更してください
アイテム追加は新規作成したテンプレートか既存のテンプレートに追加した方がいいと思いますが、ホストに直接アイテムを追加しても問題ないです

■トリガー設定
以下のトリガーを作成します
  • 名前:lockfile exists check
  • 条件式:{Original Template:vfs.file.exists[/tmp/test.lock].last()}+{Original Template:vfs.file.exists[/tmp/test.lock].prev()}>1
  • 深刻度:警告
条件式は「Original Template」というテンプレート内にアイテムを作成した場合の設定方法となります

■動作確認
監視データ -> 概要から追加したアイテムの値が取得できているか確認します
ファイルが存在している場合は1が、存在していない場合は0が返ってきます
今回の設定では30秒間隔でデータを取得しにいくようにしているのですぐにアラートがあがると思います
アクションは必要に応じて追加してください

●仕組み
ロックファイルが存在しているどうかを調べることで実現しています
トリガーの設定で前回の値と今回の値を加算した結果が1より大きかった場合にアラートをあげるようにしています
これは例えば30秒で値を取得しているときに30秒前にファイルが存在して今回取得したときにもファイルが存在している場合にアラートあがる動きになっています
つまり、指定した更新間隔時間以上、ロックファイルが存在している場合にアラートをあげてくれています
ただ、この場合はだとファイル作成 -> 削除 -> 作成 -> 削除と繰り返した場合に、たまたま値を取得したタイミングが前回も今回も作成した場合にぶち当たるとちゃんとロックファイルは削除されているのにアラートがあがってしまうという過剰検知を引き起こす可能性もあります

たぶんもっと良い仕組みはあるんだろうけどパッと思いついたのがこの方法でした

2014年1月28日火曜日

Zabbixを1.8から2.2にアップグレードしたときのメモ

■背景
Zabbixがあまりにも古かったのでアップグレードしました
バージョンは 1.8 から 2.2 にアップグレードしました
残念ながら今回既存のデータは引き継げませんでした
やり方によっては引き継げるようで、1.8 -> 2.0 -> 2.2 という順番でアップグレードすればできるみたいです
既存のデータが引き継げていないので正直新しくインストールしているやり方と全く同じですが、既存のZabbix環境をアップグレードするための方法となります
また、今回新しいバージョンのインストールはyumからでなくソースコードから実施しました

■環境
CentOS 5.10 (64bit)
Zabbix 1.8.15 -> 2.2.1
php 5.3.3
MySQL 5.5.32 (ニフティクラウドRDB)
※古いZabbix、phpは共にyumでインストール

■アップグレード方法
0. 事前準備
service zabbix-server stop
service zabbix-agent stop
  事前にプロセスは停止しておきましょう

1. zabbix-server, zabbix-agent のアップグレード
cd /var/tmp
wget http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.2.1/zabbix-2.2.1.tar.gz?r=http%3A%2F%2Fwww.zabbix.com%2Fjp%2Fdownload.php&ts=1390818737&use_mirror=jaist
  ダウンロードできない場合は http://www.zabbix.com/jp/download.php から最新の安定版のパッケージをダウンロードしてください
tar xvzf zabbix-2.2.1.tar.gz
cd zabbix-2.2.1
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2
  「--with-hogehoge」という感じで指定すると様々な追加パッケージを同時にインストールすることができるようです
  詳細は「./configure --help」で確認できます、今回は公式ドキュメントにあるMySQLを使ってzabbixを使用するためのオプションで指定しました
  「Now run 'make install'」と出れば configure は完了です
make
make install
zabbix_agentd -V
zabbix_server -V
  「Zabbix server v2.2.1 (revision 40808) (09 December 2013)」と表示されればインストール完了です
  上記バイナリファイルは/usr/local/sbin/配下にインストールされています

2. zabbixのバージョンを切り替える
cd /usr/sbin
  yumでインストールした場合はバイナリファイルは/usr/sbinにあります
mv zabbix_agentd zabbix_agentd_1.8.15
mv zabbix_server_mysql zabbix_server_mysql_1.8.15
mv zabbix_agent zabbix_agent_1.8.15
ln -nfs /usr/local/sbin/zabbix_server zabbix_server
ln -s /usr/local/sbin/zabbix_agent zabbix_agent
ln -s /usr/local/sbin/zabbix_agentd zabbix_agentd

3. 新規DBへの移行
mysqldump -u username -p zabbix -h hostname > zabbix_backup.dmp
  念のため1.8時代の情報はdumpしておきます
mysql -u username -p zabbix -h hostname
mysql> drop database zabbix;
mysql> create database zabbix;
cd /var/tmp
cd zabbix-2.2.1/database/mysql
mysql -u username -p zabbix -h hostname < schema.sql
mysql -u username -p zabbix -h hostname < images.sql
mysql -u username -p zabbix -h hostname < data.sql
  順番は schema.sql -> images.sql -> data.sql の順番でやる必要があります(外部キー制約の関係上)
  data.sqlでデフォルトテンプレートやデフォルトユーザをINSERTします

4. UI更新
cd /usr/share
  yumでインストールした場合のUIは/usr/share/zabbixにあります
mv zabbix zabbix_1.8.15
  既存のUIのソースは念のためバックアップしておきます
cd /var/tmp
cd zabbix-2.2.1/frontends/
cp -r php/ /usr/share/zabbix_2.2.1
cd /usr/share
ln -s zabbix_2.2.1/ zabbix

5. 各種起動
service zabbix-server start
service zabbix-agentd start
service httpd start
tailf /var/log/zabbix/zabbix_server.log
  念のためログを確認してエラーが出ていないことを確認します

6. WebUIでセットアップ
http://hostname/zabbix/setup.php にアクセスしてzabbixのセットアップを実施します

セットアップの最後で zabbix.conf.php を /usr/share/zabbix_2.2.1/conf/zabbix.conf.php に作成しようとします
うまく作成できない場合はフォルダの権限を変更してみてください(権限はzabbix:zabbixでやってください)
それでもダメな場合は「Download configuration file」から手動でダウンロードしサーバに配置してください
配置後に「retry」するとOKになると思います

残念ながら既存環境の移行はできませんでしたが、同一サーバ上での zabbix のアップグレードは行えたのでよしとしましょう

■参考サイト

■Tips
makeするための環境等もともと整っている環境で実施したのでその辺のインストール手順は省略しています

ユーザやグループの追加も既存のzabbix:zabbixを使用しています

2.2.1からDBの自動マイグレート機能がついており、それにより既存のデータを簡単に引き継げるようになったのですが、1.8から2.2で自動マイグレート機能を使用しようとすると起動時に「Cannot upgrade database: the database must correspond to version 2.0 or later. Exiting ...」というエラーが出てマイグレートできません
冒頭にも記載しましたが、2.2.1のDB自動マイグレート機能を使用したい場合は一度 1.8 -> 2.0 のアップグレードを実施したあとで 2.0 -> 2.2 のアップグレードも実施する必要があります

WebUIで「Database error: Error connecting to database [Too many connections]」が表示される場合はMySQLの max_connections の値を30以上にしてみてください
どうやらzabbixのWebUIからは毎回30弱のDBコネクションを張るようなのでそれ以下の設定だと上記エラーが出るようです

2014年1月22日水曜日

log4jで同一カテゴリに複数のAppenderを割り当てる際に注意すること

例えば

log4j.category.com.kakakikikeke

というカテゴリに対してログファイルへの出力とコンソールへの出力をしたい場合に

log4j.category.com.kakakikikeke=DEBUG, FILE
log4j.category.com.kakakikikeke=DEBUG, CONSOLE

と記載すると後に記載しているCONSOLEのAppenderだけが有効になってしまいログファイルへの出力ができなくなってしまいます
なので複数のAppdenderを割り当てる場合は

log4j.category.com.kakakikikeke=DEBUG, FILE, CONSOLE

のように1行に複数のAppenderをカンマ区切りで記載してあげる必要があります

当たり前といえばあたり前なのですがちょっとハマったのでメモしておきます

2014年1月17日金曜日

ニフティクラウドmobile backendでSNS連携(Twitter)をやってみた

今回作成したソースコードは以下で公開しています

https://github.com/kakakikikeke/android-ncmb-sample

以下にポイントを紹介します

●SNS連携の機能について
自身のTwitterAPI用のKeyを使ってTwitterAPIを呼び出すことができるようになります
APIの認証部分(OAuth)をサポートしてくれており認証後はTwitterのAPIをコールすることができます
認証後はログインした利用者のタイムラインやツイート情報を表示することができます

●Twitter DeveloperでTwitterAPIを実行するためのConsumerKeyとConsumerSecretKeyを取得します
https://dev.twitter.com/apps にアクセスしアプリを作成しそれぞれのKeyを取得します
まず、取得したConsumerKeyはコンパネに設定します
アプリ設定 -> SNS連携 -> Twitter連携 ->  Twitter Consumer Key
の部分です
またソースコード内でもConsumerKeyとConsumerSecretKeyの2つを使います

●Twitter Developerで作成したアプリの権限設定を見直します
以下の箇所が設定されているか確認します
設定されていないと
401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync.
というエラーとなりうまく利用できません
  • Access level・・・「Read, write, and direct messages」になっているか確認します
  • Callback URL・・・必ず何かを設定してください
  • Sign in with Twitter・・・「Yes」になっているか確認します

●twitter4jの配置
twitter4jのライブラリをアプリのビルドパスに配置する必要があります
配置するjarファイルは「twitter4j-core-X.X.X.jar」だけで大丈夫です
バージョンは3.0.5を利用して下さい、古いライブラリだとAPIコールがhttpとなっており403エラーが発生してしまいます

■参考サイト

2014年1月16日木曜日

【Twitter】twitterIdとscreenNameを調べる方法

APIの仕様変更とかでいろいろと死んでいるサイトがいるので生存しているサイトを忘れないようにメモ

http://nojimi.dip.jp/idsnconv/

http://twitter.com/intent/user?screen_name=kakakikikeke
のソースコード内にtwitterIdがあるのでそれでもわかるみたい

  • twitterId・・・普遍的なもの、アカウント作成時から変更することはできない、基本はユーザの目につくものではない、数字の羅列で自動生成される
  • screenName・・・Twitterのアカウント名みたいなのもの、変更可能でユーザが目にするアカウント情報

2014年1月15日水曜日

minaをインストール

■環境
CentOS 5.9
Ruby ruby 1.9.3p125
gem 2.1.4
mina 0.3.0

■インストール
cd /var/tmp
touch Gemfile
vim Gemfile
cat Gemfile
source :rubygems

gem 'mina'
bundle install --path vendor/bundle
bundle exec mina init
  すると「/var/tmp/config/deploy.rb」が作成されます

■設定
vim /var/tmp/config/deploy.rb
set :domain, 'hostname'
set :deploy_to, '/var/tmp/deploy'
set :user, 'root'
set :repository, 'https://github.com/kakakikikeke/ruby-kakabot.git'

#invoke :'rails:db_migrate'
#invoke :'rails:assets_precompile'
  今回はrailsアプリでなくDBも使っていないため上記2行をコメントアウトします
  コメントアウトしないとrakeファイルがない(No Rakefile found)と言われてデプロイに失敗します

■デプロイ先設定
cd /var/tmp
bundle exec mina setup
  設定に合わせた事前準備を先ほど設定ファイルに記載したデプロイ先に対して実行します

■デプロイ実行
cd /var/tmp
bundle exec mina deploy
ls /var/tmp/deploy/releases/1/
  にgitからcloneしたデータがデプロイされていると思います

■Tips
・mina tasks
実行できるタスクの一覧を表示してくれます
・gem install mina --no-rdoc --no-ri
・mina init
上記の手順でもインストールと初期設定ができるみたいなんだけどGemfileがないためCould not locate Gemfileとなって怒られてしまいます
・デプロイ先ホストへのSSHノンパス設定
今回は同一ホストに対して実施しましたがデプロイ先のサーバに対してはSSHのノンパスログインを設定する必要があります
公開鍵を使ったSSHのノンパス設定方法は以下を参照してください
http://kakakikikeke.blogspot.jp/2012/03/10ssh.html
・cap shell的なコマンド
capistranoでいうところの「cap shell」みたいなコマンドはあるのか気になりました
mina console というタスクがデフォルトで用意されていたのでそれかなと思い実行したので裏側はrails console を実行していたので違うっぽい(?、未検証)
⇒mina run["ls -la"]といった感じで実行するとcap shellと同じようなことができるようです

■参考サイト

今回はデフォルトのレシピを使ってデプロイしてましたが次回は独自のレシピを使って実行してみたいと思います