グリーの大規模分散ストレージ戦略(nanofs) Vol.2

はじめに

グリー株式会社でエンジニアをしておりますkgwsと申します。
今回は、前回に引き続き分散ストレージ(nanofs)のHTTPメソッド毎の処理を紹介させていただければと思います。

nanofsは5つのHTTPメソッド(GET、PUT、DELETE、HEAD、MKCOL)をサポートしております。今回は主なGET、PUT、DELETEの3つについてご説明させていただきます。

まずは構成のおさらい


nanofsは、主に3つのプロセスで構成されております。

  • nanofsd(dispatcher)

    • アプリケーションサーバからリクエストを受け取り実際に保存されているnanofsnに振り分ける
    • 5つのHTTPメソッドをサポートしている(GET、PUT、DELETE、HEAD、MKCOL)
    • データベース(KVS)に保存したデータの情報を送る
    • queueに処理の指示を送る
  • nanofsw(worker)

    • queueに送られた指示にしたがい非同期に処理を行う
    • 複数のnanofsnにデータをコピーする
    • nanofsnに保存されているデータを削除する
  • nanofsn(node)

    • データを保存する

GETメソッド


GETメソッドはシンプルな処理となっている。非同期処理をするnanofswとqueueは処理を行わない。

  1. nanofsdでHTTP GETリクエストを受け取る
  2. データベース(KVS)から画像情報を取得する

    • 保存されているnanofsnサーバのid
    • 保存されているnanofsnサーバのファイルパス
  3. データベースにデータがなかったときはHTTPステータス404(Not Found)を返す
  4. 保存されているnanofsnサーバが複数あるときは設定されているアルゴリズムでサーバを選ぶ

    • 今のところランダムで選択とapacheのRequest Countingに対応しております
    • もしも選択されたnanofsnサーバがダウンしているときは保存されている別のnanofsサーバを選びなおす
  5. 保存されているnanofsnサーバからHTTP GET通信でデータを取得
  6. アプリケーションサーバにHTTPレスポンスを返す

PUTメソッド

  1. nanofsdでHTTP PUTリクエストを受け取る
  2. 保存するnanofsnサーバを選ぶ

    • 今のところランダムで選択とapacheのRequest Countingに対応しております
    • もしも選択されたnanofsnサーバがダウンしているときは別のnanofsnサーバを選びなおす
  3. 選ばれたnanofsnサーバにHTTP PUTリクエストで保存する
  4. データベース(KVS)に画像情報を格納する

    • 保存したnanofsnサーバのid
    • 保存したnanofsnサーバのファイルパス
  5. コピーの指示をqueueにENQUEUEする
  6. アプリケーションサーバにHTTPレスポンスを返す
  7. queueがらnanofswがDEQUEUEする
  8. データベース(KVS)から画像情報を取得
  9. 保存されているnanofsnサーバからHTTP GETリクエストでデータを取得
  10. 別のnanofsnサーバにデータをコピーする

DELETEメソッド


  1. nanofsdでHTTP DELETEリクエストを受け取る
  2. 削除の指示をqueueにENQUEUEする
  3. アプリケーションサーバにHTTPレスポンスを返す
  4. queueがらnanofswがDEQUEUEする
  5. データベース(KVS)から画像情報を取得
  6. データベース(KVS)から画像情報を削除
  7. 保存されているnanofsnサーバからHTTP DELETEリクエストで削除する
  8. 保存されている画像は複数のnanofsサーバにあるので全台削除していく

さいごに

前回記事にて多大なる反響ありがとうございました。準備ができ次第nanofsのソースコードは公開させていただきます。
ご意見・ご感想は公式ハッシュタグまでお願いいたします。#nanofs