概要
- Tailscale のサービスで 大規模な障害 が発生した経緯
- 原因は SQLiteの深層バグ で、追跡と修正に数ヶ月を要した事例
- 障害の影響範囲や ユーザー体験への影響、信頼性の低下
- バグ特定のための 技術的な調査・対策 と、SQLite開発者との連携
- 最終的な バグ発見と修正 までの詳細なプロセス
Tailscaleのサービス障害の概要
- 2023年末から2024年初頭 にかけて、Tailscaleの 稼働率が不安定 となった事象
- コントロールプレーン の内部でシャードごとに SQLiteデータベース を利用
- 19回のデータベース破損 が6ヶ月間で発生、復旧や調査に多大な労力
- 破損時は コントロールプレーンの停止 が必要となり、該当シャードのtailnetが一時的に利用不可
- 影響範囲は一部だが、 信頼性の低下や顧客への不信感 を招く結果
SQLiteアーキテクチャとバックアップ体制
- 各シャードは 1プロセス・1データベース のシングルライター構成
- 数分ごとに全体スナップショットをS3へバックアップ する運用
- SQLiteは「 退屈な技術」として安定運用を期待していた
- 2023年8月、バックアップから データベース破損 が初検知
- PRAGMA integrity_check で破損を確認し、修復・原因調査を実施
問題発生時の影響範囲と対応
- コントロールプレーン停止により 新規デバイス追加や設定反映不可
- 既存接続は維持されるが、 ネットワーク変更情報が同期されない
- Web管理コンソールやAPIも一時利用不可
- インシデント発生時は グローバルなステータスページ で公開
- 影響ユーザーは限定的だが、 繰り返しの障害で信頼性低下
バグ調査と原因究明の困難
- コードの再確認・関連変更点の調査 も異常発見できず
- インシデント間の共通点も見つからず、 再現性のないバグ に苦戦
- ライブ環境でのフォレンジック・テレメトリ 導入による監視
- インシデント発生間隔が不規則で、 調査計画が困難
- SQLite開発元とのサポート契約 を締結し、共同で根本原因を追求
取った対策と新たなヒント
- 破損検知時の即時停止・自動復旧プロセスの強化
- PRAGMA integrity_checkの自動定期実行
- トランザクションログの導入 で、バックアップからの安全な復旧を目指す
- トランザクションログの再生時、 コミット済みデータが消失する事象 を発見
- これが SQLite内部の異常挙動 であることの重要な手がかりに
SQLiteのWALとチェックポイントの仕組み
- Write-Ahead Logging(WAL)モード で運用し、パフォーマンスと同時実行性を確保
- チェックポイント処理 を手動制御し、バックアップの一貫性を担保
- インシデント時、 WALファイルのページ数とコピー数の不一致 を観測
- SQLite開発者が 仮想ファイルシステム層のデバッグツール(tmstmpvfs shim) を新規開発
- ライブ環境にshimを適用し、 次回発生時の詳細ログ取得 を実施
WAL-Resetバグの発見と修正
- チェックポイントと書き込みトランザクションが競合 するタイミングで発生する レースコンディション
- チェックポイント処理が 一部ページをコピー済みと誤認識 し、実際には書き込みが消失
- これにより データベース破損と不可逆なデータ消失 が発生
- SQLite開発者がこのバグを “WAL-Resetバグ” と命名し、修正パッチを公開
- Tailscaleは 迅速に修正版SQLiteを適用 し、以降同様の破損は発生していない
障害から得た教訓と今後の取り組み
- 安定稼働を前提とした「退屈な技術」でも、未知のバグが潜むリスク
- ライブ環境での詳細な観測・外部専門家との連携 の重要性
- 自動復旧・監視体制の強化 によるユーザー影響の最小化
- 今後も 信頼性向上と透明性確保 に努める姿勢
- SQLiteコミュニティへの バグ発見・修正の貢献
以上が、TailscaleにおけるSQLite深層バグの発見と修正までの全体像です。