munin 2.0.12 環境構築メモ(munin-node側)
自作の munin plugin 使って OracleDatabase のリソースグラフ化する時のメモ。ここでは Munin-Node 環境を作るまで。
oracle plugin はシェルベースで、sqlplus を使ってインスタンスへアクセスします。またリスナ依存を排除するため、ローカル接続を行います。アクセスのしやすさを優先して、munin-node は oracle ユーザで動かすことにしています。
同じ OS 構成ベースであればディレクトリ固めて展開できるように、perl とかも全部1ディレクトリに放り込みます。
■Perl
5.16.3 使いました
./Configure -des -Dprefix=/home/oracle/local/munin make -j 4 make test make install
■Perl-Module
cpanm で入れます。
Net::SSLeay のために openssl-devel が、DB_File のために db4-devel が必要です。
munin-node において、DB_File は asyncd を使わない場合は(多分)不要なはずです。今回は asyncd 使うので必須。
export PATH=/home/oracle/local/munin/bin:$PATH curl -LOk http://xrl.us/cpanm chmod 755 cpanm mv cpanm /home/oracle/local/munin/bin/ sudo yum install openssl-devel sudo yum install db4-devel cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::Server cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SNMP cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Crypt::DES cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::SHA1 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::HMAC cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SSLeay cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN DB_File
■Munin-Node
PATH 関係はここで全部設定します。perl 部分を絶対 PATH にしたり。内容は作る人のお好みで。
vi Makefile.config
munin-async を使うので async-prime も必要です。後 oracle でもう全部動かすことにするので、chown で がっつり oracle にオーナ・パーミッションを変えます。この辺の考え方は好み次第。
make su -- make install-common-prime install-node-prime install-plugins-prime install-async-prime cp -pr contrib /home/oracle/local/munin/ ls -l /home/oracle/local/munin/ chown -R oracle:oinstall /home/oracle/local/munin/* ls -l /home/oracle/local/munin/ exit --
Makefile.config の設定の仕方が多分マズイために起きているんだと思いますが、一部のソースの perl PATH が変わってくれないので手で直します。
cd /home/oracle/local/munin/sbin vi munin-node vi munin-node-configure vi munin-run vi munin-sched === #!/home/oracle/local/munin/bin/perl === cd /home/oracle/local/munin/contrib vi dump_storable vi import_db vi dump_db vi epoch2localtime === #!/home/oracle/local/munin/bin/perl ===
SpoolReader にパッチあてときます。(前の記事の件です http://nsrzakki.hateblo.jp/entry/2013/04/24/015415)
cd /home/oracle/local/munin/lib/perl5/site_perl/5.16.3/Munin/Node/ cp -p SpoolReader.pm /tmp/SpoolReader.pm patch < /home/oracle/local/src/Munin/SpoolReader.pm.patch
■Munin-Node設定
asyncd を同じノードに立てるので、アクセス元を localhost だけにしておきます。
あとは必要な default_plugin 関係を追記。
cd /home/oracle/local/munin/etc/ vi munin-node.conf - add default_plugin_user oracle - add default_plugin_group oinstall - mod user oracle - mod group oinstall - mod #host * - mod host 127.0.0.1
■プラグイン設定
山ほどサンプルがあるので、お好きなように設定しましょう。
oracleプラグイン部分は別に書く。
■起動
こんな感じ。実運用時向けに起動スクリプトも作ってあるけど、こんなん別に誰でもかけるしな。。
プロセスダウン検知どうしよう・・・というのが実はあるんですが、本当にどうしよう。munin-limit側で考えるか。
/home/oracle/local/munin/sbin/munin-node /home/oracle/local/munin/lib/munin-asyncd &
とりあえずここまで。
munin asyncd でプラグインの実行タイミング制御
覚書
4/26 update SpoolReaderとUpdateWorkerのパッチをとりあえず追加
■munin-asyncd で plugin 毎に収集タイミングを制御するには
plugin_rates でプラグイン毎の実行タイミングを制御できる
plugin 実行間隔(秒)
設定しないプラグインはデフォルトの5分おきで収集されるが、載せておくほうが無難か
■munin-async の実行
コマンド制限タイプssh鍵登録
実運用時はfromも最低付ける予定
command="/~/lib/munin-async --spoolfetch" ssh-rsa AAAAB
■問題点1:実行間隔を5分以上にすると、munin-async 実行時に値の更新のなかったプラグインはグラフへのリンクが切れる
→RRD更新やHTML生成が、state-~.storable を基点にしていて、「値を返してきたもの」を前提として生成するような形になっているため
→SpoolReader.pm をいじって、更新が無かった場合でも最後の値を返すように修正
→munin-update時にrrdtool update部でエラーになる
→UpdateWorker.pm で前回と同値の場合は~.storageとRRDファイルを更新スキップするよう修正
■問題点2:値の更新間隔が600秒以上のプラグインは、rrdファイルのvalueがNaNとなり、グラフに描画されない
→Muninのrrdファイル生成時のデフォルトが step = 300,minimal_heartbeat = 600 のため
→rrdtool tune で minimal_heartbeat を plugin_rates で設定した値*2くらいに変更するとvalueが乗り微妙だけどグラフが描画される
→コマンドイメージ rrdtool tune ~.rrd 42:7200
→UpdateWorkerでminimal_heartbeatの変更も対応できるよう修正するのがよいのだけど、修正量が多くなるのでちょっと見送り。
→rrdtool でとりあえず変更でしのぐ(・・・にしても変更するのが楽になるようにシェル作るか?)
■SpoolReader.pmのパッチ
--- SpoolReader.pm.org 2013-04-16 16:46:49.000000000 +0900 +++ SpoolReader.pm 2013-04-24 12:08:47.000000000 +0900 @@ -113,14 +113,21 @@ or die "Unable to open spool file: $!"; my $epoch; + my $position = 0; # wind through to the start of the first results after $timestamp while (<$fh>) { ($epoch) = m/^timestamp (\d+)/ or next; + $position = tell($fh) - length($_); logger("Timestamp: $epoch") if $config->{DEBUG}; last if ($epoch > $timestamp); } + # for last timestamp return + if ( eof $fh && $position != 0 ) { + seek($fh , $position , 0); + } + if (eof $fh) { logger("Epoch $timestamp not found in spool file for '$service'") if $config->{DEBUG};
■UpdateWorker.pmのパッチ(コメントは超適当)
--- UpdateWorker.pm.org 2013-04-09 18:13:55.000000000 +0900 +++ UpdateWorker.pm 2013-04-24 12:06:21.000000000 +0900 @@ -898,34 +898,40 @@ $current_updated_value = $value; } - DEBUG "[DEBUG] Updating $rrd_file with @update_rrd_data"; - if ($ENV{RRDCACHED_ADDRESS} && (scalar @update_rrd_data > 32) ) { - # RRDCACHED only takes about 4K worth of commands. If the commands is - # too large, we have to break it in smaller calls. - # - # Note that 32 is just an arbitrary choosed number. It might be tweaked. - # - # For simplicity we only call it with 1 update each time, as RRDCACHED - # will buffer for us as suggested on the rrd mailing-list. - # https://lists.oetiker.ch/pipermail/rrd-users/2011-October/018196.html - for my $update_rrd_data (@update_rrd_data) { - RRDs::update($rrd_file, $update_rrd_data); - # Break on error. - last if RRDs::error; + # + # RRDs::update run "$current_updated_timestamp > $previous_updated_timestamp" only. + # If "$current_updated_timestamp <= $previous_updated_timestamp" case should retrun $previous_updated_timestamp ? + if ($current_updated_timestamp > $previous_updated_timestamp) { + DEBUG "[DEBUG] Updating $rrd_file with @update_rrd_data"; + if ($ENV{RRDCACHED_ADDRESS} && (scalar @update_rrd_data > 32) ) { + # RRDCACHED only takes about 4K worth of commands. If the commands is + # too large, we have to break it in smaller calls. + # + # Note that 32 is just an arbitrary choosed number. It might be tweaked. + # + # For simplicity we only call it with 1 update each time, as RRDCACHED + # will buffer for us as suggested on the rrd mailing-list. + # https://lists.oetiker.ch/pipermail/rrd-users/2011-October/018196.html + for my $update_rrd_data (@update_rrd_data) { + RRDs::update($rrd_file, $update_rrd_data); + # Break on error. + last if RRDs::error; + } + } else { + RRDs::update($rrd_file, @update_rrd_data); } - } else { - RRDs::update($rrd_file, @update_rrd_data); - } - if (my $ERROR = RRDs::error) { - #confess Dumper @_; - ERROR "[ERROR] In RRD: Error updating $rrd_file: $ERROR"; + if (my $ERROR = RRDs::error) { + #confess Dumper @_; + ERROR "[ERROR] In RRD: Error updating $rrd_file: $ERROR"; + } + + # Stores the previous and the current value in the state db to avoid having to do an RRD lookup if needed + $self->{state}{value}{"$rrd_file:42"}{current} = [ $current_updated_timestamp, $current_updated_value ]; + $self->{state}{value}{"$rrd_file:42"}{previous} = [ $previous_updated_timestamp, $previous_updated_value ]; } - # Stores the previous and the current value in the state db to avoid having to do an RRD lookup if needed - $self->{state}{value}{"$rrd_file:42"}{current} = [ $current_updated_timestamp, $current_updated_value ]; - $self->{state}{value}{"$rrd_file:42"}{previous} = [ $previous_updated_timestamp, $previous_updated_value ]; - + DEBUG "[DEBUG] return timestamp is $current_updated_timestamp. previous timestamp is $previous_updated_timestamp."; return $current_updated_timestamp; }
ZFS on Linux 0.6.1 入れる
これ入れました。 http://zfsonlinux.org/
Cent6 系準備して http://zfsonlinux.org/epel.html のとおりに叩くだけ。
zpool status したらこんなエラー。
# zpool status Failed to load ZFS module stack. Load the module manually by running 'insmod <location>/zfs.ko' as root. Failed to load ZFS module stack. Load the module manually by running 'insmod <location>/zfs.ko' as root.
このへん https://github.com/zfsonlinux/zfs/issues/1155 みる。dkms status で様子を見る。
# dkms status spl, 0.6.1: added zfs, 0.6.1: added
installされてないっぽいので、installしてみる。
# dkms install -m spl -v 0.6.1 Error! echo Your kernel headers for kernel 2.6.32-358.2.1.el6.x86_64 cannot be found at /lib/modules/2.6.32-358.2.1.el6.x86_64/build or /lib/modules/2.6.32-358.2.1.el6.x86_64/source.
build,source 付近が必要そうなので、kernel-devel.x86_64 入れる。で、入れて再トライ。
# dkms install -m spl -v 0.6.1 Kernel preparation unnecessary for this kernel. Skipping... Running the pre_build script: (中略) depmod.... DKMS: install completed. # dkms install -m zfs -v 0.6.1 Kernel preparation unnecessary for this kernel. Skipping... Running the pre_build script: (中略) WARNING: /lib/modules/2.6.32-220.el6.x86_64/weak-updates/zpios.ko needs unknown symbol kmem_free_debug ※古いところ見て警告かな? Running the post_install script: depmod.... DKMS: install completed.
dkmsはこうなった。
# dkms status spl, 0.6.1, 2.6.32-358.2.1.el6.x86_64, x86_64: installed zfs, 0.6.1, 2.6.32-358.2.1.el6.x86_64, x86_64: installed zfs, 0.6.1, 2.6.32-220.23.1.el6.x86_64, x86_64: installed-weak from 2.6.32-358.2.1.el6.x86_64 zfs, 0.6.1, 2.6.32-220.el6.x86_64, x86_64: installed-weak from 2.6.32-358.2.1.el6.x86_64
lsmodはこんな感じ。
# lsmod | grep zfs zfs 1141518 2 zcommon 44698 1 zfs znvpair 80033 2 zfs,zcommon zavl 6925 1 zfs zunicode 323159 1 zfs spl 261216 5 zfs,zcommon,znvpair,zavl,zunicode
プロパティ。compressratio 使えるか?使えると助かる。VMマシンだとCPUのほうがきつくなってしまうかもだけど。
# zfs get all NAME PROPERTY VALUE SOURCE rpool type filesystem - rpool creation Tue Apr 9 18:20 2013 - rpool used 146K - rpool available 3.91G - rpool referenced 31K - rpool compressratio 1.00x - rpool mounted yes - rpool quota none default rpool reservation none default rpool recordsize 128K default rpool mountpoint /rpool default rpool sharenfs off default rpool checksum on default rpool compression off default rpool atime on default rpool devices on default rpool exec on default rpool setuid on default rpool readonly off default rpool zoned off default rpool snapdir hidden default rpool aclinherit restricted default rpool canmount on default rpool xattr on default rpool copies 1 default rpool version 5 - rpool utf8only off - rpool normalization none - rpool casesensitivity sensitive - rpool vscan off default rpool nbmand off default rpool sharesmb off default rpool refquota none default rpool refreservation none default rpool primarycache all default rpool secondarycache all default rpool usedbysnapshots 0 - rpool usedbydataset 31K - rpool usedbychildren 114K - rpool usedbyrefreservation 0 - rpool logbias latency default rpool dedup off default rpool mlslabel none default rpool sync standard default rpool refcompressratio 1.00x - rpool written 31K - rpool snapdev hidden default
パラメータはこんな感じ。
kernel.spl.version = SPL v0.6.1-1 kernel.spl.hostid = 0 kernel.spl.hw_serial = 0 kernel.spl.kallsyms_lookup_name = ffffffff810b9590 kernel.spl.debug.subsystem = undefined atomic kobj vnode time rwlock thread condvar mutex rng taskq kmem debug generic proc module cred kstat xdr tsd zlib user1 user2 user3 user4 user5 user6 user7 user8 kernel.spl.debug.mask = warning error emerg console dprintf kernel.spl.debug.printk = warning error emerg console kernel.spl.debug.mb = 11 kernel.spl.debug.binary = 1 kernel.spl.debug.catastrophe = 0 kernel.spl.debug.panic_on_bug = 0 kernel.spl.debug.path = /tmp/spl-log kernel.spl.debug.console_ratelimit = 1 kernel.spl.debug.console_max_delay_centisecs = 60000 kernel.spl.debug.console_min_delay_centisecs = 50 kernel.spl.debug.console_backoff = 2 kernel.spl.debug.stack_max = 0 kernel.spl.vm.minfree = 11263 kernel.spl.vm.desfree = 14078 kernel.spl.vm.lotsfree = 16894 kernel.spl.vm.needfree = 0 kernel.spl.vm.swapfs_minfree = 65536 kernel.spl.vm.swapfs_reserve = 1024 kernel.spl.vm.availrmem = 136780 kernel.spl.vm.freemem = 126125 kernel.spl.vm.physmem = 524288 kernel.spl.kmem.kmem_used = 4350364 kernel.spl.kmem.kmem_max = 9690970 kernel.spl.kmem.vmem_used = 4457440 kernel.spl.kmem.vmem_max = 4473824 kernel.spl.kmem.slab_kmem_total = 14577664 kernel.spl.kmem.slab_kmem_alloc = 3274440 kernel.spl.kmem.slab_kmem_max = 12171464 kernel.spl.kmem.slab_vmem_total = 1176010752 kernel.spl.kmem.slab_vmem_alloc = 38461920 kernel.spl.kmem.slab_vmem_max = 1102897632
SELinuxがenforceだと zfs create したときに mount エラーになるので Permissive にしとく方が無難ぽい。
性能軽く測って、テスト用DBのデータ置き場とかパッチ適用テストに使うつもり。
zdbがあるのがすばらしい、、が、そういえば性能ってどーはかったものか。昔みた arcstat.pl ってkstatベースだからLinuxじゃ使えないじゃんか。
・・・と思ったら https://github.com/zfsonlinux/zfs/issues/179 に書いてあった。後、/proc/spl/kstat/zfs/arcstats に出ているので、こっちから値をとるように書き換えてしまってもいいかもしれない。というか、そうするか。。
※追加その1:arcサイズの調整はこの辺 https://github.com/zfsonlinux/zfs/issues/676 みて、設定できるらしいのがなんとなく分かった。1.5G設定。
options zfs zfs_arc_max=1572864000
※追加その2:arcstat.pl のやっつけ修正も一応できた。
# diff arcstat.pl arcstat.pl.org 1c1 < #!/usr/bin/perl -w --- > #!/usr/perl5/bin/perl -w 46a47 > use Sun::Solaris::Kstat; 104a106 > my $kstat = Sun::Solaris::Kstat->new(); 207,211c209,210 < my %kstatdata = (); < open(IN, "/proc/spl/kstat/zfs/arcstats"); < while ( my $line = <IN>) { < my @items = split /\s+/, $line; < $kstatdata{$items[0]} = $items[2]; --- > if ($kstat->update()) { > printf("<State Changed>\n"); 213,215c212 < close(IN); < < my $hashref_cur = \%kstatdata; --- > my $hashref_cur = $kstat->{"zfs"}{0}{"arcstats"}; 218,219c215 < next if $key =~ /^[0-9]/; < next if $key =~ /^name/; --- > next if $key =~ /class/;
Oracleのアラートログ類を1箇所に集めたかったお話
開発系なんかもあわせると10台以上のOracle動かしているサーバの面倒見ているわけで、アラートログ監視が面倒なわけです。
EnterpriseManager買えばいいじゃんとか、世の中ログ監視ツールは幾らでもあるのでそれを使うという手もあるんですがfluentを使ってみたかったのでやってみたというメモ。
「ログ監視を1箇所でやることで、アラート出すなりIRC出すとかアラート対象の選別や送信先メールなどのメンテを(個人的に)やりやすく」というのが目標。実はログ出力場所を全部NFSにすれば良いというお話があったりするけど、そこは目をつぶる。
fluentを使うのをベースとして、一番単純に構成するとこうなるかと思う。
ログファイル ↑ fluentd(ここでログげっつ) ↓ fluentd(こっちで受け取る) ↓ fluent-plugin-notifier や irc や ikachan で好きにやる
ただ、今回は↓のようなことを考えていました。fluentはログ収集に注力してもらって、残りは昔のツールを流用。
- 以前作った snmptrap を irc に出すツールがあったのでそこはそのまま使いたかった。
- ログファイルを監視するfluentについては、DBサーバで動かすことになるのでなるべく軽量でシンプルなものにしたかった。
- DBサーバにはSolarisもあるのでそちらでも動かしやすそう…というのもちょっとだけ考慮
ということで大雑把にツール構成を書くとこうなる。
ログファイル ↑ fluent-agent-lite(ここでログげっつ) ↓ fluentd(こっちで受け取る) ↓ Kyoto Tycoon(memcahcedプラガブルサーバ キューモード) ← snmptrapd ← サーバとか ↓ IRC や メールに通知
で、fluentd から kyototycoon に memcachedプロトコルで書き出すプラグインが…プラグインがパッと見る限り見つかりません。
ということで、尊敬する@tamtam180さんのarangoプラグインとredisプラグインを元に、その部分は自作。まだテスト書いてないので正式プラグインとしては出せないんですが、とりあえず動きます。これ。
使ってる設定はこんな感じ。syslogもついでに引っ張ってきてます。
## fluent-agent-lite 側 LOGS=$(cat <<"EOF" oracle.dbaleert.hostname /u01/app/oracle/diag/rdbms/sid/sid/trace/alert_sid.log oracle.asmaleert.hostname /u01/app/grid/diag/rdbms/+asm/+ASM/trace/alert_+ASM.log system.hostname /var/log/messages EOF ) ## fluentd 側 <source> type forward </source> <match oracle.**> type copy <store> type file_alternative path /log/oracle/alert.%Y%m%d.log output_include_time false buffer_type file buffer_path /log/oracle/oracle_alert.*.buffer flush_interval 5s </store> <store> type ktmemqueue host localhost port 11211 inputkey fluent </store> </match> <match system.**> type copy <store> type file_alternative path /log/system/system.%Y%m%d.log output_include_time false buffer_type file buffer_path /log/system/system.*.buffer flush_interval 5s </store> <store> type ktmemqueue host localhost port 11211 inputkey fluent </store> </match> <match ping.**> type copy <store> type ping_message_checker tag error.ping notifications yes check_interval 60 notification_times 2 </store> <store> type file_alternative path /log/ping/agent_ping.%Y%m%d.log buffer_type file buffer_path /log/ping/agent_ping.*.buffer flush_interval 5s localtime output_include_time true output_include_tag false output_data_type attr:data </store> </match> <match error.ping> type ktmemqueue host localhost port 11211 inputkey fluent </match>
あと割り切っている点があります。
- fluentdで受けるところでメッセージ到達性で全く問題ないか?という点
- fluent-agent-liteにすることで、position覚えができないため fluent-agent-lite が長時間ダウンすると転送できないログが発生する点
メッセージ到達性が確実なら嬉しいですがログ監視なので、まあ本気で何か起きたらメッセージは沢山出るでしょうということで1メッセージもロスして欲しくない…みたいな完全性は求めていません。fluent-agent-liteがtail -Fベースで動いているので位置覚えないため、fluent-agent-liteが落ちると、ログ転送に抜けが起きやすい。ただ、そこはping-messageで監視することでなるべく早く気づこうねという方針です。そんな事態になったら、どうせサーバに入って確認することになると思うので。
まあこんな構成誰が使うんだ?という気がしますが、こんな構成を作れたのも fluentd や kyoto tycoon や tagomorisさんが作った膨大なプラグインのおかげで、感謝感謝!です。
※参考
Kyoto Tycoon(memcahcedプラガブルサーバ キューモード) は こちら http://fallabs.com/blog-ja/promenade.cgi?id=133
dstat で iostat の await 相当を取る
※まだいじってる最中なので間違いが多分に含まれている可能性あり。というか多分間違ってます。ほとんど自分の備忘録。
dstat で await 相当を取るプラグインはそのままだと正しく動かなそうというお話。
python真面目に見たの初めてだったので苦戦した。。
- プラグイン
https://github.com/dagwieers/dstat/blob/master/plugins/dstat_disk_wait.py
(修正してみたもの) https://github.com/mhnsr/work/blob/master/dstat_disk_wait.py
- 出力のおかしいところ
何故か IO しているのに 0.0 が出る。iostat結果と全然合わない。
- 分かったこと
await を計算しているところが long 同士で計算しているので計算結果も多分long。結果、小数点以下がバッサリ削られている。
rwait,wwait を try ~ except ZeroDivisionError の1ブロックで全部処理しているので、rwait,wwaitどちらか一方でもIOPS 0だと結果が 0 に塗りつぶされてしまう。
- 現状のパッチ状態
diff -w dstat_disk_wait.py dstat_disk_wait.py.org 69,81c69,77 < rd_ios = self.set2[name][0] - self.set1[name][0] < if rd_ios: < rd_await = float((self.set2[name][1] - self.set1[name][1])) / float(rd_ios) < else: < rd_await = 0.0 < < wr_ios = self.set2[name][2] - self.set1[name][2] < if wr_ios: < wr_await = float((self.set2[name][3] - self.set1[name][3])) / float(wr_ios) < else: < wr_await = 0.0 < < self.val[name] = ( rd_await, wr_await ) --- > self.val[name] = ( > ( (self.set2[name][1] - self.set1[name][1]) * 1.0 ) > / > ( (self.set2[name][0] - self.set1[name][0]) * 1.0 ) > , > ( (self.set2[name][3] - self.set1[name][3]) * 1.0 ) > / > ( (self.set2[name][2] - self.set1[name][2]) * 1.0 ) > )
- 残りの課題
この状態でテストしていると Readのみ、Writeのみの時の await 結果は iostat と大体一致するが、Read/Write を同時発生させた場合の rwait+wwait の数字が iostat の await とどうも一致しない。sysstat側ソースも単純に足し合わせている感じなので差の発生原因が不明。もう少し計算結果の正確性についてテストが必要そう。
sysstat 10.x 系で r_await, w_wait を出してみたところ、こちらの結果は大体あってる状態。なので累積させるところの計算式を見直せばいいか、もうこのままでも良いかなと思う。
とりあえずここまで。
MyNA(日本MySQLユーザ会)会 2013年3月に参加してみた
sh2ndさんがお話するということでこれは聞きに行かねば!ってことで行ってきました。
最後にblogに書く宿題が出ていたのでメモとして書き残しておきますw
- sh2ndさん
http://d.hatena.ne.jp/sh2/20130304 の続き。
5.6からのOptimizer traceを活用しつつ、結合SQLのオプティマイザ判定に泣かされたお話でした。
MySQLで結合を使うSQLは辛い印象がありますが、5.6でも傾向としては残るの…かなという印象。
InnoDBのオプティマイザ周りのソースまでいじってチューニングしてみたsh2ndさん流石です。
- yoku0825さん
資料はこちらだそうで http://www.slideshare.net/yoku0825/mysql-clients
mysql_config_editorは初めてみました。OracleだとWalletでやる感じの事ができる、というかOracleがメンドイ。
mysqlbinlogでのリモートバイナリログ転送を使ってるところを初めてみました。mysqlbinlogのコネクションが残る?というお話が会場ではありましたが、その後「FLUSH LOGSで綺麗になる」というフォローがされています。
参考:http://d.hatena.ne.jp/hiroi10/20121113/1352834517
…とここでnippondanjiさんになるはずがPCの具合がイマイチで順番変更。LT系を先にやることに。
- 木村さん
ps_helper(http://www.markleith.co.uk/ps_helper/)が紹介されてました。
こんなのもあるんですね~。会社のMySQLの面倒を見ることが多いチームの人たちに展開しよう。
- Kajiyamaさん
MySQLConnectが今年もあるって話や、MySQL Cluster NoSQL API for Node.js がそろそろ見せれるようになるのでデバッグ募集中w的なお話が。
参考:http://dev.mysql.com/tech-resources/articles/cluster-7.3-dmr.html
nippondanjiさんの方がまだってことで、急遽来ていたきのしたさんが引っ張り出されてミニトーク。
- トリでnippondanjiさん
5.6の機能~デモの流れのはずだったんですが、殆どmysqlsandboxのデモになってましたw
sandboxはいろんなバージョンや、debug版入れたりして切り替えてテストとかするのにはとても便利そうに感じました。
zfs なホストでnfs動かして、sandbox 環境の置き場所を NFS にすれば、zfs snapshot / rollback 構成&sandboxで、開発環境については好き放題できそうな環境があっという間に…みたいな。
http://mysqlsandbox.net/ とりあえず入れるのはcpanm MySQL::Sandbox一発で簡単なので、あとはmysqlのtar.gzをかき集めればとりあえず試すのはできそう。
- 思ったこととか
fluentでスロークエリをout_execに投げ込んで、.mylogin.cnf を活用すれば optimezer trace をサクっと取れるようにできたりしないかな?と思ったりしましたが、スロークエリからoptimezer traceにSQL文を正しく渡すところが面倒かな?やればできそうな気はしますが。
Oracle Walletについてはこれ。
http://docs.oracle.com/cd/E16338_01/license.112/b56284/editions.htm#CJAHFHBJ
http://docs.oracle.com/cd/E16338_01/network.112/b56285/authentication.htm#CHDHGAIJ
色々勉強になるお話が聞けて楽しかったです。最近Oracleでもソースみせてくれ…と言いたくなるようなオプティマイザの不思議な問題にぶち当たることが多いので、sh2ndさんの言っていた、MySQLならソースを追って確認できるのは~の内容はすごく同意です。ただ、MySQLにはできればソースをいじらずにオプティマイザ周りのチューニングが出来るくらいには進化してほしいとは思いますw
munin-2.0.9 インストールメモ
Munin2.0.x系をソースから入れてみたというメモ。
これでいいのか不明?な点も満載。まあ手元のリソースモニタで使う分には動けばいいか。。というのはあるけれど。
Cent 5.8ベース。
※2013/2/11 追記
munin-asyncd を使う場合 DB_File.pm が必要で、そのためには db4-devel が必要だったので追加。
Net/Server.pm の問題は "Fixed in 2.007" とあるので、最新の Net::Server ではfixしているようです。(試してません)
■OSパッケージ
rrdtoolは Alien::RRDtool で入れちゃうので、そのために必要そうなものを適当に入れる。
gcc は入ってなかったので適当に入れた。
yum install gcc44 yum install gcc44-c++ yum install gcc yum install gcc gcc-c++ yum -y install yum-priorities vi /etc/yum.repos.d/CentOS-Base.repo wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm rpm -ivh epel-release-5-4.noarch.rpm vi /etc/yum.repos.d/epel.repo yum install net-snmp-perl yum install rrdtool-perl yum install git yum install -y pkg-config yum install -y gettext yum install -y glib yum install -y xml2 yum install -y pango yum install -y cairo yum install -y cairo-devel yum install -y pango-devel yum install -y glib-devel yum install -y libxml2-devel yum install -y openssl-devel yum install -y db4-devel
■perl
本当は perlbrew にしたほうがいいんだろうけど。
./Configure -Dcc=gcc44 -des -Dprefix=[適当に]/munin-perl-5.16.2 make make test make install
■cpanm
パス通すのが面倒なので、インストールした [適当に]/munin-perl-5.16.2/bin に放り込む
■モジュール類
近場のミラー(http://ftp.nara.wide.ad.jp/pub/CPAN)を見るようにしてみた
・rrdtool cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Alien::RRDtool ・master cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Time::HiRes 不要 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Storable cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::MD5 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN HTML::Template cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Text::Balanced 不要 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Params::Validate cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Date::Parse TimeDate (Date::Parse で) cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SSLeay (要:openssl-devel) cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Getopt::Long 不要 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN File::Copy::Recursive cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN CGI::Fast 不要 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IO::Socket::INET6 エラー→テスト→-f強制インストール cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Log4perl cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN IPC::Shareable cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Log::Dispatch::FileRotate cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN MIME::Lite cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sender cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Sendmail cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Mail::Cap MailTools (cpanm Mail::Cap) 不要 ・node cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::Server cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::Server::Fork 不要 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Time::HiRes 不要 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Net::SNMP cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Crypt::DES cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::SHA1 cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN Digest::HMAC cpanm -L muninlibs Net::SSLeay 不要(前で入れてるので) cpanm --mirror http://ftp.nara.wide.ad.jp/pub/CPAN DB_File asyncdで使う
■Munin本体
これで良いか全然分かってない点。
Makefile.config いじって make -> make install …が基本だけど、幾つかハマった。
・sbin 下の「munin-node munin-node-configure munin-run munin-sched」の perlパスが置換されない
→とりあえず手で直した
・munin-node.conf に「default_plugin_user default_plugin_group」が無いとこんなエラーが出る。
→munin-node.conf にとりあえず書いてみた。
2012/12/25-17:03:28 [10787] Error output from cpu: 2012/12/25-17:03:28 [10787] Use of uninitialized value $service_user in concatenation (.) or string at /~/Munin/Node/Service.pm line 151. 2012/12/25-17:03:28 [10787] User '' required for 'cpu' does not exist. at /~/Munin/Node/OS.pm line 182. 2012/12/25-17:03:28 [10787] Service 'cpu' exited with status 29/0.
・Net/Server.pmでエラー
→バグ報告あるっぽい?とりあえず修正を手パッチしたら発生しなくなった。
→http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=693320
→https://rt.cpan.org/Ticket/Display.html?id=78828
2012/12/25-17:35:12 CONNECT TCP Peer: "[127.0.0.1]:55955" Local: "[127.0.0.1]:4949" Use of uninitialized value in pattern match (m//) at /~/Net/Server.pm line 600.
確認して無さすぎだけど、とりあえずここまで。
munin-cronがエラーなしで通るようになりましたよ…っと。