SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Developers Summit 2024 Summer レポート

計測と改善をひたすら繰り返したら、年間コストを1億円削減した──不確実性の高いプロジェクトに挑む

【24-A-7】年間一億円削減した時系列データベースのアーキテクチャ改善~不確実性の高いプロジェクトへの挑戦~

  • X ポスト
  • このエントリーをはてなブックマークに追加

課題の正体を見極め、プロジェクト開始

 LINEヤフーでは、Cassandraを406ノードの物理マシンから成る巨大なクラスタで運用していたが、レプリケーションやコンパクションの都合で、マシンを多めに用意しておく必要があった。その結果、年間1億数千万円もかかっていた。

 すぐに追加のサーバーを確保することができず、データが急増してもすぐにスケールアウトできない課題もあった。コストを下げたい、スケーラビリティを確保したい、運用負荷を下げたいといったことが要求となった。もちろん、データを失うわけにはいかないので、データの永続性も欠かせない要求だ。

 坂本氏は、「要求だけでは何も始まらない。要求を具体的な要件の形にしていかなければならない」と語る。そして要求を要件にしていく上で大切なことは、妥協できることと妥協できないことを明確にすることだと強調する。

 今回のプロジェクトではCassandraを完全に置き換えることは最初からあきらめた。坂本氏は、24時間以内のデータは従来通り内製のインメモリデータベースで処理し、2週間以内のデータはCassandra、2週間以降のデータを新しいストレージに保存する方針を立てた。一方で、今後の成長も考えるとスケーラビリティは欠かせない。もちろん、データの永続性も必要だ。運用負荷の軽減も妥協できないと考えたという。

 以上の判断から、具体的な要件を作成した。一部を具体的に挙げると、クエリのレイテンシはCassandraの1.5倍程度なら許容した。1営業日で必要な分をスケールアウトできるスケーラビリティを確保。そして、10億種類のMetricsを保持できて、3倍の成長に耐えられるキャパシティを求めることになった。

 プロジェクトが始まった後は、Design Docを作成し、それをもとにPoC(Proof of Concept)を開発。PoCを本番環境で試し始める。ここではそれぞれの段階ですぐに結果を出し、フィードバックを得て、次の段階につなげていくこと。これを、速いサイクルで繰り返すことが最も重要だとのことだ。こうすることのメリットとして坂本氏は「早く失敗できる」という点を挙げる。「2年かけていろいろ作ってきたけど、結局何も完成しませんでした」という事態に至る可能性を下げられる。

各段階でフィードバックを出して次につなげる。このサイクルをとにかく速く回すことが肝要
各段階でフィードバックを出して次につなげる。このサイクルをとにかく速く回すことが肝要

 そして坂本氏は、最初から完璧を目指す必要はないと強調する。完璧でなくても良いから、サイクルをとにかく回すこと、繰り返すことが大切だ。また、途中で戻っても良いということも坂本氏は強調した。

議論と合意形成に使う文書には何を書くのか?

 Design Docは「チームや関係者との議論や合意形成に必要なことを書くもの」と坂本氏は説明する。早期の方針やアイデア、実装方針、懸念事項をまとめた初期のドキュメントということになる。

 Design Docには、以下のようなことを書く。今回のプロジェクトでは、オブジェクトストレージを採用したいが、オブジェクトストレージは時系列データベース専用ではないので、データ構造を考える必要がある。複数のMetricsを1つにまとめて管理しなければならないが、どの位置に目的のSampleがあるのかが分かりにくくなる。そこで、転置インデックスの導入を考えた。任意のIDに対応するSampleが、ファイル上のどの位置にあるのかをバイト位置で記録するマッピングテーブルだ。

Sampleファイル内のデータの位置をバイトで示す転置インデックス
Sampleファイル内のデータの位置をバイトで示す転置インデックス

 複数のMetricsを1つにまとめると、Sampleファイルが大きくなってしまう。そこで、オブジェクトの一部をバイト範囲で指定し、その部分だけをダウンロード可能にするByte-Range Requestという機能を使うことにした。

 Sampleファイルが大きくなると、転置インデックスも大きくなってしまい、メモリを消費する。そこで、シャーディングでSampleファイルを分割することを考えた。さらに、オブジェクトストレージが低速であるため、クエリAPIにメモリベース、ディスクベース両方のキャッシュを組み込み、ダウンロードの回数を減らそうと考えた。

 ここまで決まったら、1つのバケットにどのくらいのオブジェクトが入るのか、データサイズはどれくらいになるのかといったことを詳細に計算する。さらに、APIやルーティングの構成などを図にしたハイレベルデザインをDesign Docに記述し、これをもとに技術的懸念を整理しながら議論する。

 関係者間で合意に至ったら、PoCに移行する。この段階では1週間以内で作れるようなごく簡単なスクリプトで作成する。実装と検証の際には、ダークローンチという手法を利用した。本番環境のAPIのやり取りを、開発中のシステムにもミラーリングするという手法だ。今回はCassandraのやり取りをオブジェクトストレージにもミラーリングした。

 こうすることで、オブジェクトストレージの性能だけでなく、返す結果がCassandraと一致するのかということを本番のデータで検証できる。本番環境のユーザーに影響を与えることはない。坂本氏は「ユーザーによって投げるクエリはまったく異なる。本番相当のクエリ、本番相当のデータ量で検証しないとあまり意味がない」と語る。

 今回はさらに「Feature Toggle」という仕組みも導入した。設定ファイルのブーリアン値を「false」にするだけで、デプロイなしで機能を一瞬で止めることができる。何か問題が発生しても一瞬でロールバックできるようにしておくわけだ。

次のページ
ひたすら繰り返すことが大きな成功への道

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Developers Summit 2024 Summer レポート連載記事一覧

もっと読む

この記事の著者

笹田 仁(ササダ ヒトシ)

 フリーランスのライター、編集者。IT、特にソフトウェア開発の話が好きです。 趣味はドラムを叩くこと。コロナ騒ぎでリハーサルスタジオに入りにくくなり、ちょこちょこと楽器を買うことでストレスを解消していたら、いつの間にか置き場所に困るほどになってしまいました。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

丸毛 透(マルモ トオル)

インタビュー(人物)、ポートレート、商品撮影、料理写真をWeb雑誌中心に活動。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20109 2024/12/12 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング