『High Performance MySQL 第4版』第2章まとめ:監視と信頼性エンジニアリング

技術系ノウハウ

『High Performance MySQL 第4版』を読んだ内容を章ごとにまとめています。
この章では「監視」と「信頼性エンジニアリング(SRE)」について整理しています。
MySQLの監視を「CPUやディスクだけを見る作業」から、「ユーザー体験を維持するための仕組み」として再定義していく章です。


第2章 監視と信頼性エンジニアリング

概要

本章では、MySQLを安定して運用するための「監視」の考え方を整理する。
特にSRE(Site Reliability Engineering:サイト信頼性エンジニアリング)の視点から、SLI(サービスレベル指標)SLO(サービスレベル目標) を用いて、システムの状態をどのように測り、改善していくかを解説する。
監視の目的は単なる「エラー検出」ではなく、お客様が快適に使える状態を維持すること にある。


SREの考え方とDBAへの影響

目的

SREの導入により、運用担当者(DBA)は「感覚的な判断」ではなく、「原則に基づく信頼性管理」を行うようになった。
SLOを明確に定めることで、どこまでを「許容できる障害」とし、どこからを「改善すべき問題」とするかの線引きが可能になる。

判断のための問い

  • どの機能が絶対に止まってはいけないのか
    (例:ECサイトの購入処理)
  • どの機能は一時的に止まっても致命的ではないのか
    (例:レコメンド機能)
  • 障害が発生した場合、どの程度の時間で復旧できるべきか
    (例:フェイルオーバー完了まで数分以内など)

SREでは「100%稼働」は非現実的であると考える。
重要なのは「どの程度の失敗を許容できるか」をあらかじめ定義することであり、それが SLO(サービスレベル目標) である。


信頼性エンジニアリング登場前の運用スタイル

従来の運用(Ops)

SREが登場する以前(2010年代前半まで)は、障害が起きてから対応する「反応的(Reactive)」な運用が主流であった。
監視対象は主にCPU・メモリ・ディスクといったサーバー資源に偏っており、ユーザー体験の視点はほとんど考慮されていなかった。

特徴

  • 障害発生後に手動で対応するスタイル
  • 監視は死活監視中心(ping応答など)
  • SLOや可用性目標は明確に定義されていない
  • 開発と運用が分離し、責任が分断される(DevとOpsの壁)

SREによる変化

SREは「運用をエンジニアリングとして扱う」という発想を導入した。
運用を定量的に評価し、信頼性を測定・改善・自動化のサイクルで管理する。

観点旧来のOpsSRE
アプローチ手動対応中心自動化とデータ駆動
目標障害を減らす信頼性を定義し維持する
監視項目CPU/メモリ/ディスクSLI(可用性・レイテンシ・エラー率)
判断基準経験・勘SLOに基づく意思決定
組織文化開発と運用が分断DevOpsとして協働

監視の基本指標(SLIとSLO)

1. 可用性(Availability)

  • サービスが利用可能な時間の割合を測定する
  • 外形監視(SELECT 1 の応答や、実際のデータ読み書き)で確認する

2. レイテンシ(Latency)

  • クエリの実行速度を測定する
  • サーバー内部の計測だけでなく、アプリケーション側で「ユーザーが体感する遅延」も計測する
  • ツール例:Datadog、SolarWinds DPM、Percona Monitoring and Management(PMM)

3. エラー率(Errors)

  • エラーの総数や割合を監視する
  • 短期間でのエラー率上昇は障害の兆候とみなす

代表的な指標

  • Lock wait timeout:ロック競合の増加を示す
  • Aborted connections:接続不安定やリトライ過多を示す

可用性とパフォーマンス監視の実践

可用性

  • Threads_running が増加し続けている場合は、クエリが滞留している可能性が高い
  • max_connections に近づいている場合は、接続過多によるパフォーマンス低下を警戒する
  • CPUコア数を超えるスレッド数が続くと危険である

レイテンシ

  • 遅いクエリは、ユーザー体験の低下を引き起こす
  • DatadogやPMMなどのメトリクスツールでクエリ実行時間を継続的に可視化する
  • 遅延の原因追跡には、分散トレーシング(HoneycombやLightstepなど) が有効である

壊れる前に気づくための監視(プロアクティブ監視)

目的

トラブル発生後に対応するのではなく、「壊れる前に異常を検知する」ことを目的とする。

主な項目

I/Oとディスク

  • IOwaitIOutil の継続的な高止まりは、全表走査や非効率クエリの可能性
  • ディスク増加率を監視し、閾値を超える前に通知を出す
IOwaitとIOutilの詳細

IOwait はCPUがディスクI/Oを待機している時間の割合を示す。

  • IOwaitが高いほどCPUは「待っている」状態であり、I/O性能がボトルネックであることを示す。
  • 高IOwaitはメモリ不足・スワップ・バックアップ処理の競合などが原因になる。

IOutil はストレージ装置がどれほど稼働しているかを表す指標である。

  • 100%に近い場合は、ディスクが常にリクエストを処理中であり、I/Oが飽和している。
  • 改善策としては、インデックス最適化・クエリ修正・ディスク性能向上などが挙げられる。

両者を組み合わせて監視することで、CPUが待っているのか、ディスクが詰まっているのかを見極めることができる。

バックアップとリストア

  • リストアにかかる実際の時間を計測しておく
  • 障害時に必要な復旧時間を正確に把握できる

接続数の変化

  • 時間帯やトラフィックの傾向に応じて、接続数を定期的に確認する
  • 増加傾向が続く場合は、設定や接続プールを見直す

AUTO_INCREMENTの枯渇

  • ID列の最大値に近づいていないか監視する
  • information_schema で残量を確認、またはPMMの -collect.auto_increment.columns で可視化

長期的なパフォーマンス測定

ビジネスリズムの理解

システム負荷は季節やイベントで変動する。
ECサイトであれば年末商戦、保険業界なら加入受付期間など、ピーク時でもSLOを維持できる設計が求められる。

平均値ではなく分布を見る

  • 平均値ではピーク時の問題を見逃す可能性がある
  • パーセンタイル(p95/p99) を用いて、上位遅延の傾向を把握する

継続的なトレンド分析

  • 短期的な指標と長期的な傾向を両方見ることで、拡張・最適化の判断がしやすくなる

SLOを活かした設計判断

SLOは単なる監視指標ではなく、設計やスケーリング判断の基準でもある。

  • SLOを維持できない場合は、データベースの分割(シャーディング)を検討する
  • 機能ごとにサーバーを分離するなど、負荷分散の再設計を行う
  • メトリクスとSLOの両方を見て、投資・改善の優先度を決定する

まとめ

  • SLI/SLOは固定ではなく、サービス成長や利用変化に応じて定期的に見直すべきである
  • 問題検出だけでなく、予防的な監視(I/O、接続数、AUTO_INCREMENT、バックアップ)に注力することが重要
  • まずは 可用性・レイテンシ・エラー率 の3つに焦点を当てる
  • 監視データをもとに、信頼性を「数字」で説明できる状態を目指す

業務での活かし方

  • SLOをチーム共通の指標として使う
    • 「何を優先すべきか」の判断を数値で共有できる
  • 監視ダッシュボードの整備
    • DatadogやPMMで主要指標を一画面に集約する
  • 予兆検知の仕組み化
    • 接続数やI/O利用率の異常をアラート化し、障害発生前に対応できるようにする
  • 長期データの活用
    • パフォーマンス傾向を分析し、次期インフラ設計や容量計画に反映する

🔙 前回:第1章 MySQLアーキテクチャ
tech-high-performance-mysql-ch01

コメント

タイトルとURLをコピーしました