さよなら Storm
-
Upload
nagomiso -
Category
Environment
-
view
266 -
download
0
Transcript of さよなら Storm
![Page 1: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/1.jpg)
さよなら Stormなごみそ@kawasaki.rb #046
![Page 2: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/2.jpg)
なごみそ
● @NagominHotMotto● 夏・冬の3日間だけ東京ビッグサイトで働いています
● 副業でSEっぽいことをしています
![Page 3: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/3.jpg)
3
Apache Storm とは
ストリーミング処理するための分散処理基盤
● 処理を 有向グラフ で記述する (Topology)
●耐障害性 が高い
● 色んな 言語 が使える (multi-lang protocol)
![Page 4: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/4.jpg)
Topology
SpoutSpout
BoltBolt
BoltBolt
BoltBolt
データを流す 流れてきたデータを処理
![Page 5: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/5.jpg)
5
耐障害性
データの再送制御
次のコンポーネントにちゃんとデータが届いたかを確認して再送する仕組みがある
プロセスの自動再起動
何らかの原因でプロセスが死んでも自動で復活する
フェーエルソフト
一部が死んでも処理は継続する
![Page 6: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/6.jpg)
Multi-lang Protocol
他の言語にSpout/Boltの処理を移譲できる
ShellShellBoltBolt
PythonPythonShellShellSpoutSpout
RubyRuby
Multi-lang (標準入出力)Multi-lang (標準入出力)
Stream
![Page 7: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/7.jpg)
![Page 8: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/8.jpg)
Multi-lang を使えばスクリプト言語を使って
お手軽に分散処理ができるね〜
分散処理が得意なフレンズになれるんだ!
![Page 9: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/9.jpg)
でも世の中そんなに甘くない
![Page 10: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/10.jpg)
Multi-lang はつらい
![Page 11: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/11.jpg)
Apache Storm が何回もシグナルを送る● Java のサブプロセス (multi-lang) 終了→ SIGTERM
● Storm Worker の終了→ SIGTERM
● Storm Supervisor の終了→ SIGKILL
正常終了でもエラーが…
![Page 12: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/12.jpg)
ふつうに殺したい
対処● SIGTERM 契機で終了シークエンス移行
– 1回目の SIGTERM で exit– rescue SystemExit でもろもろやる
– その前に SIGTERM を無視 するハンドラ登録
● 移譲先のプロセスの後始末が終わったら sync しまくる– Spout/Bolt に 俺は死んだアピール をする
– そうすると だいたい エラーがでなくなる
![Page 13: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/13.jpg)
一件落着!!
![Page 14: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/14.jpg)
じゃなかった....
![Page 15: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/15.jpg)
ある時 Topology にストリームが流れなくなった
![Page 16: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/16.jpg)
HAHAHA, RubyプロセスにSIGTERM送れば終了してくれるんだろ
(俺がそう作ったし)
![Page 17: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/17.jpg)
死なない!!!!
![Page 18: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/18.jpg)
よく調べたら
● Spout でエラーが発生して終了● ApacheStorm は Spout が死んでいると判断● ShellSpout が multi-lang 用の pipe を読まなくなる– Spout が ShellSpout に multi-lang でエラー報告をしようとする
– pipe が詰まる
– Ruby のガベージコレクタの io_flush_buffer_sync で止まる
– (ShellSpout は FD を握ったまま)
![Page 19: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/19.jpg)
ちなみに gdb でアタッチしてわかりました#0 0x00007f068e7707cd in write () from /lib64/libpthread.so.0#1 0x00007f068ebee9eb in io_flush_buffer_sync (arg=0x7f068feee180) at io.c:994#2 0x00007f068ebf3647 in fptr_finalize (fptr=0x7f068feee180, noraise=1) at io.c:4172#3 0x00007f068ebf3ca2 in rb_io_fptr_cleanup (fptr=0x7f068feee180) at io.c:4222#4 rb_io_fptr_finalize (fptr=0x7f068feee180) at io.c:4262#5 0x00007f068ebe1c45 in run_final () at gc.c:2064#6 finalize_list () at gc.c:2080#7 rb_objspace_call_finalizer () at gc.c:2212#8 rb_gc_call_finalizer_at_exit () at gc.c:2146#9 0x00007f068ebc7d1d in ruby_finalize_1 (ex=1) at eval.c:129#10 ruby_cleanup (ex=1) at eval.c:230#11 0x00007f068ebc7eed in ruby_run_node (n=<value optimized out>) at eval.c:310#12 0x00007f068ebc2bdb in main (argc=5, argv=0x7ffff21cbe38) at main.c:36
![Page 20: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/20.jpg)
終了シークエンス中は
SIGTERM を握りつぶす
ようにしたため
活かすも殺すも出来ない
![Page 21: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/21.jpg)
…...
![Page 22: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/22.jpg)
# kill -9
![Page 23: さよなら Storm](https://reader031.fdocument.pub/reader031/viewer/2022020119/58f9aed1760da3da068ba681/html5/thumbnails/23.jpg)
まとめ
● Storm は multi-lang で Sput/Bolt 処理の移譲ができる
● デフォルトだと作りが雑すぎるのでちょっとした工夫が必要
● 工夫しても駄目だった.......
● multi-lang は使っちゃ駄目● 他にも色々問題が発生