システム障害との向き合い方 @sinamon129 #tokyogirlsrb
by
sinamon129
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
システム障害との向き合い⽅ !TJOBNPO
Slide 2
Slide 2 text
⾃⼰紹介 RiLi, inc. 取締役 CTO RailsGirls Tokyo 5-11th coach 7th organizer ͠ͳΜ @sinamon129
Slide 3
Slide 3 text
登壇内容を決めた経緯 • りさきゃん⽒からの要望 • 「個⼈的にはしなもんちゃんにごりごりテックな話をし てもらいたみ!!」 • いつもtechの中核を避けたような発表しかしてない • 特にOSS活動とかしてない(仕事が趣味みたいな) • これまでのエンジニア⼈⽣でインパクトがあったもの
Slide 4
Slide 4 text
前提⽂脈 • ⾃社プロダクト・C向け • 同じプロダクトを作るエンジニアは1 ~20⼈ぐらい • 仕様設計・開発・テスト・リリース・運⽤全て • いわゆるwebアプリケーション開発 • クラウドインフラ〜バックエンドまで
Slide 5
Slide 5 text
「システム障害対応」 を やったことある⼈?✋
Slide 6
Slide 6 text
どんな種類のシステム障害があるか • 開発時の実装ミス(バグ) • ⼿動操作のミス • アクセスがドッカン • 使ってるサービスの不具合 • など、これらの単⼀もしくは複合
Slide 7
Slide 7 text
システム障害対応とは 提供サービスが 「期待しない状態」に なっている時の対応
Slide 8
Slide 8 text
障害が起きてから収束するまで • (発⽣) • 発覚 • 調査 • ⼀次対応 • 収束 • ふりかえり(&恒久対応)
Slide 9
Slide 9 text
エンジニア⼈⽣において 障害対応で学んだことが 多い
Slide 10
Slide 10 text
⾃分のフェーズ別 障害対応
Slide 11
Slide 11 text
• あくまで私の経験。⼀例として。 • どういう⾵に障害対応と触れ合ってきたか • 「障害対応⾃分以外誰もできない」っていう相談に乗る ことがなぜか多いのでその辺の話にも触れます
Slide 12
Slide 12 text
障害対応と深夜対応はすごい⼈がやるとおもってた期 • 社会⼈1年⽬ • (当時)10年物のサービスの部署に配属 • ウェブアプリケーションエンジニア20⼈ぐらい • なかなかに⼤きなコードベース • エラーがメールで⾶んでくるがどうしていいか分からない • ⾃分がバグを仕込んだと指摘された時以外何もできず
Slide 13
Slide 13 text
障害対応と深夜対応はすごい⼈がやるとおもってた期 ベテランの⼈たちが対応してる、すごい 興味はあるけど分からなさそう ⾃分の仕事で精⼀杯 深夜メンテナンスって何やるんだろう
Slide 14
Slide 14 text
初⼼者期
Slide 15
Slide 15 text
状態 • 社会⼈2年⽬(転職して前職に) • ウェブアプリケーションエンジニア6⼈ぐらい • 「1⼈でどうにかできる状態」に早くなるのが⽬標 • できないことを減らすために奮闘
Slide 16
Slide 16 text
障害発⽣させてしまうと焦るけど • (しなもん)< やばいどうしよどうしよ あばばば • (せんぱい)< しなさん焦りすぎ・とりあえず落ち着いて。 何をしたら何が起きたの? • 先輩にしゃっと⾔われて冷静になるなどした • 焦るけど冷静になって対応した⽅が早く解決する • 落ち着いて⾒えるように⼼がけたら落ち着けるようになった
Slide 17
Slide 17 text
分からなくても参加する • (Slackにアラートがくる) • (しなもん)< おっアラートだぞ • (先輩たち)< これはxxxが原因かもですね • (しなもん)< 今何を⾒て⾔ってますか? • 何か起きた時にどこを⾒ればいいか・どう問題を切り分け ればいいかを学んだ
Slide 18
Slide 18 text
急がなくてもいい部分を担当する • ⼀次対応(とりあえずの復旧)が終わった後に障害報告 を書いて、根本解決をしたりすることがよくある • 発⽣原因を踏まえて次に起こらないようにする仕組みづ くりの部分をやらせてもらう • ⼀分⼀秒を争わないが、問題の近いところを理解でき る
Slide 19
Slide 19 text
先輩より早く原因特定するゲームを実施する • 脳内実施 • まず発⽣に最初に気づけるようにする • ⼿がかりになりそうなことを話し合いながら解決の⽷⼝を 集中して探す • ベテランの先輩より早く⾒つけられるとちょっと嬉しい • 何回もやってると段々切り分け⼒が上がる
Slide 20
Slide 20 text
やったことがないことに触れる • (せんぱい)< そろそろxxxxの変更をします • (しなもん)< それどうやってやるか知らないので、横 で⾒てていいですか? • 作業を解説してもらいながら、質問しながら横で⾒る • 最終的にドキュメントにまとめて、次の作業時に横で ⾒てもらいながらやれるようにする
Slide 21
Slide 21 text
少し慣れてきた期
Slide 22
Slide 22 text
状態 • 1年後ぐらい • 障害対応に参加したり深夜メンテに参加するのが⾃然に なってきた
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
問題の切り分けがスムーズになってくる • イレギュラーに沢⼭遭遇するうちに • 「これ、あの時に発⽣したやつだ!」 • 把握している範囲が増えて新種の切り分けも早くなる • インパクトの強い記憶は残りやすい • 解決できると成功体験が増える
Slide 25
Slide 25 text
障害対応で得た知識を⽣かせるようになる • 「発⽣する問題の原因」がインプットされる • ⾃分の実装時に気をつけることが増えた • テストを厚めに書く部分やDBへの影響を⾒る etc • (これまで苦⼿だった)先輩のコードレビューでどこ を⾒ればいいのかが分かってくる
Slide 26
Slide 26 text
難易度の⾼い障害に⽴ち向かう • 根本原因がわからないまま継続的に問題が起きることも ある • 詳しい⼈が周りにいない時とか特に • 苦しいが周辺知識の調査で理解が深まる
Slide 27
Slide 27 text
仕切り期
Slide 28
Slide 28 text
状態 • メンバーが増え、割と古株になってくる • 先輩が他のプロジェクトに配置されたりする • ⼤体の障害の発⾒・原因特定・修正をできる • チームメンバーにも対応してほしい
Slide 29
Slide 29 text
とりあえず発⽣したら叫ぶ • (しなもん)< うひょー • Slack or 物理 • アラートの通知をみたら、既読がわりに「おっ」 • ⾒てることを表明する • 問題が発⽣しているということがわかる
Slide 30
Slide 30 text
どこを⾒て何を考えたかを発信する • 新しくシステム触る⼈はベテランであっても、サービスド メインに近い情報は持ってない • xxのログを検索したんですけど • ooのグラフをみたら、xxが跳ねてて • ペア対応 • 横で切り分けてる様⼦を⾒てもらう
Slide 31
Slide 31 text
分かってても⾔わない • 時間を多少かけても問題ない時は答えを⾔わない • ロールバックで⼀時的に収束した場合の問題特定など
Slide 32
Slide 32 text
⼀⼈で対応しないための仕組み作り • 週替わり・⽇替わり等でon call担当を作る • SREっぽい組織化 • やらざるをえない状態を作るとやりやすい
Slide 33
Slide 33 text
まとめ • 障害対応は学びが多い • 戦⼒にならなくても良いのでまずは参加してみる • 発⽣した障害を学びにかえていく! • 解決⼒が上がったら積み重ねを伝授していく • ⼀⼈で解決せず対応できる⼈を増やしてヘルシーな障害 対応ライフを
Slide 34
Slide 34 text
すぐに解決できない 障害が起きた時にやること
Slide 35
Slide 35 text
例えば.. • リリース -> ロールバック -> 戻らない! • アクセス急増で • 徐々に積み重ねで増えたチリツモのデータがある⽇いき なり起爆剤に…
Slide 36
Slide 36 text
⼀⼈で解決・判断しようとしない • 対応できる仲間を呼ぶ • 「全体として被害が最⼩限になるには」を考えてから動 く
Slide 37
Slide 37 text
すぐ直せないと思ったらすぐに影響範囲に連絡する • (ユーザーさんに)お知らせ出す • 報告対象に連絡 • (対応者と報告対象をつなぐ)連絡担当を置く • 集中して調査しながら連絡のやり取りするの無理
Slide 38
Slide 38 text
できるだけ 障害対応を減らすには
Slide 39
Slide 39 text
コードレビュー • 条件分岐を意識する • if⽂の条件式逆めっちゃある • テストコードも逆さまの条件になってるとか割とある • 細かい書き⽅より条件があってるか • テストコードが間違ってるとテストがあってもバグる
Slide 40
Slide 40 text
コードレビュー • 副作⽤を意識 • 変更が意図しない他の部分に影響を与えるような実装 になってると危険 • ドメインロジックに詳しい⼈がレビューすると吉
Slide 41
Slide 41 text
コードレビュー • Active Recordで発⾏されるクエリを意識 • (データ規模によりますが) • ⼼配なところは発⾏クエリをみてexplainしたり • アクセスしてログ流して⾒て⾒たり
Slide 42
Slide 42 text
コードレビュー • redirect_to/renderのreturn忘れ • テストがないプロジェクトで後々⾒つかりがち • 1メソッド内で複数回呼ばれて500 • ⼀律でand returnをつけて安全側に倒すなど
Slide 43
Slide 43 text
コードレビュー • その変更、ロールバックできる? • ⽚道切符の変更は危険 • 何かがあってロールバックした時に被害が拡⼤しない か
Slide 44
Slide 44 text
安全に変更する仕組みを⼊れる • サーキッドブレーカーパターン • カナリアリリース
Slide 45
Slide 45 text
サーキッドブレーカーパターン • 「エラーレートがN%以上だったらこのエンドポイント へのアクセスをやめる」などを⾃動でするパターン • 「⼀定以上のエラーが起きる」などの条件で、ブレー カーを落としたり戻したりするようなイメージ • 何か起きた時に勝⼿に⾷い⽌めるような設定ができるの で便利
Slide 46
Slide 46 text
カナリアリリース • 新機能を⼀部のユーザーのみが使える状態にして段階的 にリリースしていく仕組み • 社内ユーザーのみ新機能の乗ったサーバにアクセスさ せるなどを⾏い、全ユーザーに影響が出ない形で新 バージョンの確認ができて便利
Slide 47
Slide 47 text
障害対応レポート • 何か障害が発⽣したら書く習慣をつける • 発⾒・分析・対処の知⾒が蓄積される • 読み合わせ&再発防⽌策は関係者以外もいるとよい • 「気をつける」は再発防⽌策にはならない • 気をつけなくていい仕組みを作っていく⽅に⼒を注ぐ
Slide 48
Slide 48 text
まとめ
Slide 49
Slide 49 text
システム障害との向き合い⽅ • 障害対応から学ぶことはたくさんある! • (初⼼者)怖がらずに落ち着いて参加する • (経験者)積み重ねを伝授する動きを⾏う • 「全体として被害が最⼩限になるには」を意識 • ⽇々の仕組みづくりで不必要な障害対応を減らす!