三角関数でサーバ再起動のタイミングを最適化、Cloudflareが仕組みを解説トラフィックの少ない時間をsin波に当てはめて予測、システムを実装して自動化

全世界300以上の都市にまたがるデータセンターのシステム再起動を自動化するため、Cloudflareはどのような最適化に取り組んでいるのか、公式ブログで解説した。

» 2023年08月02日 10時30分 公開
[@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 世界100か国以上、300以上の都市にデータセンターを運用するCloudflareのグローバルネットワークは、ダウンタイムゼロで継続的に更新されるよう構築されている。だが、サーバの再起動が必要になる場合もある。そのため自動的に再起動する仕組みも用意しているという。

 Cloudflareは公式ブログでシステム再起動に対してどのような仕組みを導入し、最適化を進めているか解説した。

再起動するのに最適なタイミングは、いつなのか?

 Cloudflareは顧客のトラフィックに混乱が生じないよう、幾つかの仕組みを用意している。その1つとしてデータセンター内のサーバに負荷を分散させる社内ロードバランサー「Unimog」があり、サーバが定期メンテナンスのために停止した場合でも中断が発生しない仕組みを構築している。

 SREチームは顧客のトラフィックが最も少ないときにのみデータセンターでの再起動を許可することで、リスクをさらに軽減している。各データセンターでメンテナンスの時間帯(メンテナンスウィンドウ)が定められており、通常は数時間の間、再起動などのメンテナンスが許可される。メンテナンスウィンドウをいつにするか決定するプロセスの自動化にも取り組んでいるという。

 データセンター内のロードバランシングフレームワークにより、トラフィックに影響を与えることなく、1日中再起動をさせるスケジュールを組むことは技術的には可能だが、Cloudflareでは運用上、データセンターごとに特定の時間帯に再起動させることを義務付けている。大規模なデータセンターで1日に全てのサーバが再起動されるのを避けるためのレートリミッターとして機能すると同時に、再起動中に発生した予期せぬ問題の修復をより簡単にするという。

 メンテナンスウィンドウをいつにするか決める最も合理的な方法として挙げられるのが、データセンターのトラフィックが少ないタイミングを選ぶことだ。しかし、トラフィックの傾向は常に変化するため、トラフィックの低い時間を選択することは困難であり、自動化すべきと判断した。

メンテナンスの時間帯をsin波の回帰モデルで決める

 トラフィックの少ない時間帯をどう特定し、メンテナンスウィンドウの作成と維持をどう自動化するか――Cloudflareでは、データセンターのCPUの利用パターンを2週間にわたって観測し、サインフィッティングをすることにした。サインフィッティングはデータの周期性や周期的な変動を把握する手法の1つで、以下の図に示すように、計測したデータをsin波に当てはめる方法だ。

サインフィッティングの例 サインフィッティングの例

 sin波を使用すると、最も一般的な谷を特定できる。Cloudflareでは、谷が発生する期間をメンテナンスウィンドウの候補として利用することにした。

再起動の仕組みをシステムとしてどう実装したのか

 任意のデータセットを曲線に適合させるために、Pythonのscipy.optimize.curve_fit関数を使用した。結果をより正確にするために、初期推定値として任意の値を含めた。

 Cloudflareは、Pythonで実装する方法の基本的な例や仕組みを次のように解説した。

timestamps = numpy.array(timestamps)
cpu = numpy.array(cpu)
guess_freq = 1 / 86400  # 24h periodicity
guess_amp = numpy.std(cpu) * 2.0**0.5
guess_offset = numpy.mean(cpu)
guess = numpy.array([guess_amp, 2.0 * numpy.pi * guess_freq, 0.0, guess_offset])
 
def sinfunc(timestamps, amplitude, frequency, phase, offset):
    return amplitude * numpy.sin(frequency * timestamps + phase) + offset
 
amplitude, frequency, phase, offset, _ = scipy.optimize.curve_fit(
    sinfunc, timestamps, cpu, p0=guess, maxfev=2000
)
Pythonで実装した際のソースコード
  1. データセンターのCPUの利用状況を特定期間にわたってPrometheusから取得
  2. SciPyライブラリのcurve_fit関数を使用して取得したデータをsin波に当てはめる
  3. グラフが十分に正確な場合、顧客の少ない時間帯をConsulにキャッシュし、他のメタデータとともに保存
  4. グラフが十分に正確ではない場合、フォールバックロジックを実行
  5. サーバが再起動を要求すると、システムは他のチェックを実行する前に、現在時刻がメンテナンスウィンドウに当てはまるかどうかをチェック
  6. ほとんどの場合、プリフェッチメカニズムが実装されているため、ウィンドウはすでに存在しているが、Consul セッションの期限切れやその他の理由によりウィンドウが存在しない場合は、PrometheusのCPUデータを使用して計算
再起動を実行するまでのフローチャート 再起動を実行するまでのフローチャート

フィットの3タイプ

 Cloudflareは今回の取り組みの成果として、主に3つのタイプがあると分析している。

1. データがフィットしないタイプ

 このタイプは顧客トラフィックを処理しないテストデータセンターで一般的だ。潜在的な問題を早期に発見するために、別のスケジュールを検討し、より高速な再起動が必要になる。

データがフィットしないタイプの例 データがフィットしないタイプの例

2. データはフィットするがゆがんでいるタイプ

 このタイプのデータセンターはsin波のトラフィックパターンが見られるものの、サイクル内に幾つかの小さな谷がある上、少しゆがんでいるため、精度は低下してしまう。

データはフィットするがゆがんでいるタイプの例 データはフィットするがゆがんでいるタイプの例

3. データが良くフィットしているタイプ

 明確なパターンと優れた適合性を備えたデータセンターの例。これは理想的なシナリオであり、多くのデータセンターが該当した。

データが良くフィットしているタイプの例 データが良くフィットしているタイプの例

 Cloudflareは今後、再起動だけではなくさまざまな取り組みに適用できるよう改善を続けていく予定としている。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。