なんでもメモ

2015-03-08

critical と warning を同時に扱う場合の munin のメール送信用コマンド

warning と critical でメール送信を分けると、両方が混在した場合に2通メールが来て煩わしいので、力技で1通にまとめてみた。

munin.conf

contact.alert.command mail -s "[`[ -n "${var:cfields}" ] && echo CRITICAL``[ -n "${var:wfields}" -a -n "${var:cfields}" ] && echo /``[ -n "${var:wfields}" ] && echo WARNING``[ ! -n "${var:wfields}" -a ! -n "${var:cfields}" ] && echo INFO`] ${var:host} -> ${var:graph_title}`[ -n "${var:wfields}" -o -n "${var:cfields}" ] && echo ' -> '``[ -n "${var:wfields}" -a -n "${var:cfields}" ] && echo [CRITICAL]:``[ -n "${var:cfields}" ] && echo ${loop<,>:cfields ${var:label}=${var:value}}``[ -n "${var:wfields}" -a -n "${var:cfields}" ] && echo ' '``[ -n "${var:wfields}" -a -n "${var:cfields}" ] && echo [WARNING]:``[ -n "${var:wfields}" ] && echo ${loop<,>:wfields ${var:label}=${var:value}}`" "me@example.com"
contact.alert.always_send  warning critical

WARNINGのみの場合のメールのタイトル例

[WARNING] host.name -> Load average -> load=0.06

CRITICALのみの場合のメールのタイトル例

[CRITICAL] host.name -> Disk usage in percent -> /=7.28

WARNINGとCRITICALの両方を含む場合のメールのタイトル例

[CRITICAL/WARNING] host.name -> Memory usage -> [CRITICAL]:vmalloc_used=3477504.00,apps=81174528.00 [WARNING]:page_tables=5312512.0

閾値を超えていない場合のメールタイトル例(OKの場合など)

[INFO] host.name -> Disk usage in percent

2015-03-05

telnet コマンドに echo コマンドで値を渡して出力結果を得る方法。

今回は、telnet で 80 番ポートを叩いて、404エラーが返ってくるのを確認したいという場合を想定してみた。

手動で叩く場合

手動の場合は以下のようになる。

telnet localhost 80 2>/dev/null
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Thu, 05 Mar 2015 13:41:26 GMT
Connection: close

コマンド経由でうまくいかない例

telnet に普通に echo で値を渡しても、telnet の入力として扱われない。404エラーの表示を期待しているのだが表示されない。

$ echo -e "GET / HTTP/1.0\n\n" | telnet localhost 80 2>/dev/null
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

コマンド経由でうまくいく例

期待通りに404エラーが表示される。

{ echo -e "GET / HTTP/1.0\n\n"; sleep 1; } | telnet localhost 80 2>/dev/null
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Thu, 05 Mar 2015 13:28:34 GMT
Connection: close

コマンド経由でtelnetを叩き、404が返ってきた場合には "OK"、そうでない場合には "NG" を返す例

$ [ "`{ echo -e "GET / HTTP/1.0\n\n"; sleep 1; } | telnet localhost 80 2>/dev/null | grep -o "HTTP/1.1 404 Not Found"`" = "HTTP/1.1 404 Not Found" ] && echo "OK" || echo "NG"
OK

※ 2>/dev/null しているのは、標準エラー出力から出力される "Connection closed by foreign host." 等の文字列を無視するため。

2015-03-02

MySQL の "Warning: Using a password on the command line interface can be insecure" 対応。

概要

スクリプトから mysql を呼び出す際に、コマンドライン上にパスワードを直接入れている箇所があると、mysql がこのログを吐く。たしかに、セキュリティ上よろしくないですよね。また、ログが結構汚染されるのはいただけないので、対処しました。

対応方法

任意の場所に、以下のような接続情報提供用の my.cnf ファイルを作成する。所有者をスクリプトの実行ユーザーに、モードを 600 にすることにより、他のユーザーからアクセスされないようにする。

[client]
user = <MySQL接続時のユーザー名>
password = <MySQL接続時のパスワード>
host = <localhostとか>

スクリプトからコマンドを呼び出す際に、以下のオプションを追加する。

--defaults-extra-file=/foo/bar/my.cnf

考察

mysql側が標準的な手法を提供してくれているのだから、従っておいたほうがいろいろと幸せになるような気がする今日この頃。

2015-03-01

とあるテーブルに OPTIMIZE TABLE をしたメモ。(実運用中のデータをテスト環境にコピーして実施)

  • DBMS : MySQL 5.6.23
  • TYPE : INNODB
  • innodb_buffer_pool_size : そんなに大きくない。実験対象のテーブルサイズよりも小さい。

実施前

  • レコードは約3,000万行(30,466,260)
  • とある集計にかかった時間は約5分(4分59秒)
  • ibdファイルサイズは約3GB(3,162,505,216バイト)

実施

  • 実施時間は約20分(18分54秒)

実施後

  • とある集計にかかった時間は約1分(1分11秒)
  • ibdファイルサイズは約1.4GB(1,426,063,360バイト)

備考

mysqlcheck を使うと、一括でのオプティマイズが楽にできる。
以下例:

$ mysqlcheck -uroot -p -o --all-databases

2015-03-01

新環境に既存の MySQL データを移行し、java から MySQL を叩いた際に以下のエラーに遭遇。
※stacktrace の細部は割愛。

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Caused by: java.net.ConnectException: Connection refused

原因は、my.cnf の内容を刷新している際に、skip-networking が混入してしまったこと。