
2026/04/17 23:29
Healthchecks.io は、今や自己管理型のオブジェクトストレージを採用しています。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026年3月に、Healthchecks.io は ping リクエストの本体 (>100kB) のオブジェクトストレージを、パブリッククラウドから Versity S3 Gateway と Btrfs を使用するオンプレミス環境へ成功裏に移行しました。この決定は、高額なコスト、AWS における CLOUD Act 準拠リスク、OVHcloud や UpCloud など他のプロバイダーにおけるパフォーマンス問題により導かれました。1 人のみのチームに対し運用複雑性が過剰であるため、Minio、SeaweedFS、Garage というオープンソース代替案を却下し、独立したメタデータデータベースなしにローカルの NVMe ドライブ上で動作する Versity S3 Gateway を選択しました。新しいアーキテクチャでは 1,400 万のオブジェクトを 119GB で管理しており、Btrfs(ext4 の代わりに選定され、イノード枯渇を防ぐため)経由で 1 秒あたり最大 150 回のアップロードをサポートしています。セキュリティと隔離性を確保するため、システムはプライベート IP でリスニングし、アプリサーバー同士は Wireguard トンネルを使用して通信します。データの耐久性は、2 時間おきにオフサイトバックアップサーバーへの rsync 同期によって維持され、暗号化されたフルバックアップを 30 日間保持します。このセットアップは、同時多発的なドライブ故障時にも最悪で 2 時間のデータ損失に耐えるように設計されています。移行により専用サーバーのレンタルに伴う運用コストが増加し、ウェブサーバーのボトルネックを防ぐことでレイテンシが大幅に改善されましたが、不安定な外部ベンダーへの依存関係を排除することで、重要な信頼性上の懸念事項を解決しました。
- 欠けている要素(あれば):なし
- 推論/飛躍(あれば):なし
- 改善された要約(必要であれば、そうでなければ上記と同じものを繰り返す):上記参照。
本文
Healthchecks.io の_ping_エンドポイントは、HTTP ヘッダー(HEAD)、GET および POST リクエスト方式を受け付けます。HTTP POST を使用する際、クライアントはリクエストボディに任意のペイロードを含めることができます。Healthchecks.io はリクエストボディのうち最初の 100 キロバイト分を保存します。リクエストボディが極めて小さい場合は、そのデータを PostgreSQL データベースに格納し、それ以外の場合は S3 互換のオブジェクトストレージに格納します。最近、マネージド型のオブジェクトストレージから自己管理型(セルフホスト)環境への移行を行ってみました。
マネージドタイプの選択肢について
2022 年、ping リクエストボディのオフロード処理としてオブジェクトストレージへの導入を検討した際、どのプロバイダーを選べばよいかを評価していました。
- AWS S3: レクエストごとの課金制であるため、Healthchecks.io の利用パターン(高頻度な PutObject 操作、十分なサイズ以上の_ping_ リクエストごとに一回の操作など)では割高になると考えられました。また、AWS がクラウド・アクト法に準拠しているため、データを AWS に渡す前に暗号化する必要があり、その点でも複雑さが増します。
- OVHcloud: 当初はこの選択肢を選びました。レクエストごとの手数料は課金されず、OVHcloud は欧州企業であり、パフォーマンスも良好に思えました。しかし残念ながら、時間の経過とともにパフォーマンスと信頼性の問題が相次いで顕在化し、使用経験が悪化するにつれて代替案の探索を始めました。
- UpCloud: 2024 年に UpCloud へ移行しました。OVHcloud と同様、レクエストごとの手数料は課金されず、欧州企業です。サービスの品質に明確な改善が見られました:S3 操作が速くなり、サーバーエラーやタイムアウトの発生頻度も減りました。しかし残念ながら、時間経過とともに UpCloud のオブジェクトストレージのパフォーマンスも低下する傾向があり、すべての操作が遅延してしまい、タイムアウト制限に達することがありました。特に S3 DeleteObjects 操作は次第に遅くなるばかりでした。そのため、再度代替案を探し求めました。その際にも、自己管理型(セルフホスト)システムの検討を含めていました。
要件
現在(2026 年 4 月)のデータ使用状況は以下の通りです:
- オブジェクト数:1,400 万件、容量:119 GB
- オブジェクトのサイズは 100 バイトから 100,000 バイト(約 100 KB)までばらつきがあります。平均サイズは 8 KB です。
- 平均で秒間に 30 回のアップロード操作があり、通常のスパイク時には 150 回/秒まで増えることがあります。
- アップロードされたオブジェクトと削除されたオブジェクトの入れ替え(チェーン)が絶え間なく発生しています。
候補となるオブジェクトストレージシステムは、この使用負荷をサポートし、将来の成長を見込んで十分な余地を持っている必要があります。ありがたいことに、まだすべてを単一システムに容易に収められる規模であり、フルバックアップのような操作も比較的高速に行えます。数テラバイトという要件が必要になると、話は複雑になります。
- 可用性と耐久性: Healthchecks.io の利用ケースにおいて、オブジェクトストレージはプライマリストアである PostgreSQL データベースほどミドルミッションクリティカルではありません。データベースがダウンすると、サービス全体が停止し、モニタリングアラートも出力されなくなります。一方、オブジェクトストレージがダウンしても、システム自体は機能したままですが、ユーザーがウェブインターフェースまたは API を通じて_ping_ボディを検証できなくなるだけです。一部の_ping_ボディを恒久的に失うのは望ましくありませんが、PostgreSQL データベースに入力されるデータの喪失と比較すれば致命的ではありません。
- 遅延: 短いほど良いです。Healthchecks.io のコードには、HTTP リクエスト/レスポンスサイクル中に S3 操作を実行する箇所があります。個別の S3 操作で数秒かかってしまうと、ウェブサーバープロセスが窒息(チョーク)してしまいます。UpCloud を使用していた際には、遅い S3 操作が大問題に発展することを防ぐために、いくつかの負荷制御(ロードシェディング)ロジックを追加する必要がありました。
自己管理タイプの選択肢について
Minio、SeaweedFS、Garage のいずれかでローカル環境での実験を行いました。これらに対する主な反対理由は運用上の複雑さでした。「始め方」の手順に従えば基本的なクラスターを立ち上げるのは難しくありませんが、実稼働準備のセットアップにおいては最低でも以下のことが必要となります:
- クラスターノードのセットアップを自動化すること、
- 更新手順を理解し、テストすること、
- 故障したクラスターノードを置換する手順を理解し、テストすること、
- クラスター固有の健全性に関するモニタリングとアラート設定を行うこと。
私が一人のチームであり、すでに自己管理型の Postgres、自己管理型 HAProxy ロードバランサー、自己管理型メールシステムを運用しているため、もう一つ意義のあるシステムの責任を負うのは避けるに越したことはありません。可能な限りシンプルでシンプルなものを選ぶのが望ましいです。
Versity S3 Gateway
Versity S3 Gateway は、ローカルファイルシステムを S3 サーバーに変換します。S3 PutObject 操作はファイルシステム上の通常ファイルを作成し、GetObject 操作は通常ファイルを読み取り、DeleteObject 操作はファイルを削除します。メタデータの格納に別のデータベースを必要としません。バックアップツールを使うことで、いつでもバックアップを取得できます。アップグレード手順も単一のバイナリ置換と systemd サービスの再起動だけで済みます。Go で書かれており、活発に開発が行われています。私が発見して報告したバグについても、わずか数日で修正されました。
Versity S3 Gateway とファイルシステムを裏付けストレージとして用いる際の最大の明らかな留意点は、もちろん可用性と耐久性です。オブジェクトは単一システム上に存在するため、事前に警告なしにどのタイミングでシステムが故障する可能性があります。このシナリオに対して準備しておく必要があります。
セットアップについて
2026 年 3 月、Versity S3 Gateway を採用した自己管理型のオブジェクトストレージ環境への移行を完了しました。
- S3 API: 専用サーバー上で動作し、プライベート IP アドレスをリスニングします。アプリケーションサーバーは Wireguard トンネルを通じてこれと通信します。
- ストレージ: オブジェクトはサーバーのローカルドライブ(RAID 1 構成の 2 つの NVMe ドライブ)に格納されます。
- ファイルシステム: オブジェクトは Btrfs ファイルシステム上に格納されています。Btrfs を使用することで、tiny ファイルを大量に保存する場合でも ext4 の場合のように inode 不足の問題がないという利点があります。
- 同期: 2 時間に一回、rsync プロセスが追加および削除されたファイルをバックアップサーバーへ同期します。
- バックアップ: 1 日に一度、バックアップサーバーがフルバックアップを取得し、暗号化してからオフサイト(別所)に保存します。過去 30 日分のフルダイトリ backups を維持しています。
このセットアップによれば、オブジェクトストレージサーバー上の両ドライブが同時に故障した場合でも、まだバックアップされていない_ping_リクエストボディの最大 2 時間は失う可能性があります。これは通常通り、追加の複雑性の代わりに向上させることも可能です。
結果について
自己管理型オブジェクトストレージへの切り替え以降、S3 操作の遅延は改善しました:
- オブジェクトストレージへアップロードを待機している_ping_ボディのキューが縮小しました。
- まだ可用性上の問題は発生しておりませんが、新しいシステムは数週間程度しか稼働していません。
- データサブプロセッサーのリストからエントリーが一つ減っています。
コストの方は増加しました:追加の専用サーバーをレンタルする費用は、マネージド型のオブジェクトストレージサービスで約 100 GB を保存するコストより高くなります。しかし、改善されたパフォーマンスと信頼性を考えればその分だけの投資です。
新しいシステムについては慎重だが楽観的な態度をとっており、全体として古いシステムよりも向上していると考えています。ただし、よりバランスの取れたトレードオフを持つシステムを見つけたら、再度移行することも開かれていることを付け加えておきます。
ご読感ありがとうございました。モニタリングをお楽しみください。 — Pēteris