NIKKEI SYSTEM 2017.7 SRE メルカリ記事

障害対応

サーバ監視サービス「Mackerel」
https://mackerel.io/ja/

電話、メール、PUSH 通知サービス「PagerDuty」
https://www.pagerduty.com/
> エスカレーション可能

[サーバ]
 ↓
[Mackerel監視サービス]
 ↓通知依頼      ↓情報
[PagerDuty]    [Slack]
 ↓電話他
[SRE担当]

パフォーマンス向上

JSONファイルの読み込み
サイズ・種類最適化

自作メトリックス表示ツール「kurado」
https://github.com/kazeburo/Kurado

可視化サービス「NewRelic」
https://newrelic.com/
- 1リスクエスト中でDB、外部API処理
- SQL発行数と実行時間

アプリケションの動きの詳細トレース「strace」コマンド
http://blog.livedoor.jp/sonots/archives/18193659.html

自作PUSH通知ミドルウェア「Gurun」 GO言語
http://tech.mercari.com/entry/2016/11/08/170343

ログ収集/分析

ABテスト

ログ発生とともに「Fluentd」で集約サーバに転送
- リアルタイム集計
- S3バックアップ
- データ分析サービスへの送信

JSONを受け取る収集サーバ
「OpenResty」を採用
https://openresty.org/en/

JSON分解とログへの記録を OpenResty のLua で高速に実現

ログ転送エージェントはGo言語で実装した「fluent-agent-hydra」を利用
https://github.com/fujiwara/fluent-agent-hydra

可用性/スケーラビリティ向上

アプリにIPを書かずに「内部DNS」で管理
「内部DNS」でDNSラウンドロビンを実施してサーバ負荷分散

デプロイ

自動デプロイツール「Ansible」と Node.js を使用
https://www.ansible.com/
Ansible は Node.js から起動される

Slackチャット経由で「Ansible」に命令を送れるBOTを作成
デプロイスケジュールは「Google Calender」
チャットBOTが「Google Calender」にプルリクエストURLとともにリリース予定を追加

予定の時間になるとチャットBOTが「リリースして良いか」を聞いてくる
GitHubからのクローン、事前処理、rsync配布等の流れが Ansible の playbook(設定ファイル)に書いてある

[デプロイ用チャットBOT] ースケジュール確認→ [Google Calender]
[デプロイ用チャットBOT] ーリリースOK?→ [Slack]
[デプロイ用チャットBOT] ープルリクマージ→ [GitHub]
[デプロイ用チャットBOT] ーplaybook実行→ [Ansible]

セキュリティ

各サーバのエラーログに入力ミス発生を記載
Fluentdで集計してミドルウェア「Norikra」にデータを渡す。

「Norikra」
ログなどの情報を一定時間ごとに集計、その結果を別のミドルウェアに出力できるソフト
集計条件にSQL使用
https://github.com/norikra/norikra

ログイン情報の入力間違いの発生件数をNorikraで集計し、Mackerelでグラフを作成、アラートを上げるしきい値設定
サーバでも同一IPによるログイン攻撃は、IP自動ブロック機能あり
クローリングも同様にアクセス解析、アクセス数が上位のIPアドレスに関しては国情報を取得

[サーバ]
 ↓
Fluentd
 ↓ ログ入力
[Norikra] ← SQL
 ↓ 結果出力
Fluentd
 ↓
[Mackerel]
可視化とアラート