2017/10/27 モニタリング勉強会の資料です https://mackerel-ug.connpass.com/event/68478/
Mackerel in Hatena Platform Team2017-10-27
View Slide
id:motemen● 株式会社はてな CTO● 元 Mackerel ディレクター● アプリケーションエンジニア● Go と Git が好きです
Mackerel とは
History of Mackerel2007 はてな社内サーバ管理ツール2013 クラウドサーバ監視サービス 開発開始2014 Mackerel チーム結成2014-05 ベータリリース2014-09 正式リリース2016-06 連続リリース100週達成
Mackerelにおいて、サービスとはホストを運用する上でもっとも大きな単位です。通常、複数のホストがそれぞれの「役割」(→ ロール)を担当し、協調しあってひとつのサービスを形づくります。関係しあうホストをひとつのサービスに属するものとしてまとめることで、ホストの管理・監視が容易になります。
ロールはサービスに所属するホストをさらにその「役割」(アプリケーション、データベース、etc…)によって分類する概念です。Mackerelではホストの状況をロールごとにまとめて可視化することができます。
App App AppDB DBWeb Web WebBatchService
mackerel-agent● 各ホストで稼働する小さなプロセス○ ホストを Mackerel に登録○ 自動的に基本的なメトリックを投稿● github.com/mackerelio/mackerel-agent
Installing mackerel-agent● mackerel-agent.conf○ 追加のメトリック○ カスタマイズされた監視○ ホストに紐づくサービス/ロールwget -O - https://mackerel.io/file/script/setup-all-apt.sh | sha
API● サービス・ロール一覧● ホスト情報の取得・更新● メトリック投稿・取得
mkr● github.com/mackerelio/mkr● Mackerel API のコマンドラインインタフェース○ mackerel-agent の動くホストなら API キー指定不要mkr hosts -s Hatena-Star -r db-slave | jq 'map(.name)'
メトリック● ホストメトリック○ 1 ホストの稼働状況○ ソフトウェアの状態● サービスメトリック○ サービスの稼働状況○ ビジネス上のメトリック
メトリック(ロール)● ロール内のホストを○ 比較○ 積み上げ
プラグイン● github.com/mackerelio/mackerel-agent-plugins● Linux (fork, netstat), inode● Docker, Elasticsearch, fluentd, MySQL, nginx, ...● AWS: CloudFront, DynamoDB, RDS, ...
監視● ホストメトリック監視● サービスメトリック監視● チェック監視● 外形監視● 式監視
通知チャンネル● さまざまな通知サービスに対応○● アラートだけでなく、Webから手動でグラフ画像の共有も
通知グループ● 通知チャンネルとサービスを紐付ける● チームのSlackチャンネルに、興味あるサービスのアラートを
Mackerel inHatena PlatformTeam
組織構造OpTeamDevTeam 1DevTeam 2DevTeam 3Service BService AService C Service D
サービスプラットフォームチーム● ユーザ向けサービスの基盤● と、古いサービス● ほぼオンプレミス● ビジョン: 既存のシステムの解体と再生○ 現在はインフラ的な事情由来のタスクが主
SPF: システム特性● 巨大な・結合したモノリス● 全貌の正確な理解は難しい● Devs / Ops でともに理解しながら手なづけていく過程
Devs と Ops のあいだ = Mackerel● システムを観察する方法はさまざま● その橋渡しとなるのが Mackerel● 1 ウェブサービスが Mackerel 上の 1 サービスに対応
アプリケーション / 外からの観察● 外形監視● サービスメトリック
HTTP 外形監視● 最低限の監視として● SSL 証明書の有効期限監視も可能● サービスに紐付ければ、レスポンスタイムの監視も
HTTP レスポンス / サービスメトリック● より詳しいステータス状況● fluentd で収集・集計○ fluent-plugin-mackerel○ レイテンシ■ average, 90/99 %ile○ ステータスコード■ percentage, count
Platform-API サービス● 複数のサービスに渡るAPIエンドポイントを一箇所に集約● チームのAPIカタログに
アプリケーション / 内からの観察● ホスト死活● ホストメトリック
ホスト死活● 最低限の監視として● mackerel-agent が起動すると自動的に監視
ホストメトリック● ビルトイン: Loadavg, CPU%, Memory, Filesystem, ...● OS やミドルウェアに合わせたカスタムメトリック● 監視よりは観察用
静的なシステム理解● アプリケーションのソースコード● コードとして表現されたインフラ
AppServer ConfigurationMiddleware ConfigurationApplication ApplicationServiceAppDevsOps
Service/Role 世界観● リポジトリが Service/Role 対応○ hatena/Hatena-Identity● リポジトリ中のディレクトリが Service/Role 対応○ nginx-config/Hatena-Identity/backend/nginx.conf○ chef/cookbooks/service-identity/recipes/backend.rb
監視: 一般的なホストメトリック● Connectivity● Filesystem%○ 特定の Service/Role では無効に
監視: ロール固有のメトリック● db (MySQL)、worker (TheSchwartz)、…● chefレシピでロールに合わせてカスタムメトリックも設定● 監視の閾値は手でチューニング
監視: チェック監視● ホスト上でアプリケーション/ミドルウェアが正しく稼働しているか?● ミドルウェア設定ファイルの隣に配置
その他● イベントのグラフ投稿○ Dev: デプロイ○ Op: chef 適用● mkr でサービス事情の監視○ 旧: cron で DB 不整合の件数をメールで通知○ 新: mkr throw でサービスメトリック投稿、監視閾値設定
Example: Go App
● 既存 API の置き換え(Go)新規開発の例: APIサーバDB app nginx front nginx
設定した監視ポイント● 外形監視(レスポンスボディチェック)● nginx - app 間通信(専用エンドポイント + check-http)● app - DB 間通信(専用エンドポイント + check-http)● nginx: カスタムメトリック(mackerel-plugin-nginx)● app: カスタムメトリック(mackerel-plugin-gostats)● おまけ: app-version チェック
● 旧システムで、ロール全体の CPU% 減少● ホスト数も削減○ 積み上げグラフで、台数を抽象化置き換え後
非エンジニアとの会話にもグラフ
AppServer ConfigurationMiddleware ConfigurationApplication ApplicationServiceApp DevsOpsKPI, CostBusiness
Mackerel を使ってみて● Devs と Ops でシステムを理解していくための場● Service/Role 世界観による情報整理● Mackerel is for ...○ サーバ監視○ サーバ管理○ チームビルド