(57)【要約】【課題】ストレージシステムに記憶すべきデータに対してデータ暗号化を実行する技術を提供する。【解決手段】ホストマシン上で実行中のクライアントアプリケーションが、ストレージシステムにデータを書き込むためのデータストレージ書き込み要求を生成することができる。ホストマシン上で実行中のホスト側モジュールが、この書き込み要求を受け取る。ホスト側モジュールは、書き込み要求に対応するデータのための、データを構成するデータブロックを識別するために使用される一意の識別子である１又は２以上のフィンガープリントを生成するように構成される。ホスト側モジュールは、暗号化技術を用いてデータブロックを暗号化することによって暗号化データを生成する。その後、この暗号化データは、ストレージシステム内のストレージノードに送信される。この暗号化データに対し、１又は２以上の生成されたフィンガープリントを用いて重複排除を実行することができる。【選択図】図１
2018142314.tif 000002
【特許請求の範囲】
【請求項１】
ストレージシステムにおいてデータを暗号化する方法であって、
ホストマシン上で実行中のホスト側モジュールにおいて、前記ホストマシン上で実行中のクライアントから、書き込むべきデータを含むデータストレージ書き込み要求を受け取るステップと、
前記ホスト側モジュールが、前記受け取ったデータを暗号化することによって暗号化データを生成するステップと、
前記暗号化データを、前記ホストマシンから分離したストレージノードに送信するステップと、
を含むことを特徴とする方法。
【請求項２】
前記ホスト側モジュールが、前記受け取ったデータに基づいて１又は２以上のフィンガープリントを生成するステップと、
前記１又は２以上のフィンガープリントに基づいて、前記ストレージシステムによって維持されている暗号化データの重複排除を実行するステップと、
をさらに含む請求項１に記載の方法。
【請求項３】
重複排除を実行するステップは、前記ホスト側モジュールによって、前記暗号化データを前記ストレージノードに送信する前に実行される、
請求項２に記載の方法。
【請求項４】
前記ホスト側モジュールは、前記ホストマシン内の暗号化ブロックのキャッシュを管理し、重複排除を実行するステップは、前記ホスト側モジュールによって、前記１又は２以上のフィンガープリントと前記キャッシュに記憶されているブロックのフィンガープリントとを比較することによって実行される、
請求項２に記載の方法。
【請求項５】
前記データを暗号化することによって前記暗号化データを生成する前に、前記ホスト側モジュールが前記データに対して圧縮を実行するステップをさらに含む、
請求項１に記載の方法。
【請求項６】
前記ホスト側モジュールが、前記受け取ったデータに基づいて１又は２以上のフィンガープリントを生成するステップと、
前記暗号化データを１又は２以上のクランプにパッケージ化するステップと、
前記１又は２以上のフィンガープリントに基づいて、前記１又は２以上のクランプの１又は２以上のフィンガープリントを生成するステップと、
をさらに含む請求項１に記載の方法。
【請求項７】
前記データを暗号化することによって前記暗号化データを生成するステップは、
前記データを暗号化するために使用すべき暗号鍵を前記ストレージシステムに要求するステップと、
前記ストレージシステムから、前記暗号鍵と、前記ストレージシステムによって維持されている暗号化テーブルから前記暗号鍵を識別するために使用される識別子である関連する暗号鍵インデックス値とを受け取るステップと、
前記暗号鍵を用いて前記データを暗号化することによって前記暗号化データを生成するステップと、
を含む、請求項１に記載の方法。
【請求項８】
前記ストレージシステムから受け取った前記関連する暗号鍵インデックス値を前記暗号化データのメタデータ内に記憶するステップをさらに含む、
請求項７に記載の方法。
【請求項９】
前記ホスト側モジュールにおいて、前記ホストマシン上で実行中の前記クライアントから、暗号化データを含む特定のクランプからデータを読み出すための要求を受け取るステップと、
前記ホスト側モジュールが、前記暗号化データに関連する前記特定のクランプと前記メタデータとにアクセスすることによって、前記特定のクランプ内に前記暗号化データと共に記憶されている前記関連する暗号鍵インデックス値を特定するステップと、
前記ホスト側モジュールが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された暗号鍵インデックス値に関連する暗号鍵を識別するステップと、
前記ホスト側モジュールが、前記識別された暗号鍵を用いて前記特定のクランプ内の前記暗号化データを復号することによって復号データを生成するステップと、
前記ホスト側モジュールが、前記復号データを前記クライアントに送信するステップと、
をさらに含む請求項８に記載の方法。
【請求項１０】
前記ホスト側モジュールにおいて、前記ホストマシン上に存在するキャッシュに記憶されているクランプ内のデータを再暗号化するための要求を受け取るステップと、
前記ホスト側モジュールが、前記キャッシュに記憶されている前記クランプを読み出すことによって、再暗号化すべきクランプの組を識別するステップと、
前記ホスト側モジュールが、前記クランプ内の関連するメタデータから、前記クランプの組内のデータを復号するために必要な前記暗号鍵を識別するために使用される識別子を表す１又は２以上の暗号鍵インデックス値の組を特定するステップと、
前記ホスト側モジュールが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された１又は２以上の暗号鍵インデックス値の組に関連する１又は２以上の暗号鍵の組を識別するステップと、
前記ホスト側モジュールが、前記識別された１又は２以上の暗号鍵の組を用いて前記暗号化データを復号することによって前記クランプの組から復号データを生成するステップと、
前記ホスト側モジュールが、新たな暗号鍵を用いて前記復号データを暗号化することによって暗号化データを生成するステップと、
前記ホスト側モジュールが、前記暗号化データをクランプの組にパッケージ化するステップと、
前記クランプの組を前記キャッシュに記憶するステップと、
をさらに含む請求項８に記載の方法。
【請求項１１】
前記ホストマシンから分離した前記ストレージノードにおいて、前記ストレージノード上に記憶されているクランプ内のデータを再暗号化するための要求を受け取るステップと、
前記ストレージノードで実行中のタスクワーカが、前記ストレージノード上に記憶されている前記クランプを読み出すことによって、暗号化すべきクランプの組を識別するステップと、
前記タスクワーカが、前記クランプ内の関連するメタデータから、前記クランプの組内のデータを復号するために必要な前記暗号鍵を識別するために使用される識別子を表す１又は２以上の暗号鍵インデックス値の組を特定するステップと、
前記タスクワーカが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された１又は２以上の暗号鍵インデックス値の組に関連する暗号鍵を識別するステップと、
前記タスクワーカが、前記識別された１又は２以上の暗号鍵の組を用いて前記暗号化データを復号することによって前記クランプの組から復号データを生成するステップと、
前記タスクワーカが、新たな暗号鍵を用いて前記復号データを暗号化することによって暗号化データを生成するステップと、
前記タスクワーカが、前記暗号化データをクランプの組にパッケージ化するステップと、
前記クランプの組を前記ストレージノードに記憶するステップと、
をさらに含む請求項８に記載の方法。
【請求項１２】
ストレージシステムにおいてデータを暗号化するための命令を記憶する非一時的コンピュータ可読媒体であって、前記命令は、１又は２以上のプロセッサによって実行された時に、
ホストマシン上で実行中のホスト側モジュールにおいて、前記ホストマシン上で実行中のクライアントから、書き込むべきデータを含むデータストレージ書き込み要求を受け取るステップと、
前記ホスト側モジュールが、前記受け取ったデータを暗号化することによって暗号化データを生成するステップと、
前記暗号化データを、前記ホストマシンから分離したストレージノードに送信するステップと、
の実行を引き起こす、ことを特徴とする非一時的コンピュータ可読媒体。
【請求項１３】
前記１又は２以上のプロセッサによって実行された時に、
前記ホスト側モジュールが、前記受け取ったデータに基づいて１又は２以上のフィンガープリントを生成するステップと、
前記１又は２以上のフィンガープリントに基づいて、前記ストレージシステムによって維持されている暗号化データの重複排除を実行するステップと、
の実行を引き起こす命令をさらに含む、請求項１２に記載の非一時的コンピュータ可読媒体。
【請求項１４】
重複排除を実行するステップは、前記ホスト側モジュールによって、前記暗号化データを前記ストレージノードに送信する前に実行される、
請求項１３に記載の非一時的コンピュータ可読媒体。
【請求項１５】
前記ホスト側モジュールは、前記ホストマシン内の暗号化ブロックのキャッシュを管理し、重複排除を実行するステップは、前記ホスト側モジュールによって、前記１又は２以上のフィンガープリントと前記キャッシュに記憶されているブロックのフィンガープリントとを比較することによって実行される、
請求項１３に記載の非一時的コンピュータ可読媒体。
【請求項１６】
前記１又は２以上のプロセッサによって実行された時に、前記データを暗号化することによって前記暗号化データを生成する前に、前記ホスト側モジュールが前記データに対して圧縮を実行するステップの実行を引き起こす命令をさらに含む、
請求項１２に記載の非一時的コンピュータ可読媒体。
【請求項１７】
前記１又は２以上のプロセッサによって実行された時に、
前記ホスト側モジュールが、前記受け取ったデータに基づいて１又は２以上のフィンガープリントを生成するステップと、
前記暗号化データを１又は２以上のクランプにパッケージ化するステップと、
前記１又は２以上のフィンガープリントに基づいて、前記１又は２以上のクランプの１又は２以上のフィンガープリントを生成するステップと、
の実行を引き起こす命令をさらに含む、請求項１２に記載の非一時的コンピュータ可読媒体。
【請求項１８】
前記データを暗号化することによって前記暗号化データを生成するステップは、
前記データを暗号化するために使用すべき暗号鍵を前記ストレージシステムに要求するステップと、
前記ストレージシステムから、前記暗号鍵と、前記ストレージシステムによって維持されている暗号化テーブルから前記暗号鍵を識別するために使用される識別子である関連する暗号鍵インデックス値とを受け取るステップと、
前記暗号鍵を用いて前記データを暗号化することによって前記暗号化データを生成するステップと、
を含む、請求項１２に記載の非一時的コンピュータ可読媒体。
【請求項１９】
前記１又は２以上のプロセッサによって実行された時に、前記ストレージシステムから受け取った前記関連する暗号鍵インデックス値を前記暗号化データのメタデータ内に記憶するステップの実行を引き起こす命令をさらに含む、
請求項１８に記載の非一時的コンピュータ可読媒体。
【請求項２０】
前記１又は２以上のプロセッサによって実行された時に、
前記ホスト側モジュールにおいて、前記ホストマシン上で実行中の前記クライアントから、暗号化データを含む特定のクランプからデータを読み出すための要求を受け取るステップと、
前記ホスト側モジュールが、前記暗号化データに関連する前記特定のクランプと前記メタデータとにアクセスすることによって、前記特定のクランプ内に前記暗号化データと共に記憶されている前記関連する暗号鍵インデックス値を特定するステップと、
前記ホスト側モジュールが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された暗号鍵インデックス値に関連する暗号鍵を識別するステップと、
前記ホスト側モジュールが、前記識別された暗号鍵を用いて前記特定のクランプ内の前記暗号化データを復号することによって復号データを生成するステップと、
前記ホスト側モジュールが、前記復号データを前記クライアントに送信するステップと、
の実行を引き起こす命令をさらに含む、請求項１９に記載の非一時的コンピュータ可読媒体。
【請求項２１】
前記１又は２以上のプロセッサによって実行された時に、
前記ホスト側モジュールにおいて、前記ホストマシン上に存在するキャッシュに記憶されているクランプ内のデータを再暗号化するための要求を受け取るステップと、
前記ホスト側モジュールが、前記キャッシュに記憶されている前記クランプを読み出すことによって、再暗号化すべきクランプの組を識別するステップと、
前記ホスト側モジュールが、前記クランプ内の関連するメタデータから、前記クランプの組内のデータを復号するために必要な前記暗号鍵を識別するために使用される識別子を表す１又は２以上の暗号鍵インデックス値の組を特定するステップと、
前記ホスト側モジュールが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された１又は２以上の暗号鍵インデックス値の組に関連する１又は２以上の暗号鍵の組を識別するステップと、
前記ホスト側モジュールが、前記識別された１又は２以上の暗号鍵の組を用いて前記暗号化データを復号することによって前記クランプの組から復号データを生成するステップと、
前記ホスト側モジュールが、新たな暗号鍵を用いて前記復号データを暗号化することによって暗号化データを生成するステップと、
前記ホスト側モジュールが、前記暗号化データをクランプの組にパッケージ化するステップと、
前記クランプの組を前記キャッシュに記憶するステップと、
の実行を引き起こす命令をさらに含む、請求項１９に記載の非一時的コンピュータ可読媒体。
【請求項２２】
前記１又は２以上のプロセッサによって実行された時に、
前記ホストマシンから分離した前記ストレージノードにおいて、前記ストレージノード上に記憶されているクランプ内のデータを再暗号化するための要求を受け取るステップと、
前記ストレージノードで実行中のタスクワーカが、前記ストレージノード上に記憶されている前記クランプを読み出すことによって、暗号化すべきクランプの組を識別するステップと、
前記タスクワーカが、前記クランプ内の関連するメタデータから、前記クランプの組内のデータを復号するために必要な前記暗号鍵を識別するために使用される識別子を表す１又は２以上の暗号鍵インデックス値の組を特定するステップと、
前記タスクワーカが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された１又は２以上の暗号鍵インデックス値の組に関連する暗号鍵を識別するステップと、
前記タスクワーカが、前記識別された１又は２以上の暗号鍵の組を用いて前記暗号化データを復号することによって前記クランプの組から復号データを生成するステップと、
前記タスクワーカが、新たな暗号鍵を用いて前記復号データを暗号化することによって暗号化データを生成するステップと、
前記タスクワーカが、前記暗号化データをクランプの組にパッケージ化するステップと、
前記クランプの組を前記ストレージノードに記憶するステップと、
の実行を引き起こす命令をさらに含む、請求項１９に記載の非一時的コンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
〔関連出願との相互参照、利益の主張〕
本出願は、２０１５年５月１２日に出願された米国特許出願第１４／７１０，５４１号の一部継続出願であり、この文献の内容はその全体が本明細書に完全に記載されているかのように全ての目的で引用により本明細書に組み入れられる。
【０００２】
本発明は、分散ストレージシステムにおけるデータの暗号化に関する。
【背景技術】
【０００３】
一般に、金融、医療及び小売部門などの業界は大量のデータを維持する。通常、これらの業界で使用される電子ファイルシステムは、その維持されるデータ量に起因して、アプリケーションサーバから分離したリモートストレージシステムに存在する複数のストレージアレイにデータを記憶する分散ファイルシステムである。通常、データを維持するために使用される分散電子ファイルシステムは、無許可のユーザから機密情報を保護して様々な規制要件に従うためにデータ暗号化を使用する。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
電子ファイルシステム上のデータを暗号化するために使用されている現在の暗号化方法は、アプリケーションレベルの暗号化、コントローラ管理による暗号化及び自己暗号化ストレージドライブを含む。アプリケーションレベルの暗号化は、ストレージシステムにデータを書き込む前にアプリケーションレベル又は仮想マシンレベルでデータを暗号化するプロセスである。アプリケーションレベルで暗号化を行う１つの利点は、ネットワークを介して記憶装置にデータを送信する前にデータが暗号化される点である。これにより、データがアプリケーションサーバからネットワークを介して記憶装置に送信されている間におけるデータの不正アクセスが防がれる。しかしながら、アプリケーションレベルで暗号化されたデータは、圧縮及び重複排除などの技術を適用することが困難なため、これらの記憶には大量の記憶スペースが必要である。一般に、暗号化ではデータがランダム化されるので、暗号化データに対しては圧縮が無効になる。暗号化では、データ単位の２つの同一のコピーが暗号化形式でも同一になる可能性が低くなるので、暗号化データの重複排除も困難になる。
【０００５】
自己暗号化ストレージドライブは、受信時にデータを暗号化する能力を有する記憶装置である。自己暗号化ストレージドライブを使用する１つの利点は、自己暗号化ドライブにデータを記憶する前に、ストレージコントローラが圧縮及び重複排除を通じてデータのサイズを縮小できる点である。しかしながら、自己暗号化ドライブを使用する主な不利点の１つとして、アプリケーションサーバからネットワークを介して自己暗号化ドライブに送信されるデータが暗号化されず、ネットワークを介して移動する間に不正アクセスを受けやすい点が挙げられる。また、自己暗号化ドライブのユーザは、ドライブ自体の暗号化能力に制限される。ユーザは、自身の暗号化戦略を更新又は変更したいと望む場合、変更後の戦略をサポートする新たなハードウェアの購入を強いられる場合もある。
【０００６】
コントローラ管理による暗号化とは、ストレージコントローラによって行われる暗号化のことである。例えば、アプリケーションサーバからストレージコントローラにデータを書き込むための書き込み要求を送信する。この時、ストレージコントローラは、どの記憶装置がデータを記憶すべきかを判断し、データを暗号化した後で適切な記憶装置に送信する。この技術により、ユーザは、自己暗号化ドライブのように記憶装置の暗号化制限を心配することなく柔軟に記憶装置を変更及び／又はアップグレードすることができる。しかしながら、アプリケーションサーバからストレージコントローラに送信されるデータは暗号化されていないので、アプリケーションサーバからのデータ受信時には依然としてセキュリティ上のリスクが存在する。
【課題を解決するための手段】
【０００７】
従って、アプリケーションサーバと記憶装置との間の移動中にデータを保護するとともに圧縮技術及び重複排除技術の恩恵を受けることができる効率的なデータ暗号化方法が望まれている。
【０００８】
本節で説明した方法は、追求できる方法ではあるが、必ずしも以前に想到又は追求されたことのある方法ではない。従って、別途指示がない限り、本節で説明した方法を、いずれも本節に含まれているという理由のみで先行技術と見なすべきではない。
【図面の簡単な説明】
【０００９】
【図１】分散型仮想アレイ（ＤＶＡ）システムの主要コンポーネントを示す図である。
【図２】ＤＶＡシステムのコンポーネントの一部をさらに詳細に示す図である。
【図３】書き込み要求の受信時におけるワークフローの一例のフローチャートである。
【図４】読み出し要求の受信時におけるワークフローの一例のフローチャートである。
【図５】ホスト側モジュールにおいて書き込み要求の受信時にデータを暗号化するワークフローの一例のフローチャートである。
【図６】ホスト側モジュールにおいてデータを暗号化してパッケージ化する実施形態例を示す図である。
【図７】実施形態を実装できるコンピュータシステム例を示すブロック図である。
【図８】書き込み要求の受信時におけるワークフローの一例のフローチャートである。
【発明を実施するための形態】
【００１０】
以下の説明では、本発明を完全に理解できるようにするために、説明を目的として数多くの特定の詳細を記載する。しかしながら、これらの特定の詳細を伴わずに本発明を実施できることが明らかであろう。その他の場合、本発明を不必要に曖昧にしないために、周知の構造及び装置についてはブロック図形式で示す。
【００１１】
全体的概要
本明細書では、ストレージシステムに記憶すべきデータに対してデータ暗号化及び復号を実行する技術について説明する。１つの実施形態によれば、ホストマシン上で実行中のクライアントアプリケーションが、ストレージシステムにデータを書き込むためのデータストレージ書き込み要求を生成することができる。ホストマシン上で実行中のホスト側モジュールが、この書き込み要求を受け取る。ホスト側モジュールは、書き込み要求に対応するデータのための、データを構成するデータブロックを識別するために使用される一意の識別子である１又は２以上のフィンガープリントを生成するように構成される。ホスト側モジュールは、データブロックに対応する１又は２以上のフィンガープリントを生成すると、暗号化技術を用いてデータブロックを暗号化することによって暗号化データを生成する。その後、この暗号化データは、ストレージシステム内のストレージノードに送信される。この暗号化データに対し、１又は２以上の生成されたフィンガープリントを用いて重複排除を実行することができる。
【００１２】
分散型仮想アレイ
図１に示す本発明の一般的な実施形態に、ＤＶＡの２つの主要な物理的「側面」である、（１つを含む）いずれかの数のサーバなどのホスト１００と、ホスト側から見れば単一の、ただし分散したストレージシステムを形成できるストレージノード３１０−１、３１０−２、．．．、３１０−Ｎ（まとめて「３１０」）を含むストレージプール３００との間の関係を示す。ホスト１００内のエンティティが書き込んだデータは、最初に（ＮＶＲＡＭ３３０として示す）不揮発性メモリに記憶され、最終的にはノード内に位置する永続記憶装置３４０−１、．．．、３４０−Ｎ（まとめて「３４０」）に記憶される。
【００１３】
読み出し及び書き込みエンティティは、（「ＶＭ」１３０−１、．．．、１３０−ｎとして別個に示す）仮想マシン１３０、又はユーザレベルアプリケーション１４０などのさらに一般的な非仮想化プロセスを含むあらゆるタイプのものとすることができる。ここでは、データの読み出し及び／又は書き込みを行う必要があるソフトウェアエンティティ及びハードウェアエンティティを「クライアント」と呼ぶ。
【００１４】
各ホストは、１又は２以上のプロセッサ（ＣＰＵ）１１１と、ＣＰＵ上で実行できるデータ及び／又はコードの非永続的な揮発性の、及び／又は永続的な不揮発性の非一時的記憶を行ういくつかの装置１１２とを含むシステムハードウェア１１０を含む。従来、一般にメモリは高速で揮発性の固体装置を構成していたのに対し、一般にストレージは低速で不揮発性の機械的又は光学機械的装置を構成していたことから、「メモリ」と「ストレージ」との間には比較的明確な技術的区別があった。しかしながら、現代技術が大容量の永続ストレージに幅広く使用されるにつれ、この区別は次第に曖昧になってきている。例えば、多くの最新のサーバは、特に非連続的な記憶位置については、一般にＩＯＰＳ（１秒当たりの入出力操作）の観点で測定したスループット及び速度を高めるために「サーバフラッシュ」などの様々な固体記憶装置（ＳＳＤ）を使用する。相変化メモリ（ＰＲＡＭ）などの最先端技術では、この区別がさらに曖昧になっている。ここで説明する実施形態の実装には、特定のタイプのホスト側ストレージ技術又はメモリ技術は不要であり、全てのホストが同じストレージ技術を利用する必要もない。
【００１５】
ハードウェア１１０は、インターネット、企業内ネットワークなどのいずれかの既知の公衆ネットワーク、専用ローカルネットワーク又は広域ネットワークとすることができる１又は２以上のネットワーク２００を介してシステムの様々なコンポーネント間でデータを転送できるように、ネットワーク接続装置１１４などの他の従来の機構を含む。唯一の要件は、どのようなネットワークを使用するとしても、アクセスする必要があるストレージノード（以下を参照）に全てのクライアントがアクセスできることである。従って、「この」ネットワーク２００は、異なるネットワーク間でデータを転送する必要がある場合にはあらゆる必要なスイッチング装置又はその他の通信装置を伴う、実装されたあらゆるネットワークの集合体であると解するべきである。
【００１６】
各ホストは、例えば実装、オペレーティングシステム（ＯＳ）、デバイスドライバなどに応じて、従来のシステムソフトウェア１１５も含む。図示の構成では、ホスト１００のうちの１つを、通常はシステムハードウェア１１０と（図示の実施形態では）少なくとも１つの仮想マシン（ＶＭ）１３０−１、．．．１３０−ｎとの間に何らかの形のハイパーバイザ１２０又は同様のインターフェイスレイヤを含む仮想化プラットフォームをサポートするものとして示す。周知のように、ＶＭは、実際の物理的コンピュータシステムのソフトウェア抽象概念である。
【００１７】
図１では、簡潔さのみを目的としてＶＭをホスト内に示しているが、ほとんどの実装では、仮想マシンはハイパーバイザ／ハードウェアホスト上で動作する「ゲスト」である。一部の仮想化システムには、ハイパーバイザ又はホストＯＳなどの基本ソフトウェア層へのインターフェイスとして「仮想マシンモニタ」が含まれる。ＶＭｗａｒｅ社のＥＳＸサーバ製品ファミリなどの多くのハイパーバイザは、ホストＯＳと相互作用する必要なく「ベアメタル」上で、すなわちシステムハードウェア１１０上で直接動作する。他の仮想化プラットフォームでは、ハイパーバイザが、ハイパーバイザからの呼び出し時にいくつかの動作をサポートして実行するホストＯＳ上で、又はこのようなホストＯＳと同じレベルで動作することができる。ここで説明する本発明の様々な実施形態は、ＶＭであろうと、（単複の）ハイパーバイザであろうと、又は他の仮想化レイヤであろうと、いずれかの特定の仮想化アーキテクチャに依存しない。実際のところ、ＶＭは全く前提としておらず、むしろ想定されるのは、ソフトウェアエンティティ及びハードウェアエンティティ（「クライアント」）からのデータストレージ読み出し／書き込み要求を処理する何らかのシステムソフトウェア層である。従って、「ホスト」は、後述する分散ストレージ構成に対してデータの書き込み及び／又は読み出しを行いたいと望むことができるプロセス（ＶＭはその特殊な例である）が実行されるいずれかのプラットフォームである。
【００１８】
プール３００内の個別のユニットとして示す様々なストレージノード３１０は、異なる物理サーバとすることができるが、アドレス指定のために単一の論理境界に含まれていると考えることができる。しかしながら、アドレス指定可能なストレージプールの論理的概念境界は、図示の物理ストレージノード３１０−１、３１０−２、．．．、３１０−Ｎの組に留まらないストレージコンポーネント及びプロセスを含むこともできる。
【００１９】
所望のＤＶＡ機能に応じて、ノード３１０のいくつかの分散機能及び制御機能を操作してノード３１０に共通する管理データ及びその他のデータなどを維持するプールマネージャ３５０を含めることもできる。このようなプールマネージャは、１又は２以上のストレージノード内、１又は２以上のホスト内、又は同じネットワークに接続された別個のコンピューティングシステム内で動作することができる。プールマネージャは、プールに記憶されている（仮想ディスクなどの）ファイルのファイル名空間の管理、クラスタ管理、及び他のノード管理機能などのための他の管理コンポーネントを含むこともできるが、これらは独立エンティティとして実装することもできる。
【００２０】
ストレージノードを実装するための多くの現在利用可能な考えられる選択肢の例のうちの２つとして、複数のディスクコントローラを含むＸｙｒａｔｅｘシャーシ、或いは集約的入力／出力タスクのための低電力サーバアーキテクチャである単一ディスク「ＦＡＷＮ」（Ｆａｓｔ  Ａｒｒａｙ  ｏｆ  Ｗｉｍｐｙ  Ｎｏｄｅｓ）を挙げることができる。より一般的には、ノードは、いずれかの形態のバス又はネットワーク接続を介して少なくとも１つのディスクと通信するいずれかの形態のコンピュータを用いて実装することができる。実際には、ノード自体を、ストレージプールにデータを書き込むエンティティとすることもできる。
【００２１】
各ノードは、１又は２以上のストレージコントローラ３２０−１、３２０−２、．．．、３２０−Ｎ（まとめて３２０）を含み、これらの各々は、１又は２以上のディスク、フラッシュ又はその他のＳＳＤデバイス、又は（複数の物理装置を含む）永続記憶装置３４０を含むその他のデバイスを制御する従来の処理回路を含む。コントローラは、ネットワーク２００に接続するために必要な回路も含む。いくつかの実施形態では、単一の複合モジュールにおいてコントローラを記憶装置と一体化することもできる。ホスト１００と同様に、ストレージプール３００のノード内で使用される様々なソフトウェアコンポーネントは、プール内の各ハードウェアプラットフォーム上の（単複の）プロセッサ上で実行できるようにいずれかの従来の方法でロード及び／又は記憶され、これらの媒体及びプロセッサは、簡潔にするために図には別個に示していないが、当業者であれば当然ながらこれらの存在を理解するであろう。これまでに説明したシステムコンポーネントは、多くの先行技術のシステムにも見られるものである。
【００２２】
好ましい実施形態では、コントローラ３２０のうちの少なくとも１つが、新たに書き込まれたデータを非常に低いレイテンシで受け取って永続的に記憶する何らかの不揮発性メモリ３３０（ＮＶＲＡＭ−図２）も含み、又はこのメモリにアクセスすることができる。いくつかのシステムでは、ＮＶＲＡＭが、ＰＣＩｅスロット内の特殊なカード上に存在することができる。いくつかの実装では、コントローラがバッテリバックアップを有することができ、停電時には、コントローラがシステムメモリの一部をフラッシュドライブにコピーするのに十分な時間を有する。この場合、ＮＶＲＡＭ３３０は、別個の物理コンポーネントである必要はなく、代わりに他の標準的な目的でコントローラ内に存在する汎用ＲＡＭの論理部分とすることができる。いくつかのシステムでは、ＮＶＲＡＭを単に低レイテンシのＳＳＤとすることができる。本発明の実施形態の全ての実装においてノードがディスクとＮＶＲＡＭの両方を有する必要はなく、むしろいずれかの所与のノードを、これらの２つのタイプの永続記憶装置の一方のみを有し、又は少なくとも一方にアクセスできるように構成することができる。従って、図１に示すように、１又は２以上のノード（例えば、ノード３１０−１）が永続記憶装置と不揮発性メモリの両方を有し、１又は２以上の他のノード（例えば、ノード３１０−２）が永続記憶装置を含まず、さらに他の（単複の）ノードが不揮発性メモリコンポーネント３３０を全く有さないようにシステムを実装することができる。また、やはり図１のノード３１０−Ｎに示すように、１又は２以上のノードが複数の永続記憶装置（３４０−Ｎ）を有することもできる。さらに、いくつかの実施形態では、ＮＶＲＡＭがホスト内に存在することもできる。
【００２３】
好ましい実施形態では、ホストが、ネットワークを介して永続記憶装置にではなくストレージノード又はホスト内のＮＶＲＡＭに特別にデータを書き込むとともに、このＮＶＲＡＭからデータを削除するコマンドを与えることもできる。この点は、永続記憶装置に向かっているデータにとってＮＶＲＡＭが透過的なバッファである従来のストレージシステムの構成とは大きく異なる。
【００２４】
上述したように、２つの主なストレージフィロソフィは、トレードオフ領域のほぼ両極端に収まる。ハイパーコンバージドシステムでは、実質的に全ての記憶負荷及び計算負荷が相互依存ホスト内に集中するのに対し、他のシステムでは、計算負荷のほとんどがリモートストレージユニット自体に置かれて、ホストが互いに直接的に依存しない。本発明の実施形態が採用する異なる方法では、通常は大きなホストの計算リソースが多くのストレージ関連機能のために、ただしホスト間の顕著な通信及び調整を必要としない形で使用され、メインストレージ能力が主にリモートノードに留まり、あらゆるホストが別のホストを介さずにリモートノードにアクセスすることができる。
【００２５】
この目的のために、ホスト及びノードは、システムソフトウェアレベルにおけるＤＶＡｈ４０５モジュールと、ノードにおけるＤＶＡｎ４２５というそれぞれのＤＶＡコンポーネントを含む。ＤＶＡｈ４０５は、図１に重ね合わせによって示すように、システムソフトウェア１１５の一部として、仮想化プラットフォームの（ハイパーバイザ１２０などの）制御ソフトウェアの一部として、又はこれらの両方の協働コンポーネントとして実装することができる。選択肢としては、ＤＶＡｈコンポーネントをシステムソフトウェア１１５内又はハイパーバイザ１２０内のドライバとして構成し、必要に応じてホストオペレーティングシステム（システムソフトウェア）に呼び掛けることが挙げられる。ＤＶＡｈ４０５コンポーネントは、異なるユーザレベルプロセス又はシステムレベルプロセス内に、或いは「ヘルパー」ＶＭ内に構成することもできる。一般に、ＤＶＡｈ及びＤＶＡｎは、その構成に関わらず、非一時的ストレージに記憶されメモリにロードされてホストＣＰＵ１１１によって実行されるプロセッサ実行可能コードの対応部分として実装される。
【００２６】
同様に、ノード内のＤＶＡｎ４２５コンポーネントは、それぞれのストレージコントローラ３２０上で実行されるソフトウェアとして、又はストレージコントローラから分離しているがストレージコントローラと協働するソフトウェアモジュールとして実装することもでき、非一時的ストレージに記憶されメモリにロードされてノード３１０内の（単複の）プロセッサによって実行されるプロセッサ実行可能コードの対応部分としても実装される。
【００２７】
ある実施形態では、ストレージコントローラ３２０が、ホスト上に存在するＤＶＡｈ４０５に暗号鍵を配布することによってデータ暗号化を管理する。安全性を維持するために、ホストによって使用される暗号鍵は定期的に循環させることができる。ストレージコントローラ３２０は、異なるホストが異なる時点でデータ暗号化のために使用できる複数の暗号鍵を含む暗号化テーブルを維持する。ある実施形態では、この暗号化テーブルが、暗号鍵値と、暗号鍵値を識別するために使用される暗号化インデックス値とを指定する列を含む。ストレージコントローラ３２０は、特定のホスト上のＤＶＡｈ４０５に暗号化値を送信する際に、暗号鍵値と暗号化インデックス値とを送信する。暗号化テーブルは、暗号鍵に関連する暗号化アルゴリズムを指定する列を含むこともできる。ストレージコントローラ３２０は、暗号化テーブル内に暗号化アルゴリズムを記憶することによって異なるタイプの暗号化アルゴリズムをサポートすることができ、暗号鍵値と、暗号化アルゴリズムタイプと、暗号化インデックス値とを単純にＤＶＡｈ４０５に送信することによって、データの暗号化に使用される暗号化アルゴリズムのタイプの変更を可能にすることができる。ある実施形態では、ＤＶＡｈ４０５内の１又は２以上のモジュールが、ストレージコントローラ３２０から暗号鍵値を受け取ることによってデータの暗号化を管理するように構成される。
【００２８】
少なくとも１つのホストには、好ましくは（単複の）メモリ／ストレージコンポーネント１１２の一部としてキャッシュ１１３を含めることが好ましい。キャッシュは、１又は２以上のフラッシュメモリデバイス、相変化ランダムアクセスメモリ（ＰＲＡＭ）、メインシステムメモリの一部などを使用することなどのいずれかの従来の十分に高速な技術を用いて実装することができる。キャッシュは、個別にパッケージ化された固体ディスク（ＳＳＤ）、サーバ内のバスにプラグ接続された回路カード、サーバマザーボード上のモジュールなどとして実装することもできる。
【００２９】
図２は、図１に示す主要システムコンポーネントの簡略表現であるが、ＤＶＡモジュールの様々な任意のサブコンポーネントのさらなる詳細を含む。１つのホストと１つのノードしか示していないが、他のホスト／ノードにも同様のサブコンポーネントを含めることができる。なお、全てのホスト又はノードが図２に示すものと同じＤＶＡサブコンポーネントを含む必要はなく、いずれかの所与の実装ニーズに応じて、図示のサブコンポーネントのうちのいずれかの数（１つ〜全部）をいずれかの所与のホストにあらゆる所望の組み合わせで含めることができる。従って、図２に示すＤＶＡサブコンポーネントの組は、例示及び説明を目的とするものにすぎない。さらに、図２には、様々なサブコンポーネントを別個のものとして示しているが、これは例示及び説明を目的とするものにすぎず、これらの一部又は全部を単一の実行可能コード部分に組み合わせることもできる。
【００３０】
ＤＶＡサブコンポーネント及びその機能は、バックグラウンドストレージ管理機能、データ変換機能及び／又は以下で概説するその他の機能を含む様々なストレージ処理機能の一部又は全部を実行する。なお、従来のストレージシステムでは、通常、これらの機能はストレージコントローラ内で実行され、ホストでは実行されない。ＤＶＡｈサブコンポーネントは、以下を優先的に含む。
【００３１】
既知の技術を用いてキャッシュ１１３に対する読み出し及び書き込みを操作するキャッシュマネージャ５１３。１つの実施形態では、キャッシュが、ブロックのフィンガープリントに基づいてキャッシュ内のブロックを発見できるようにフィンガープリント化されたデータブロックを含む。
【００３２】
ホスト上のＶＭ（或いは仮想化された又はされていない他のプロセス）からデータを受け取り、プール３００に記憶できるように設計されたいずれかのフォーマットにデータを処理するファイルマネージャコンポーネント５３０。ファイルマネージャコンポーネント５３０は、データを読み出すための要求を受け取り、キャッシュ又はプールからデータを検索して処理し、元々記憶されていたフォーマットに戻して要求データを返送する。ファイルマネージャは、データのキャッシュ、処理、記憶又は検索を行うのに役立つ他のコンポーネントを呼び出すこともできる。
【００３３】
ファイルマネージャ５３０は、ファイルオフセットからプール３００に記憶されている対応するデータ項目への参照にマップを更新するマッピングモジュール５２４を呼び出すことができる。いくつかの実施形態では、このデータ項目参照が、データ項目を含むブロックのフィンガープリントを含む。いくつかの実施形態では、ホストがフィンガープリントを計算する。いくつかの実施形態では、データ項目参照が、データ項目のロケータを含む。ファイルマネージャは、ファイル内の何らかのオフセットのための読み出し要求を満たすために、マッピングモジュール５２４を呼び出して、ファイル内のそのオフセットについて記憶されているデータ項目への参照を取得する。その後、ファイルマネージャは、この参照を用いてキャッシュからデータ項目を検索し、或いはそこにデータ項目が存在しない場合には、プールからデータ項目を検索することができる。
【００３４】
周知のように、仮想マシンのストレージシステムも仮想化される。従って、ＶＭ上で実行中のプロセスは、物理ストレージであると「思っている」が実際には「仮想ディスク」（ｖＤｉｓｋ）内の仮想アドレスであるものをアドレス指定した後に、対応するアドレスマップを用いて１又は２以上のレベルのアドレスリダイレクトを行って、最終的に物理空間内のアドレスに至る。分散ストレージシステムの文脈では、ＶＭの読み出し及び書き込みが、最終的にプール３００内の１つの（又は、例えばデータがミラーリングされている場合には複数の）物理記憶装置内の対応するアドレスにマッピングされる。
【００３５】
好ましくは、圧縮、暗号化、データの完全性を保証するためのチェックサム、抹消符号化されたストライプへの受信データの圧縮、例えばＲＡＩＤストライプの一部としての誤り訂正符号（ＥＣＣ）値の計算、及び／又はフィンガープリント、すなわち受信データブロックの一意の識別情報の計算などの、既知のデータ変換機能の一部又は全部を実行するデータ処理コンポーネントである処理エンジン５２０が含まれる。考えられるフィンガープリント技術の１つの例に、いずれかのＳＨＡ法（例えば、ＳＨＡ−１）などを使用するハッシュがある。選択したフィンガープリント法に十分に衝突耐性がある（すなわち、２つの異なる入力が同じフィンガープリント出力を生じる確率が十分に低い）と仮定すれば、同じフィンガープリントを有する異なるデータブロックを、同じコンテンツを有するもの、従って重複するものと推測することができる。
【００３６】
１つの実施形態では、到着データがフィンガープリント化され、到着ブロックのフィンガープリントをキャッシュ１１３内に、すなわちホスト１００内に記憶されているブロックのフィンガープリントと比較することによって重複排除されることにより、プール３００に記憶されているデータを分析して重複排除する必要性が避けられる。この構成では、通常はさらに強力なホストにおいてこれらの計算集約型タスクを実行できるだけでなく、ホストが最初にリモートストレージノード３１０からフィンガープリントを検索する必要があった場合に被ったはずの大部分のレイテンシも避けられる。
【００３７】
フィンガープリント化されたブロックのキャッシュは、読み出し要求に応答してプールからデータブロックをフェッチするレイテンシを避けることもできる。２つの異なるファイルの各々が、同じコンテンツ、従って同じフィンガープリントを有するブロックを含むこともある。この重複ブロックは、１つのファイルの読み出し要求又は書き込み要求を満たすようにキャッシュ１１３に挿入しておくことができ、その後の別のファイル内の重複ブロックの読み出し要求は、プールからブロックをフェッチするレイテンシを伴うことなくキャッシュから満たすことができる。
【００３８】
フィンガープリント化又はチェックサムを用いてデータの完全性を保証し、不完全な書き込みを検出することもできる。例えば、バッファデータについてフィンガープリントを計算することができる。潜在的なホスト障害及び不完全な書き込みのいずれかの兆候がある場合には、現在のデータのフィンガープリントをバッファデータのフィンガープリントと比較することができ、値が同じでなければ、システムは、バッファデータと記憶対象のデータとが同一でないので書き込みが不完全であったと分かる。
【００３９】
ログ構造ファイルシステムを使用するＤＶＡには、実施形態によってはコピーフォワードすべきデータを識別し、実施形態によってはこのようなデータを新たなストライプにコピーすることを含む、従来のガベージコレクション機能を実行するガベージコレクションモジュール５２２を含めることができる。
【００４０】
ストライプを用いてデータを記憶するシステムには、ストライプマネージャ５２３を含めることができる。ストライプマネージャは、設計者が選択して実装するどのようなマッピングスキーム又は割り当てスキームにも従って複数のストレージノードにわたって分配したストライプに追加するＥＣＣ値を計算するＥＣＣエンジン５３２を使用し、又は含めることができる。
【００４１】
ホストには、（例えば、ＥＣＣ情報から失われたＲＡＩＤストライプ要素の）データ再構成、データリバランシング又はデータスクラビングなどの機能を実行してデータの完全性を保証するモジュール５２６を含めることもできる。このモジュール、或いは１又は２以上の他のホストモジュールは、ホストのフラッシュキャッシュ内にデータをプリフェッチし、データクランプを形成してその細粒度で重複排除を行い、その後にこのようなクランプをリパックし、ホストフラッシュ障害を処理し、ホスト上のｖＤｉｓｋマップを更新することなどの動作を実行することもできる。
【００４２】
ＤＶＡｎサブコンポーネントは、以下を含むことができる。
【００４３】
フィンガープリントからデータブロックロケータ又はその他の識別子へのマッピングを行うフィンガープリントインデックス５２１。ホストは、フィンガープリント化されたデータブロックをストライプに記憶してストライプをプールに書き込む際に、フィンガープリントと対応するデータブロックロケータとをフィンガープリントインデックスに伝える。ホストは、フィンガープリント化されたブロックをプールから読み出す必要がある時には、まずインデックスにブロックロケータを要求した後にプールからブロックを読み出す。インデックス５２１は、ホスト内に実装することもできるが、インデックスのサイズは記憶容量に比例し、一般的にはインデックスのためのメモリをその対応するストレージユニットとバンドルすることが最も効率的であると思われるので、コントローラ３２０に実装されることが好ましい。
【００４４】
最近書き込まれたデータ及びその他のイベントをホスト上のロギングモジュール５２５から受け取ってこれらのデータを不揮発性の低レイテンシＮＶＲＡＭモジュール３３０に記憶するログ３２５。図２には、ＮＶＲＡＭモジュール３３０がノード３１０の内部に存在するように示しているが、これは１つの実装例にすぎない。他の可能性としては、ＮＶＲＡＭモジュール３３０を異なる専用ノード内又は他のいずれかの場所に配置することが挙げられる。最近書き込まれたデータをＮＶＲＡＭにログとして又は別様に記憶することにより、ディスクドライブなどの高レイテンシ装置３４０に書き込むレイテンシを伴うことなく、書き込みを「安全」なものとして承認することができる。ログ３２５を含むホスト外にこのようなデータを記憶することにより、記憶装置３４０のうちの１つの永続的な位置にデータを記憶する前にホストに障害が生じた場合に、（ストレージノードのうちの１つ、障害が生じていないホストのうちの１つ、又は最初にデータを受け取ったホスト以外の他のいずれかのエンティティなどの）別のエンティティが不揮発性デバイス３３０からデータを読み出し、再処理して記憶装置３４０のうちの１つに記憶することができる。これは、現在障害が生じているホストを介してしかアクセスできないホスト内部のキャッシュ１１３に唯一のデータコピーが記憶されていた場合には不可能である。
【００４５】
ＮＶＲＡＭモジュール３３０を含み、ＬＯＧ３２５などのインターフェイスを介してこれをホストに公開するもう１つの利点は、ホストがストレージノード上のＮＶＲＡＭにデータを書き込むことによってデータを「安全」にして素早い承認を可能にし、その後、例えばストライプを形成するのに十分な量のデータがバッチ処理された後などに、場合によっては遅れたさらなる記憶処理のために自機の計算リソースを利用できる点である。いくつかの実施形態では、ホストによるさらなる記憶処理が行われない限り、ＮＶＲＡＭに書き込まれたデータの一部が決して永続記憶装置に書き込まれないようにすることができる。いくつかの実施形態では、複数のＮＶＲＡＭデバイスにデータを書き込んで、これらのＮＶＲＡＭデバイスのうちの１つ、又はその接続先のコントローラの障害から保護することができる。ホスト自体が複数のＮＶＲＡＭデバイスに書き込みを行うことも、或いはコントローラが、ホストの単一の書き込みを同じノード又は異なるノードにおける複数のＮＶＲＡＭデバイスに、又は他の複数のコントローラとこれらのＮＶＲＡＭデバイスとにミラーリングすることもできる。
【００４６】
一例として、ＶＭが少なくとも１つの仮想化ディスクｖＤｉｓｋ又はファイルにデータの書き込みを望んでいると仮定する。ＶＭがゲストであるホストに障害が生じた場合には、新たに書き込まれたデータのコピーが、何らかのストレージノード上のログ又はＮＶＲＡＭに残る。書き込みデータは、場合によっては書き込みのログデータを保持していなかった１又は２以上のストレージノードを含むプールにデータが書き込まれる前に、（例えば、ＲＡＩＤ様のシステムでは）フルストライプなどの何らかの最小記憶単位を満たすのに十分なデータが存在するまでファイルマネージャにバッファ処理し、又はＶＭホストのキャッシュ１１３に記憶しておくこともできる。新たな書き込みデータを、後でｖＤｉｓｋ内の同じ場所に上書きするための時間を与えるようにさらに長い期間にわたってＶＭホスト上にバッファ処理することにより、ストライプ内の上書きデータを書き出す必要性を排除することもできる。ＤＶＡｈコンポーネントの一部、又はオペレーティングシステム内などにおける他の何らかのホストエンティティとしてのホストは、少なくとも１つの抹消符号化ブロックを書き込み単位について計算し、これをストレージノードに書き込むこともできる。
【００４７】
動作がＲＥＡＤ（読み出し）である場合には、キャッシュ１１３内で所望のデータを検索することができる。データがキャッシュされている場合には、このデータをキャッシュから読み出してＶＭなどの要求元プロセスに戻すことができる。データがキャッシュされていない場合には、（いずれかの中間アドレスマップを用いて）ストレージノードから直接データを読み出して要求元プロセスに戻すことができる。ＲＥＡＤデータをキャッシュに書き込むこともできる。
【００４８】
管理及び計算負荷をホストに集中させることにより、ストレージノードを比較的単純かつ安価に保ってストレージ側の専用バックプレーン及びファイバーチャネル接続を不要にし、さらにはストレージ側全体が標準的なネットワーク接続を介してホストと直接通信できるようにすることができる。さらに、ホストがプールとの間で互いにまれにしか通信しない場合には、１つのホストが別のホスト上のノイジーネイバー（ｎｏｉｓｙ  ｎｅｉｇｈｂｏｒ）に煩わされることがない。最後に、ホストは、大きなキャッシュを含む場合にはプール内のノードにもまれに接触すればよく、これによってノイジーネイバー問題がさらに抑えられる。ホストは、ＶＭ及びＶＭ内で実行中のアプリケーションにデータを供給する権限を有し、従ってシステム内の他の場所の性能問題に影響されにくい。
【００４９】
なお、本明細書に開示する様々な機能又はプロセスは、様々な不揮発性コンピュータ可読媒体に具体化されるデータ及び／又は命令として説明することができ、ＤＶＡシステムの実施形態を実装したいと望む人々にコンピュータプログラム製品として提供することができる。
【００５０】
図３に、書き込み要求を処理する１つの実装を示す。書き込み要求が受け取られると、この要求がノード上のＮＶＲＡＭモジュール３３０にロギングされる。書き込みのロギングは、書き込み中のファイルの指示とファイル内のオフセットとを含む。書き込みデータ自体は書き込みバッファに書き込まれ、要求が承認される。書き込みバッファが処理を引き起こすほど十分に、例えばブロックを形成するほど十分に満杯でなければ、処理はさらなる書き込み要求の受け取りに戻り、満杯であれば、書き込まれたデータをブロックに形成して（データセット全体に１つのフィンガープリントを使用するか、それともブロック毎に別個のフィンガープリントを使用するかに応じて）１又は２以上のフィンガープリントを計算することができる。ブロックデータは、フィンガープリントの計算前、計算後又は計算と同時に、圧縮、暗号化などによって処理することもできる。ホストキャッシュ内に既に所与のブロックが存在する場合（これはフィンガープリントの比較によって判断することができる）には、ブロックへの参照でファイルマップを更新し、処理はさらなる書き込みの受け取りに戻ることができる。ホストキャッシュ又はグローバルフィンガープリントインデックス５２１内でブロックのフィンガープリントが見つからない場合には、このブロックを現在構築中のストライプに追加する。ストライプが未だ不完全である場合、システムは、さらなる書き込み要求の受け取りに戻ることができる。現在のストライプが完全である場合、このストライプのＥＣＣストライプ要素を計算し、配布して記憶することができる。その後、ストライプ内のブロックのフィンガープリントをグローバルフィンガープリントインデックス５２１に追加する。この時、ブロックをキャッシュにも追加し、その後にファイルマップを更新して、ストライプに記憶されたブロックが参照されるようにすることもできる。この時点で、ホストに障害が生じても書き込みデータは安全であり、従ってもはやＮＶＲＡＭ内の一時的なデータコピーは不要である。従って、ホストは、例えばロギングモジュール５２５を使用して、データを切り捨ててＮＶＲＡＭから削除できる旨をログ３２５に伝えることができる。なお、ＮＶＲＡＭに一時的に記憶されているデータをコントローラ自体がさらに永続的な位置に書き換える必要はない。最後に、処理は、さらなる書き込みの受け取りに戻る。他の実施形態では、ＤＶＡｈコンポーネントが、フィンガープリントを計算し、そのフィンガープリントがホストキャッシュ及び／又はグローバルフィンガープリントインデックス内に存在するかをチェックし、対応するファイル及びファイル内のオフセットについて、データ自体ではなくそれまでに記憶されているデータへの新たな参照のみをリモートＮＶＲＡＭにロギングした後で書き込みを承認する。
【００５１】
図８に、書き込み要求を処理する別の実装を示す。書き込み要求が受け取られると、この要求がノード上のＮＶＲＡＭモジュール３３０にロギングされて要求が承認される。書き込みのロギングは、書き込み中のファイルの指示とファイル内のオフセットとのロギングを含む。書き込みデータがデータブロックを完全にカバーしていない場合には、ブロックの残り部分をホストキャッシュ及び／又はプールから読み出し、書き込みデータと融合して書き込みブロックを形成することができる。ブロックは、ＮＶＲＡＭモジュール３３０にロギングする前に、圧縮、暗号化などによって処理することができる。未処理のブロックについてもフィンガープリントを計算して、重複排除を可能にすることができる。ホストキャッシュ内に既に所与のブロックが存在する場合（これはフィンガープリントの比較によって判断することができる）には、ブロックへの参照でファイルマップを更新し、処理はさらなる書き込みの受け取りに戻ることができる。ホストキャッシュ又はグローバルフィンガープリントインデックス５２１内でブロックのフィンガープリントが見つからない場合には、このブロックを現在構築中のストライプに追加する。ストライプが未だ不完全である場合、システムは、さらなる書き込み要求の受け取りに戻ることができる。現在のストライプが完全である場合、このストライプのＥＣＣストライプ要素を計算し、配布して記憶することができる。その後、ストライプ内のブロックのフィンガープリントをグローバルフィンガープリントインデックス５２１に追加する。この時、ブロックをキャッシュにも追加し、その後にファイルマップを更新して、ストライプに記憶されたブロックが参照されるようにすることもできる。この時点で、ホストに障害が生じても書き込みデータは安全であり、従ってもはやＮＶＲＡＭ内の一時的なデータコピーは不要である。従って、ホストは、例えばロギングモジュール５２５を使用して、データを切り捨ててＮＶＲＡＭから削除できる旨をログ３２５に伝えることができる。最後に、処理は、さらなる書き込みの受け取りに戻る。
【００５２】
図４に、読み出し要求を処理する１つの実装を示す。読み出し要求が受け取られ、要求されたオフセットをもたらすデータを含むブロックへの参照をファイルマップモジュールから検索する。参照されるブロックがキャッシュ１１３内に存在する場合には、このブロックを検索し、データを戻して読み出し要求を満たすことができる。ブロックがキャッシュ内に存在しない場合には、ブロックをプールから検索しなければならない。この検索は、フィンガープリントインデックスからブロックロケータを検索することによって行うことができる。ブロックが検索されると、そのブロックをキャッシュに追加して、要求されたデータを戻すことができる。
【００５３】
データ暗号化
ある実施形態では、ホスト側モジュールを、ＮＶＲＡＭ及び／又はホストキャッシュ及び／又はストレージプール３００にデータを記憶する前にデータを暗号化するように構成することができる。図５に、データを記憶するための書き込み要求を受け取り、データを記憶する前にホストにおいてデータを暗号化する実施形態例を示す。
【００５４】
ステップ５５０において、ＤＶＡｈ４０５が、ストレージプール３００にデータを記憶するための書き込み要求を受け取る。図２を参照して分かるように、ＤＶＡｈ４０５内のファイルマネージャコンポーネント５３０は、ＶＭ１３０又はユーザレベルアプリケーション１４０から書き込み要求を受け取るように構成される。ある実施形態では、ＶＭ１３０が、ストレージプール３００にデータを書き込むための書き込み要求をＤＶＡｈ４０５に送信する。例えば、ＶＭ１３０は、ストレージプール３００に１ＭＢのファイルを書き込む要求をＤＶＡｈ４０５に送信する。
【００５５】
ステップ５５５において、受け取ったデータを１又は２以上のデータブロックに分割する。ある実施形態では、ファイルマネージャコンポーネント５３０が、受け取ったデータをＣＢｌｏｃｋと呼ばれる１又は２以上のデータブロックに分割する。ファイルマネージャコンポーネント５３０は、４０９６バイト（４Ｋ）サイズのＣＢｌｏｃｋを生成するように構成することができる。例えば、ファイルマネージャコンポーネント５３０は、１ＭＢのファイルを書き込む要求を受け取った後に、１ＭＢのファイルを複数の４ＫサイズのＣＢｌｏｃｋに分割する。他の実施形態では、ファイルマネージャコンポーネント５３０を、異なるサイズのＣＢｌｏｃｋを生成するように構成することができる。図６に、１ＭＢのファイルをＣＢｌｏｃｋに分割し、圧縮し、暗号化して記憶する例を示す。データ６０５は、ＶＭ１３０から受け取られるデータを表す。ファイルマネージャ５３０は、データ６０５をＣＢｌｏｃｋ６０１〜６０４に分割する。ＣＢｌｏｃｋ６０１〜６０４の各々は、４Ｋサイズのデータブロックを示す。
【００５６】
ステップ５６０において、ＣＢｌｏｃｋの各々について一意のフィンガープリントを生成する。ある実施形態では、処理エンジン５２０が、ストレージプール３００に記憶すべき各ＣＢｌｏｃｋのフィンガープリントを計算するように構成される。処理エンジン５２０は、一意のフィンガープリント識別子を生成する、ハッシュなどの異なるフィンガープリント技術を実装することができる。例えば、図６では、処理エンジン５２０が、ＳＨＡ−１を用いて、ＣＢｌｏｃｋ６０１〜６０４の各々についてＣＢｌｏｃｋフィンガープリント６１１〜６１４として表す一意のＣＢｌｏｃｋフィンガープリントを生成することができる。
【００５７】
ステップ５６５において、ＣＢｌｏｃｋの各々を暗号化する。ある実施形態では、処理エンジン５２０が、暗号化アルゴリズム及び暗号鍵に基づいてＣＢｌｏｃｋの各々を暗号化して、暗号文を含む暗号化ＣＢｌｏｃｋを生成する。例えば、処理エンジン５２０は、暗号化アルゴリズムＡＥＳ−ＸＴＳを用いてＣＢｌｏｃｋ６０１〜６０４を暗号化する。処理エンジン５２０は、ストレージコントローラ３２０によって提供される暗号鍵及びアルゴリズムに基づいて異なるタイプの暗号化アルゴリズムを使用するように構成することができる。
【００５８】
ある実施形態では、処理エンジン５２０が、暗号化の前にストレージコントローラ３２０に暗号化情報を要求する。暗号化情報は、暗号化アルゴリズム、暗号鍵、及び暗号化テーブル内で特定の暗号鍵を識別するために使用される暗号化インデックス値などの、暗号化を実行するために必要なデータを含む。１つの例では、ホスト１００の起動時に暗号化情報を要求することができる。起動時には、ホスト１００内で実行中のＤＶＡｈ４０５が、ストレージコントローラ３２０に暗号鍵要求を送信する。この結果、ストレージコントローラ３２０は、暗号化テーブルにアクセスして、暗号化アルゴリズム、暗号鍵及び暗号化インデックス値をＤＶＡｈ４０５に送信する。また、ＤＶＡｈ４０５は、新たな暗号鍵及びアルゴリズムをストレージコントローラ３２０に定期的に要求するように構成することもできる。ストレージコントローラ３２０は、ストレージコントローラ３２０とホスト１００との間のハンドシェーク手順の一部として新たな暗号鍵及びアルゴリズムを定期的にＤＶＡｈ４０５に送信するように構成することもできる。
【００５９】
ある実施形態では、処理エンジン５２０が、ＣＢｌｏｃｋを暗号化する前に、利用可能な市販の圧縮アルゴリズムを用いてＣＢｌｏｃｋの各々を圧縮するように構成される。処理エンジン５２０は、ＣＢｌｏｃｋの圧縮後に、圧縮済みＣＢｌｏｃｋを暗号化する。例えば、処理エンジン５２０は、最初にＣＢｌｏｃｋ６０１〜６０４を圧縮して圧縮済みＣＢｌｏｃｋ６２１〜６２４を生成し、その後にＣＢｌｏｃｋ６２１〜６２４を暗号化する。
【００６０】
ある実施形態では、処理エンジン５２０を、特定の暗号化ＣＢｌｏｃｋを暗号化するために使用した特定の暗号鍵に関連する暗号化インデックス値を特定の暗号化ＣＢｌｏｃｋと共に記憶するように構成することができる。これを行うことにより、特定の時点にどの暗号鍵を用いてデータを暗号化したかをＤＶＡｈ４０５とストレージコントローラ３２０とが別個に追跡する必要がなくなる。むしろ、ＤＶＡｈ４０５は、特定のＣＢｌｏｃｋを復号するための特定の暗号鍵を要求する際に、暗号化ＣＢｌｏｃｋと共に記憶された暗号化インデックス値を検索キーとして使用することができる。例えば、ＤＶＡｈ４０５は、暗号化インデックス値「００１」に関連する特定の暗号鍵を用いてＣＢｌｏｃｋ６０１を暗号化して暗号化ＣＢｌｏｃｋ６２１を生成する。次に、ＤＶＡｈ４０５は、暗号化インデックス値００１を暗号化ＣＢｌｏｃｋ６２１と共に記憶する。例えば、インデックス値００１は、ＣＢｌｏｃｋ６２１のメタデータ内に記憶することができる。ＤＶＡｈ４０５は、別の時点でＣＢｌｏｃｋ６２１を復号する必要がある場合、ＣＢｌｏｃｋ６２１のメタデータからインデックス値００１を検索し、このインデックス値００１に関連する暗号鍵要求をストレージコントローラ３２０に対して生成することができる。ストレージコントローラ３２０は、暗号鍵要求を受け取ると暗号化テーブルにアクセスし、インデックス値００１を検索キーとして使用して特定の暗号鍵を検索することができる。その後、ストレージコントローラ３２０は、ＣＢｌｏｃｋ６２１を復号するために必要な暗号鍵をＤＶＡｈ４０５に返送することができる。
【００６１】
再び図５を参照して、ステップ５７０に、各ＣＢｌｏｃｋを暗号化した後に、記憶する暗号化ＣＢｌｏｃｋの１又は２以上のクランプを生成することを示す。ある実施形態では、クランプが、記憶する特定の数のＣＢｌｏｃｋを含むように構成される。例えば、暗号化ＣＢｌｏｃｋ６２１〜６２４を単一のクランプ６３０内に構造化することができる。別の例では、暗号化ＣＢｌｏｃｋ６２１〜６２４を、第１のクランプが暗号化ＣＢｌｏｃｋ６２１及び６２２を含み、第２のクランプが暗号化ＣＢｌｏｃｋ６２３及び６２４を含むように、複数のクランプ内に構造化することができる。ある実施形態では、クランプを、異なる長さの連続データを表すように構成することができ、従って異なる数のＣＢｌｏｃｋを含むように構成することができる。
【００６２】
ステップ５７５において、各クランプについてクランプフィンガープリントを生成する。ある実施形態では、クランプフィンガープリントが、ステップ５５５で生成されたＣＢｌｏｃｋフィンガープリントに基づく。例えば、図６では、ＣＢｌｏｃｋフィンガープリント６１１〜６１４を用いてクランプフィンガープリント６３５が生成され、クランプ６３０にパッケージ化される。ある実施形態では、クランプフィンガープリントが、クランプに含まれるＣＢｌｏｃｋに関連するデータブロックフィンガープリントのフィンガープリントとして計算される。クランプフィンガープリントは、クランプ内のデータブロックの組全体のハッシュ値を計算すべき場合に計算されるハッシュ値に等しい計算されたハッシュ値となるように、データブロックフィンガープリントの組み合わせとして計算することができる。他の実施形態では、クランプ内のＣＢｌｏｃｋのデータブロックフィンガープリントからの特性値を組み合わせる他の組み合わせ技術を用いてクランプフィンガープリントを計算することができる。
【００６３】
ステップ５８０において、暗号化ＣＢｌｏｃｋを含む生成されたクランプをストレージコントローラ３２０に送信して１又は２以上のストレージノードに記憶する。ある実施形態では、ＤＶＡｈ４０５が、生成されたクランプをストレージコントローラ３２０に送信し、ストレージコントローラ３２０が、どのストレージノードがクランプを記憶すべきかを決定する。ある実施形態では、ＤＶＡｈ４０５を、ホスト１００内に存在するキャッシュ１１３にクランプを記憶するように構成することができる。例えば、処理エンジン５２０は、生成されたクランプのコピーをサブコンポーネントのキャッシュマネージャ５１３に送信するように構成される。キャッシュ１１３に対する読み出し及び書き込みを行うように構成されたキャッシュマネージャ５１３は、クランプをキャッシュ１１３に書き込む。
【００６４】
ステップ５８５において、クランプフィンガープリントを一意の識別子として用いてクランプに対して重複排除を実行する。ある実施形態では、ストレージコントローラ３２０が、生成されたクランプのクランプフィンガープリントとフィンガープリントインデックス５２１に記憶されているクランプフィンガープリントとを比較することによって重複排除を実行する。フィンガープリントインデックス５２１は、記憶されたクランプのクランプフィンガープリントを含む。例えば、ストレージコントローラ３２０は、クランプフィンガープリント６３５とフィンガープリントインデックス５２１内の既存のクランプフィンガープリントとを比較することによってクランプ６３０に対して重複排除を実行する。クランプフィンガープリント６３５がフィンガープリントインデックス５２１内の既存のクランプフィンガープリントに一致する場合、クランプ６３０は既にストレージプール３００に記憶されており、従ってストレージコントローラ３２０は、クランプ６３０をストレージノードに記憶しない。一方で、クランプフィンガープリント６３５がフィンガープリントインデックス５２１内のクランプフィンガープリントのいずれにも一致しない場合、クランプ６３０は現在のところストレージプール３００に記憶されておらず、従ってストレージコントローラ３２０は、クランプ６３０をストレージノードのうちの１つに記憶する。ある実施形態では、重複排除を空間再利用ジョブ中に実行することができる。空間再利用については、本明細書のＲＥ-ＥＮＣＲＹＰＴＩＮＧ  ＤＡＴＡ  ＵＳＩＮＧ  ＳＰＡＣＥ  ＲＥＣＬＡＭＡＴＩＯＮ（空間再利用を用いたデータの再暗号化）の節において詳細に説明する。
【００６５】
ある実施形態では、ＤＶＡｈ４０５が、クランプをキャッシュ１１３に記憶する前に、生成されたクランプの重複排除を実行することができる。例えば、処理エンジン５２０は、キャッシュマネージャ５１３と通信してキャッシュ１１３内にクランプ６３０のクランプフィンガープリント６３５が存在するかどうかを判断するように構成することができる。クランプフィンガープリント６３５がキャッシュ１１３内に存在する場合、クランプ６３０はキャッシュ１１３に記憶されない。一方で、クランプフィンガープリント６３５がキャッシュ１１３内に存在しない場合、キャッシュマネージャ５１３は、クランプ６３０をキャッシュ１１３に記憶する。
【００６６】
データ復号
ある実施形態では、ＤＶＡｈ４０５が、ストレージプール３００又はキャッシュ１１３のいずれかに記憶されている暗号化データを読み出すための読み出し要求を受け取ると、要求されたデータを復号して読み出すためにストレージコントローラ３２０から適切な暗号鍵を検索する。例えば、ＣＢｌｏｃｋ６０１からデータを読み出すための読み出し要求が受け取られた場合、処理エンジン５２０は、ＣＢｌｏｃｋ６０１を含む適切なクランプであるクランプ６３０を突き止める。ＣＢｌｏｃｋ６０１は、ＣＢｌｏｃｋ６２１に圧縮され暗号化されているので、処理エンジン５２０は、ＣＢｌｏｃｋ６２１に関連するメタデータを読み出して、ＣＢｌｏｃｋ６２１と共に記憶されている暗号化インデックス値を特定する。暗号化インデックス値が、処理エンジン５２０が到着書き込みデータを暗号化するために現在使用している暗号化インデックス値と同じものである場合、処理エンジン５２０は、現在記憶されている暗号鍵を用いてＣＢｌｏｃｋ６２１を復号することができる。一方で、ＣＢｌｏｃｋ６２１のメタデータからの暗号化インデックス値が、処理エンジン５２０が現在使用している暗号化インデックス値と異なる場合、処理エンジン５２０は、ＣＢｌｏｃｋ６２１を復号するのに必要な暗号鍵を検索するための暗号鍵要求を生成してストレージコントローラ３２０に送信する。ストレージコントローラ３２０は、処理エンジン５２０から暗号鍵要求を受け取ると、暗号化インデックス値を用いて暗号化テーブルから暗号鍵を検索し、暗号鍵と暗号化インデックス値とを処理エンジン５２０に返送する。その後、処理エンジン５２０は、受け取った暗号鍵を用いてＣＢｌｏｃｋ６２１を復号し、ＣＢｌｏｃｋ６２１を解凍して、ＣＢｌｏｃｋ６０１に記憶されている解凍された復号データを生成して読み出す。
【００６７】
暗号鍵の循環
ＤＶＡｈ４０５がデータを暗号化するために使用する暗号鍵は、セキュリティを目的として定期的に又は要求時に更新することができる。暗号鍵を定期的に更新することで、ハッカーが暗号化データを復号する脅威が防がれる。また、セキュリティ侵害が暗号鍵の更新を促してデータの再暗号化を引き起こすこともできる。
【００６８】
ある実施形態では、暗号化テーブルが、複数行の暗号鍵と暗号化インデックス値とを含む。ストレージコントローラ３２０は、暗号鍵を循環させるために、次の暗号鍵を生成して暗号化テーブルの次の行に組み込むように構成される。ストレージコントローラ３２０は、暗号化テーブルの最後の行に達すると、最初に戻ってテーブルの先頭の行を再使用するように構成される。ある実施形態では、暗号化テーブルを、暗号化テーブル内の暗号鍵の値を更新するように構成することができる。暗号鍵と暗号化インデックス値とのペアについて暗号鍵の値が更新された場合には、古い暗号鍵と暗号化インデックス値とのペアを使用する全ての暗号化データを再暗号化する必要がある。例えば、暗号化テーブルが暗号鍵と暗号化インデックス値とのペアを１００行含み、現在ストレージコントローラ３２０が行番号１００の暗号鍵と暗号化インデックス値とのペアを使用している場合、ストレージコントローラ３２０は、最初に戻って行番号１の暗号鍵と暗号化インデックス値とのペアを使用するように構成される。暗号鍵の行の再利用時に暗号化テーブルが行番号１について新たな暗号鍵を生成する場合、行番号１の暗号鍵と暗号化インデックス値とのペアを用いて以前に暗号化された暗号化データは、行番号１に関連する暗号鍵と暗号化インデックス値とのペアの新たな値で再暗号化される。
【００６９】
１つの実施形態では、暗号化テーブルに新たな暗号鍵が組み込まれると、以前に暗号化されたデータは、この新たに組み込まれた暗号鍵で再暗号化される。１つの実施形態では、暗号化テーブル内の行が、その行に関連する暗号鍵で暗号化された全てのデータが別の暗号鍵で再暗号化されるまで再使用されない。
【００７０】
ある実施形態では、暗号化テーブルが、暗号鍵と暗号化インデックス値とのペアに関連する暗号化アルゴリズムの列を行毎に含む。暗号化アルゴリズムは、関連する暗号鍵を用いてデータを暗号化するための暗号化方法を記述する。ストレージプール３００は、同時に複数の暗号化アルゴリズムをサポートするように構成することができる。例えば、暗号鍵の循環中に、新たに割り当てられた暗号鍵が異なる暗号化方法に関連付けられた場合、ストレージコントローラ３２０は、ストレージプール３００及びキャッシュ１１３に記憶されている全てのデータを新たな暗号鍵と新たな暗号化アルゴリズムとで再暗号化するように構成される。ストレージプール３００内及びホスト１００上のキャッシュ１１３内に記憶されているデータを再暗号化するには、最初に暗号化データを復号した後に、新たな暗号鍵及び暗号化方法を用いてデータを再暗号化する必要がある。
【００７１】
空間再利用を用いたデータの再暗号化
ストレージプール３００内及びホスト１００上のキャッシュ１１３内に記憶されているデータの再暗号化プロセスは、空間再利用を用いて行うことができる。空間再利用とは、もはやアクセスできない記憶データによって現在占められている記憶スペースを再利用するプロセスのことである。空間再利用中には、今もなお使用されているデータが新たな記憶領域にコピーフォワードされる。コピーフォワード段階中には、データを復号した後に新たな暗号鍵を用いて再暗号化することができる。
【００７２】
ある実施形態では、ストレージプール３００内のファイルシステムが、ストレージプール３００内でどのようにデータを編成するかを管理する。例えば、ファイルシステムは、データをストレージプール３００内のログ構造ファイルシステムとして編成することができる。ログ構造ファイルシステムとは、データが１又は２以上のデータログに順次に書き込まれるファイルシステムのことである。各データログは、本明細書ではコンテナと呼ぶ特定の記憶領域を含むことができる。コンテナは、設定されたコンテナのサイズに基づいて複数のクランプを記憶することができる。上述したように、ストレージコントローラ３２０は、ストレージノードのコンテナ内にクランプを記憶するための書き込み要求を受け取る。
【００７３】
ファイルシステムに記憶されたオブジェクトは、時間の経過とともに更新されて削除され、ファイルシステムは、もはやどのソフトウェアアプリケーションも使用していないデータ（本明細書では「デッドデータ」と呼ぶ）を含むクランプを蓄積する。デッドデータを含むクランプは、「デッドクランプ」と呼ばれる。例えば、最初にクランプＡ、Ｂ及びＣ上にオブジェクトＯが記憶されていると仮定する。オブジェクトＯが更新された場合には、更新されたバージョンのオブジェクトＯをクランプＸ、Ｙ及びＺに書き出すことができる。この更新に応答して、オブジェクトＯをクランプＡ、Ｂ及びＣにマッピングするメタデータが削除され、オブジェクトＯをクランプＸ、Ｙ及びＺにマッピングするメタデータが作成される。クランプＡ、Ｂ及びＣに他のオブジェクトがマッピングされていないと仮定すれば、更新後にはクランプＡ、Ｂ及びＣがデッドになる。すなわち、クランプＡ、Ｂ及びＣ上のデータは、もはやどのソフトウェアアプリケーションによっても使用されていない。空間再利用は、デッドクランプによって占められている記憶領域を再利用して、新たな「生きた（ライブ）」データの記憶にクランプを再利用できるようにする処理である。空間再利用中には、既存のコンテナ内のライブクランプが新たなコンテナにコピーされることにより、ライブクランプとデッドクランプの両方を含んでいた以前のコンテナを再利用できるようになる。ライブクランプを既存のコンテナから新たなコンテナに移動させるプロセスは、コピーフォワード動作と呼ばれる。
【００７４】
ある実施形態では、データログ内で作成された新たなコンテナにライブクランプを移動させることによって既存のコンテナからの記憶スペースを再利用する空間再利用ジョブを用いて空間再利用を行うことができる。ストレージコントローラ３２０は、空間再利用ジョブの複数のステップを協調させるように構成されたジョブコントローラと呼ばれるソフトウェア層を含むことができる。別の実施形態では、ジョブコントローラを、ストレージプール３００に通信可能に結合された別個のサーバに実装することができる。ジョブコントローラは、異なる空間再利用タスクを１又は２以上のタスクワーカに委任するように構成される。タスクワーカとは、ストレージプール３００内の特定のストレージノード上に実装された、並行して実行できるプロセス又はスレッドのことを意味する。特定のストレージノード上に位置するタスクワーカは、対応するストレージノードに記憶されたクランプに関連するタスクを受け取る。別の実施形態では、タスクワーカが、ホスト１００上に実装されたプロセス又はスレッドを意味することができる。
【００７５】
ジョブコントローラは、空間再利用ジョブをスケジュールすべき時点、利用可能なタスクワーカに委任するためにデータを複数のタスクに分割する方法を決定するとともに、タスクワーカの状態を管理してどのタスクワーカが特定のタスクに利用可能であるかを決定するように構成される。ある実施形態では、ジョブコントローラが、ストレージプール内の現在利用可能な記憶スペース、或いは記憶されているクランプ上の暗号鍵及び／又は暗号化方法を更新する必要性に基づいて、空間再利用ジョブを開始すると決定することができる。例えば、新たな暗号鍵をホストに送信することが必要になったり、古い暗号鍵を使用する暗号化データを再暗号化することが必要になったりする場合がある。
【００７６】
空間再利用ジョブは、ライブクランプを識別して新たなコンテナに移動させるマークアンドスイープ及び／又はコピーフォワードの技術を実装する複数の段階を含むことができる。マークアンドスイープとは、（ａ）現在「生きている（ライブ）」オブジェク又はソフトウェアエンティティが「到達可能な」オブジェクトを識別し、（ｂ）これらのオブジェクトのデータを記憶しているクランプを「ライブ」としてマーキングし、（ｃ）「ライブ」としてマーキングされていない全てのクランプを解放することを伴う方法である。ある実施形態では、ジョブコントローラが、（１）ファイルシステムメタデータを用いてライブオブジェクトを識別し、（２）オブジェクトからクランプへのマッピングに基づいて、ライブオブジェクトを含むクランプをライブクランプとして識別し、（３）フィンガープリントインデックス５２１を用いて、識別されたライブクランプを含むコンテナを決定する、というマークアンドスイープタスクをタスクワーカに委任するように構成される。
【００７７】
ジョブコントローラは、ライブクランプを含むコンテナを決定すると、ライブクランプを新たなコンテナにコピーフォワードすべきコンテナＩＤのサブセットをタスクワーカに委任するように構成される。ある実施形態では、タスクワーカの各々が、コンテナＩＤのサブセットを受け取り、各コンテナを反復して各コンテナ内のライブクランプにコピーフォワード動作を実行する。
【００７８】
ある実施形態では、タスクワーカが、特定のコンテナのライブクランプの各ＣＢｌｏｃｋ内に記憶されている暗号化インデックス値を特定するように構成される。例えば、特定のライブクランプをクランプ６３０とした場合、タスクワーカは、クランプ６３０内のＣＢｌｏｃｋに関連するメタデータを読み出して、ＣＢｌｏｃｋ６２１〜６２４内のデータを暗号化するために使用された暗号化インデックス値を特定する。ある実施形態では、タスクワーカを、ＣＢｌｏｃｋの復号に必要な暗号鍵を検索するための暗号鍵要求をストレージコントローラ３２０に送信するように構成することができる。タスクワーカは、ストレージコントローラ３２０から暗号鍵を受け取ると、受け取った暗号鍵を用いてＣＢｌｏｃｋを復号する。１つの実施形態では、タスクワーカが、受け取った暗号鍵をキャッシュに入れ、これらの暗号鍵を後続のライブクランプ内のＣＢｌｏｃｋの復号に使用することができる。
【００７９】
１つの実施形態では、ストレージコントローラ３２０を、コピーフォワードするコンテナＩＤのサブセットをジョブコントローラが最初に送信する際に現在の暗号鍵と暗号化インデックス値とをタスクワーカに送信するように構成することができる。タスクワーカは、現在の暗号鍵を用いてＣＢｌｏｃｋを暗号化するように構成される。ＣＢｌｏｃｋが暗号化された後には、この暗号化ＣＢｌｏｃｋのための新たなクランプが生成され、この新たなクランプがコピーフォワード処理の一部として新たなコンテナに記憶される。
【００８０】
キャッシュ内データの再暗号化
空間再利用の一部として、キャッシュ１１３に記憶されている暗号化データを再暗号化することもできる。ジョブコントローラは、キャッシュ１１３内のデッドクランプを除去してキャッシュ１１３に記憶されているライブクランプを再暗号化することにより、記憶スペースを再利用するジョブをタスクワーカに委任するように構成することができる。ある実施形態では、１又は２以上のタスクワーカを処理エンジン５２０内のプロセスとして実装することができる。タスクワーカは、キャッシュ１１３に記憶されているクランプをウォークスルーしてライブクランプを識別するように構成することができる。その後、タスクワーカは、識別されたライブクランプ内のＣＢｌｏｃｋに関連する暗号鍵インデックス値を特定する。ある実施形態では、タスクワーカを、ＣＢｌｏｃｋの復号に必要な暗号鍵を検索するための暗号鍵要求をストレージコントローラ３２０に送信するように構成することができる。タスクワーカは、ストレージコントローラ３２０から暗号鍵を受け取ると、受け取った暗号鍵を用いてＣＢｌｏｃｋを復号する。１つの実施形態では、タスクワーカが、受け取った暗号鍵をキャッシュに入れ、これらの暗号鍵を後続のライブクランプ内のＣＢｌｏｃｋの復号に使用することができる。
【００８１】
次に、タスクワーカは、ストレージコントローラ３２０から受け取った現在の暗号鍵を用いてＣＢｌｏｃｋを再暗号化する。１つの実施形態では、ジョブコントローラ３２０を、記憶スペースを再利用するジョブを最初に委任する際に現在の暗号鍵と暗号化インデックス値とをタスクワーカに送信するように構成することができる。ＣＢｌｏｃｋが暗号化された後には、この暗号化ＣＢｌｏｃｋのための新たなクランプが生成され、この新たなクランプがキャッシュ１１３に記憶される。
【００８２】
別の実施形態では、キャッシュ１１３に記憶されているデータを再暗号化するタスクを、ホスト１００内のＤＶＡｈ４０５によって、ストレージコントローラ３２０によって、或いはユーザ又はシステム管理者によって手動で開始されるスタンドアロンプロセスとすることもできる。
【００８３】
ハードウェアの概要
１つの実施形態によれば、本明細書で説明する技術が、１又は２以上の専用コンピュータ装置によって実装される。この専用コンピュータ装置は、これらの技術を実行するためのハードウェア組み込み型とすることもでき、或いはこれらの技術を実行するように永続的にプログラムされた１又は２以上の特定用途向け集積回路（ＡＳＩＣ）又はフィールドプログラマブルゲートアレイ（ＦＰＧＡ）などのデジタル電子装置を含むこともでき、或いはファームウェア、メモリ、その他の記憶装置、又はこれらの組み合わせに含まれるプログラム命令に従ってこれらの技術を実行するようにプログラムされた１又は２以上の汎用ハードウェアプロセッサを含むこともできる。このような専用コンピュータ装置は、カスタムハードワイヤードロジック、ＡＳＩＣ又はＦＰＧＡと、これらの技術を実現するためのカスタムプログラミングとを組み合わせることもできる。この専用コンピュータ装置は、デスクトップコンピュータシステム、ポータブルコンピュータシステム、ハンドヘルド装置、ネットワーク装置、又はこれらの技術を実装するためのハードワイヤードロジック及び／又はプログラムロジックを組み込んだ他のいずれかの装置とすることもできる。
【００８４】
例えば、図７は、実施形態を実装できるコンピュータシステム７００を示すブロック図である。コンピュータシステム７００は、情報を通信するためのバス７０２又はその他の通信機構、及びバス７０２に結合された、情報を処理するためのハードウェアプロセッサ７０４を含む。ハードウェアプロセッサ７０４は、例えば汎用マイクロプロセッサとすることができる。
【００８５】
コンピュータシステム７００は、バス７０２に結合された、情報とプロセッサ７０４が実行すべき命令とを記憶するランダムアクセスメモリ（ＲＡＭ）又はその他の動的記憶装置などのメインメモリ７０６も含む。メインメモリ７０６は、プロセッサ７０４が実行すべき命令の実行中に一時的変数又はその他の中間情報を記憶するために使用することもできる。このような命令は、プロセッサ７０４がアクセスできる非一時的記憶媒体に記憶された時に、コンピュータシステム７００を、命令内で指示される動作を実行するようにカスタマイズされた専用機械の状態にする。
【００８６】
コンピュータシステム７００は、バス７０２に結合された、静的情報とプロセッサ７０４のための命令とを記憶するリードオンリメモリ（ＲＯＭ）７０８又はその他の静的記憶装置をさらに含む。情報及び命令を記憶するための磁気ディスク、光学ディスク又は固体ディスクなどの記憶装置７１０も設けられ、バス７０２に結合される。
【００８７】
コンピュータシステム７００は、バス７０２を介して、コンピュータユーザに情報を表示するブラウン管（ＣＲＴ）などのディスプレイ７１２に結合することができる。バス７０２には、プロセッサ７０４に情報及びコマンド選択を伝える英数字キー及びその他のキーを含む入力装置７１４も結合される。別のタイプのユーザ入力装置には、プロセッサ７０４に方向情報及びコマンド選択を伝えてディスプレイ７１２上のカーソルの動きを制御するマウス、トラックボール又はカーソル方向キーなどのカーソル制御７１６がある。通常、この入力装置は、装置が平面内の位置を特定できるようにする第１の軸（例えば、ｘ）及び第２の軸（例えば、ｙ）という２つの軸における２つの自由度を有する。
【００８８】
コンピュータシステム７００は、カスタマイズされたハードワイヤードロジック、１又は２以上のＡＳＩＣ又はＦＰＧＡ、ファームウェア、及び／又はコンピュータシステムと組み合わせてコンピュータシステム７００を専用機械にする、又はそのようにプログラムするプログラム論理を用いて、本明細書で説明した技術を実装することができる。１つの実施形態によれば、本明細書の技術が、メインメモリ７０６に含まれる１又は２以上の命令の１又は２以上のシーケンスをプロセッサ７０４が実行したことに応答してコンピュータシステム７００によって実行される。このような命令は、記憶装置７１０などの別の記憶媒体からメインメモリ７０６に読み込むことができる。プロセッサ７０４は、メインメモリ７０６に含まれる命令シーケンスを実行することにより、本明細書で説明した処理ステップを実行するようになる。別の実施形態では、ソフトウェア命令の代わりに又はこれと組み合わせてハードワイヤード回路を使用することができる。
【００８９】
本明細書で使用する「記憶媒体」という用語は、データ及び／又は特定の方法で機械を動作させる命令を記憶するあらゆる非一時的媒体を意味する。このような記憶媒体は、不揮発性媒体及び／又は揮発性媒体を含むことができる。不揮発性媒体は、例えば記憶装置７１０などの光学ディスク、磁気ディスク又は固体ドライブを含む。揮発性媒体は、メインメモリ７０６などの動的メモリを含む。一般的な記憶媒体としては、例えば、フロッピーディスク、フレキシブルディスク、ハードディスク、固体ドライブ、磁気テープ、又は他のあらゆる磁気データ記憶媒体、ＣＤ−ＲＯＭ、他のあらゆる光学データ記憶媒体、穴パターンを有するあらゆる物理媒体、ＲＡＭ、ＰＲＯＭ、及びＥＰＲＯＭ、ＦＬＡＳＨ−ＥＰＲＯＭ、ＮＶＲＡＭ、他のあらゆるメモリチップ又はカートリッジが挙げられる。
【００９０】
記憶媒体は送信媒体とは異なるが、送信媒体と共に使用することもできる。送信媒体は、記憶媒体間の情報の転送に関与する。例えば、送信媒体としては、バス７０２を構成する配線を含む、同軸ケーブル、銅線及び光ファイバが挙げられる。送信媒体は、電波及び赤外線によるデータ通信中に生成されるような音波又は光波の形をとることもできる。
【００９１】
実行のためにプロセッサ７０４に１又は２以上の命令の１又は２以上のシーケンスを搬送することには、様々な形の媒体が関与することができる。例えば、最初にリモートコンピュータの磁気ディスク又は固体ドライブ上で命令を搬送することができる。リモートコンピュータは、その動的メモリにこれらの命令をロードし、モデムを用いて電話回線を介してこの命令を送信することができる。コンピュータシステム７００のローカルモデムは、電話回線上でデータを受け取り、赤外線送信機を用いてデータを赤外線信号に変換することができる。この赤外線信号において搬送されるデータを赤外線検出器が受け取り、適切な回路がこのデータをバス７０２上に配置することができる。バス７０２は、このデータをメインメモリ７０６に搬送し、ここからプロセッサ７０４が命令を取り出して実行する。任意に、メインメモリ７０６が受け取った命令は、プロセッサ７０４による実行前又は実行後に記憶装置７１０に記憶することもできる。
【００９２】
コンピュータシステム７００は、バス７０２に結合された通信インターフェイス７１８も含む。通信インターフェイス７１８は、ローカルネットワーク７２２に接続されたネットワークリンク７２０に結合して双方向データ通信を提供する。例えば、通信インターフェイス７１８は、総合デジタル通信網（ＩＳＤＮ）カード、ケーブルモデム、衛星モデム、又は対応するタイプの電話回線へのデータ通信接続を提供するモデムとすることができる。別の例として、通信インターフェイス７１８を、互換性のあるＬＡＮにデータ通信接続を提供するローカルエリアネットワーク（ＬＡＮ）カードとすることもできる。無線リンクを実装することもできる。このようなあらゆる実装では、通信インターフェイス７１８が、様々なタイプの情報を表すデジタルデータストリームを搬送する電気信号、電磁信号又は光信号を送受信する。
【００９３】
通常、ネットワークリンク７２０は、１又は２以上のネットワークを介して他のデータ装置にデータ通信を提供する。例えば、ネットワークリンク７２０は、ローカルネットワーク７２２を介したホストコンピュータ７２４への、又はインターネットサービスプロバイダ（ＩＳＰ）７２６によって動作するデータ設備への接続を提供することができる。さらに、ＩＳＰ７２６は、今では一般的に「インターネット」７２８と呼ばれるワールドワイドパケットデータ通信ネットワークを介してデータ通信サービスを提供する。ローカルネットワーク７２２及びインターネット７２８は、いずれもデジタルデータストリームを搬送する電気信号、電磁信号又は光信号を使用する。コンピュータシステム７００との間でデジタルデータを搬送する、様々なネットワークを介した信号及びネットワークリンク７２０上の通信インターフェイス７１８を介した信号は、送信媒体の形態例である。
【００９４】
コンピュータシステム７００は、（単複の）ネットワーク、ネットワークリンク７２０及び通信インターフェイス７１８を介してメッセージを送信し、プログラムコードを含むデータを受け取ることができる。インターネットの例では、サーバ７３０が、インターネット７２８、ＩＳＰ７２６、ローカルネットワーク７２２及び通信インターフェイス７１８を介して、アプリケーションプログラムのための要求されたコードを送信することができる。
【００９５】
プロセッサ７０４は、この受け取ったコードを受信時に実行することも、及び／又は後で実行できるように記憶装置７１０又はその他の不揮発性記憶装置に記憶することもできる。
【００９６】
上述した明細書では、実装によって異なり得る数多くの特定の詳細を参照しながら本発明の実施形態を説明した。従って、明細書及び図面については、限定的な意味ではなく例示的な意味でとらえるべきである。本発明の範囲、及び出願人が発明の範囲として意図するものを示す唯一かつ排他的なものは、本出願から特定の形で生じる一連の請求項の逐語的及び等価的範囲であり、これにはあらゆる今後の補正が含まれる。
【図１】
2018142314.tif 000003
【図２】
2018142314.tif 000004
【図３】
2018142314.tif 000005
【図４】
2018142314.tif 000006
【図５】
2018142314.tif 000007
【図６】
2018142314.tif 000008
【図７】
2018142314.tif 000009
【図８】
2018142314.tif 000010
【手続補正書】
【提出日】平成30年4月10日(2018.4.10)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ストレージシステムにおいてデータを暗号化する方法であって、
ホストマシン上で実行中のホスト側モジュールにおいて、前記ホストマシン上で実行中のクライアントから、書き込むべきデータを含むデータストレージ書き込み要求を受け取るステップと、
前記ホスト側モジュールが、前記受け取ったデータを暗号化することによって暗号化データを生成するステップと、
前記暗号化データを、前記ホストマシンから分離したストレージノードに送信するステップと、
を含むことを特徴とする方法。
【請求項２】
前記ホスト側モジュールが、前記受け取ったデータに基づいて１又は２以上のフィンガープリントを生成するステップと、
前記１又は２以上のフィンガープリントに基づいて、前記ストレージシステムによって維持されている暗号化データの重複排除を実行するステップと、
をさらに含む請求項１に記載の方法。
【請求項３】
重複排除を実行するステップは、前記ホスト側モジュールによって、前記暗号化データを前記ストレージノードに送信する前に実行される、
請求項２に記載の方法。
【請求項４】
前記ホスト側モジュールは、前記ホストマシン内の暗号化ブロックのキャッシュを管理し、重複排除を実行するステップは、前記ホスト側モジュールによって、前記１又は２以上のフィンガープリントと前記キャッシュに記憶されているブロックのフィンガープリントとを比較することによって実行される、
請求項２に記載の方法。
【請求項５】
前記データを暗号化することによって前記暗号化データを生成する前に、前記ホスト側モジュールが前記データに対して圧縮を実行するステップをさらに含む、
請求項１に記載の方法。
【請求項６】
前記ホスト側モジュールが、前記受け取ったデータに基づいて１又は２以上のフィンガープリントを生成するステップと、
前記暗号化データを１又は２以上のクランプにパッケージ化するステップと、
前記１又は２以上のフィンガープリントに基づいて、前記１又は２以上のクランプの１又は２以上のフィンガープリントを生成するステップと、
をさらに含む請求項１に記載の方法。
【請求項７】
前記データを暗号化することによって前記暗号化データを生成するステップは、
前記データを暗号化するために使用すべき暗号鍵を前記ストレージシステムに要求するステップと、
前記ストレージシステムから、前記暗号鍵と、前記ストレージシステムによって維持されている暗号化テーブルから前記暗号鍵を識別するために使用される識別子である関連する暗号鍵インデックス値とを受け取るステップと、
前記暗号鍵を用いて前記データを暗号化することによって前記暗号化データを生成するステップと、
を含む、請求項１に記載の方法。
【請求項８】
前記ストレージシステムから受け取った前記関連する暗号鍵インデックス値を前記暗号化データのメタデータ内に記憶するステップをさらに含む、
請求項７に記載の方法。
【請求項９】
前記ホスト側モジュールにおいて、前記ホストマシン上で実行中の前記クライアントから、暗号化データを含む特定のクランプからデータを読み出すための要求を受け取るステップと、
前記ホスト側モジュールが、前記暗号化データに関連する前記特定のクランプと前記メタデータとにアクセスすることによって、前記特定のクランプ内に前記暗号化データと共に記憶されている前記関連する暗号鍵インデックス値を特定するステップと、
前記ホスト側モジュールが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された暗号鍵インデックス値に関連する暗号鍵を識別するステップと、
前記ホスト側モジュールが、前記識別された暗号鍵を用いて前記特定のクランプ内の前記暗号化データを復号することによって復号データを生成するステップと、
前記ホスト側モジュールが、前記復号データを前記クライアントに送信するステップと、
をさらに含む請求項８に記載の方法。
【請求項１０】
前記ホスト側モジュールにおいて、前記ホストマシン上に存在するキャッシュに記憶されているクランプ内のデータを再暗号化するための要求を受け取るステップと、
前記ホスト側モジュールが、前記キャッシュに記憶されている前記クランプを読み出すことによって、再暗号化すべきクランプの組を識別するステップと、
前記ホスト側モジュールが、前記クランプ内の関連するメタデータから、前記クランプの組内のデータを復号するために必要な前記暗号鍵を識別するために使用される識別子を表す１又は２以上の暗号鍵インデックス値の組を特定するステップと、
前記ホスト側モジュールが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された１又は２以上の暗号鍵インデックス値の組に関連する１又は２以上の暗号鍵の組を識別するステップと、
前記ホスト側モジュールが、前記識別された１又は２以上の暗号鍵の組を用いて前記暗号化データを復号することによって前記クランプの組から復号データを生成するステップと、
前記ホスト側モジュールが、新たな暗号鍵を用いて前記復号データを暗号化することによって暗号化データを生成するステップと、
前記ホスト側モジュールが、前記暗号化データをクランプの組にパッケージ化するステップと、
前記クランプの組を前記キャッシュに記憶するステップと、
をさらに含む請求項８に記載の方法。
【請求項１１】
前記ホストマシンから分離した前記ストレージノードにおいて、前記ストレージノード上に記憶されているクランプ内のデータを再暗号化するための要求を受け取るステップと、
前記ストレージノードで実行中のタスクワーカが、前記ストレージノード上に記憶されている前記クランプを読み出すことによって、暗号化すべきクランプの組を識別するステップと、
前記タスクワーカが、前記クランプ内の関連するメタデータから、前記クランプの組内のデータを復号するために必要な前記暗号鍵を識別するために使用される識別子を表す１又は２以上の暗号鍵インデックス値の組を特定するステップと、
前記タスクワーカが、前記ストレージシステムによって維持されている前記暗号化テーブルに基づいて、前記特定された１又は２以上の暗号鍵インデックス値の組に関連する暗号鍵を識別するステップと、
前記タスクワーカが、前記識別された１又は２以上の暗号鍵の組を用いて前記暗号化データを復号することによって前記クランプの組から復号データを生成するステップと、
前記タスクワーカが、新たな暗号鍵を用いて前記復号データを暗号化することによって暗号化データを生成するステップと、
前記タスクワーカが、前記暗号化データをクランプの組にパッケージ化するステップと、
前記クランプの組を前記ストレージノードに記憶するステップと、
をさらに含む請求項８に記載の方法。
【請求項１２】
ストレージシステムにおいてデータを暗号化するための命令を記憶する非一時的コンピュータ可読媒体であって、前記命令は、１又は２以上のプロセッサによって実行された時に、請求項１から１１のいずれか１項に記載の方法の実行を引き起こす、
ことを特徴とする非一時的コンピュータ可読媒体。
【請求項１３】
１又は２以上のプロセッサと、メモリと、ストレージとを備えた１又は２以上のコンピュータ装置であって、請求項１から１１のいずれか１項に記載の方法を実行するようにプログラムされる、
ことを特徴とするコンピュータ装置。
【外国語明細書】
2018142314000001.pdf