JP6677740B2 - ストレージシステム - Google Patents

ストレージシステム Download PDF

Info

Publication number
JP6677740B2
JP6677740B2 JP2017546459A JP2017546459A JP6677740B2 JP 6677740 B2 JP6677740 B2 JP 6677740B2 JP 2017546459 A JP2017546459 A JP 2017546459A JP 2017546459 A JP2017546459 A JP 2017546459A JP 6677740 B2 JP6677740 B2 JP 6677740B2
Authority
JP
Japan
Prior art keywords
data
address
flash package
flash
real
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2017546459A
Other languages
English (en)
Other versions
JPWO2017068904A1 (ja
Inventor
山本 彰
山本  彰
篤志 河村
篤志 河村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Publication of JPWO2017068904A1 publication Critical patent/JPWO2017068904A1/ja
Application granted granted Critical
Publication of JP6677740B2 publication Critical patent/JP6677740B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/064Management of blocks
    • G06F3/0641De-duplication techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0608Saving storage space on storage systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • G06F3/0613Improving I/O performance in relation to throughput
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/0614Improving the reliability of storage systems
    • G06F3/0619Improving the reliability of storage systems in relation to data integrity, e.g. data losses, bit errors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0683Plurality of storage devices
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/08Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers from or to individual record carriers, e.g. punched card, memory card, integrated circuit [IC] card or smart card
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management
    • G06F12/0238Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
    • G06F12/0246Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory in block erasable memory, e.g. flash memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0668Interfaces specially adapted for storage systems adopting a particular infrastructure
    • G06F3/0671In-line storage system
    • G06F3/0673Single storage device
    • G06F3/0679Non-volatile semiconductor memory device, e.g. flash memory, one time programmable memory [OTP]

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Human Computer Interaction (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Microelectronics & Electronic Packaging (AREA)
  • Computer Security & Cryptography (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

本発明は、ストレージシステムにおける重複排除技術に関する。
フラッシュメモリを記憶媒体とする記憶デバイスは、HDDなどに比べ圧倒的に高速であるため、ビットコストの低下に伴い、近年急速に普及しつつある。また、これまでのストレージシステムは、HDDなどの記憶デバイスを複数搭載し、高信頼化、高性能化を実現してきた。このため、フラッシュメモリを記憶媒体とする記憶デバイスも、ストレージシステム内に複数搭載され、ストレージコントローラが、フラッシュメモリを記憶媒体とする記憶デバイスを制御するのが一般的である。また、フラッシュメモリを記憶媒体とする記憶デバイスには、HDDと互換性のあるフォームファクター、インターフェイスを備えるものがある。これはSDDと呼ばれる。一方でHDDとの互換性をもたないものも存在する。本発明は、双方を対象とし、以下、これをフラッシュパッケージと呼ぶ。
フラッシュメモリは、磁気ディスクなどに比べ、ビットコストが高価であるため、格納データ容量を削減して見かけ上の容量を大きくするニーズは高い。ストレージシステムにおいて、データ格納容量を削減する技術の一つに、重複排除技術がある。本技術では、ストレージコントローラが、ストレージシステムに同内容のデータが複数格納されているかチェックする。同内容のデータ(重複データ)が複数ある場合、そのうちの1つだけがストレージシステムに残され、残りのデータは削除される。これにより、記憶装置に格納するデータ量が削減される。
たとえば特許文献1では、複数のフラッシュメモリモジュールを搭載したストレージ装置における重複排除技術が開示されている。特許文献1に開示のストレージ装置は、フラッシュメモリモジュールと呼ばれる記憶デバイスを複数搭載する。また特許文献1に開示のストレージ装置は、データをストライプユニットと呼ばれるデータ単位に分割し、分割されたデータを、複数のフラッシュメモリモジュールに分散格納する。重複排除処理を行う際、ストレージコントローラはストライプユニット以上のサイズのデータに対して、複数のフラッシュメモリモジュールに跨る範囲で重複排除を行う。そしてフラッシュメモリモジュールは、フラッシュメモリモジュール内のデータを対象に、ストライプユニット以下のサイズのデータの重複排除を行う。特許文献1に開示の技術では、複数の記憶デバイスに跨る範囲で重複排除が行われるため、記憶デバイスのデータだけを対象にした重複排除処理を行う場合に比べてデータ量削減の効果が大きくなる。
一方、近年、ストレージシステムでは、容量仮想化機能が普及している。容量仮想化機能とは、ストレージシステムが有する記憶デバイスの物理的な容量より大きな仮想的な容量をホスト側に提供する機能で、一般にストレージシステム内のストレージコントローラがこの機能を有する。これは、ユーザが実際にストレージを使用する場合、ユーザが定義したユーザボリューム(ユーザからみた記憶装置)の容量に対し、実際にユーザボリュームに格納されるデータの量は、ユーザボリュームの容量にはなかなか達しないという特性を利用したものである。
すなわち、容量仮想化機能を用いない場合、ユーザはボリューム定義時に、ボリュームの容量に等しい物理記憶領域を確保する必要がある。容量仮想化機能を用いると、ボリューム定義時点では、ユーザはボリュームの容量に相当する物理記憶領域を必ずしも用意しておく必要ない。実際にボリュームにデータライトが発生したとき、初めてボリュームに記憶領域が割り当てられる。これによって、あらかじめ用意すべき記憶デバイスの容量を削減でき、かつユーザはボリューム容量を厳密に定義する必要なく、単純に大きく余裕をもった値を定義すればよいため、使い勝手も向上できる。
特許文献2では、複数のフラッシュパッケージを有するストレージシステムにおいて、ストレージコントローラだけでなくフラッシュパッケージにも容量仮想化機能を設ける技術が開示されている。さらに特許文献2に開示のストレージシステムでは、フラッシュパッケージがデータを圧縮することも開示されている。一般に、データの圧縮率はデータの内容によって異なるため、圧縮後のデータサイズを予測することは困難である。また、データが更新されれば、当然、圧縮率は変化する。このため、特許文献2では、圧縮率の変化によって、フラッシュパッケージがストレージコントローラに提供するボリュームのサイズ(仮想容量)を変化させる技術が公開されている。
米国特許出願公開第2009/0089483号明細書 米国特許出願公開第2012/0317333号明細書
ストレージシステムの格納データ量の増大に従って、重複排除処理の負荷は増大する。特許文献1に開示されている技術では、複数の記憶デバイスに跨る範囲のデータを対象にした重複排除処理はストレージコントローラが行う。そのため格納データ量が増加するにつれ、ストレージコントローラが性能上のボトルネックになり得る。一方、記憶デバイスで重複排除処理を行うと、その重複排除処理で対象とされるデータは、記憶デバイス内のデータに限られ、重複排除の効率が上がらない。
本発明において解決しようとする課題は、多数のフラッシュパッケージを含む大規模ストレージシステムにおいて、ストレージシステム全体で、性能に与える影響を少なくしつつ、重複排除技術を利用してフラッシュメモリへの格納データ容量を削減し、見掛け上より多く容量のデータを格納するようにすることである。
本発明の一実施形態に係るストレージシステムは、複数のフラッシュパッケージと、ホストとフラッシュパッケージ間でリード・ライト処理を制御するストレージコントローラを有する。当該ストレージシステムは、複数のフラッシュパッケージのうち第1フラッシュパッケージの第1アドレスに、第2フラッシュパッケージの第2アドレスに書き込まれているデータと同一データが書き込まれると、第1フラッシュパッケージに、第1アドレスに対応付けて第2アドレスを記憶させて重複排除を行う。
第1フラッシュパッケージが、第2アドレスを第1アドレスに対応付けて記憶している状態の時に、ストレージコントローラから第1アドレスに対するリード要求を受領すると、第2アドレスをストレージコントローラに返送する。第2アドレスを受領したストレージコントローラは、第2フラッシュパッケージにリード要求を発行することで、第2フラッシュパッケージからリード対象データを取得する。
本発明によれば、フラッシュパッケージを多数接続した大容量のストレージシステムにおいて、フラッシュパッケージ間のデータの重複排除を実行でき、かつ、ストレージコントローラの性能劣化を抑えつつ、データ格納量を削減し、物理容量よりも大きな量のデータを格納することが可能となる。
実施例1または2におけるストレージシステムを含む情報システムの構成を示す図である。 フラッシュパッケージの構成を示す図である。 論理ボリューム、仮想ページ、実ページ、フラッシュパッケージグループの関係を表した概念図である。 フラッシュボリュームと実ブロックの関係を表した概念図である。 実施例1におけるストレージシステムの共有メモリに格納された情報を示す図である。 論理ボリューム情報の形式を示す図である。 実ページ情報の形式を示す図である。 フラッシュパッケージ情報の形式を示す図である。 フラッシュパッケージグループ情報の形式を示す図である。 空き実ページ管理情報キューの構造を表した図である。 ハッシュ値格納情報の形式を示す図である。 実施例1におけるフラッシュパッケージのパッケージメモリ内に格納された情報を示す図である。 パッケージ情報の形式を示す図である。 チップ情報の形式を示す図である。 実ブロック情報の形式を示す図である。 空き実ブロック情報キューの構造を表す図である。 仮想ブロックグループ情報の形式を示す図である。 重複排除処理が行われた時の、仮想セグメントの状態を表した概念図である。 履歴情報の形式を示す図である。 ハッシュインデックス情報の構造を表す図である。 リーフセグメントの説明図である。 実施例1におけるストレージコントローラのメモリ内に格納されるプログラムを示す図である。 実施例1または2におけるリード処理実行部の処理フローを示す図である。 ライト要求受付部の処理フローを示す図である。 ライトアフタ処理実行部の処理フローを示す図である。 実施例1における重複排除スケジュール部の処理フローを示す図である。 第1のリスト及び第2のリストの内容の説明図である。 消去候補の内容の説明図である。 重複候補の内容の説明図である。 実施例1におけるフラッシュパッケージのパッケージメモリに格納されるプログラムを示す図である。 データリード処理実行部の処理フローを示す図である。 ハッシュ指定型リード実行部の処理フローを示す図である。 データライト処理実行部の処理フロー(1)を示す図である。 データライト処理実行部の処理フロー(2)を示す図である。 履歴情報送信部の処理フローを示す図である。 重複排除実行部の処理フローを示す図である。 重複排除判定部の処理フローを示す図である。 実施例2における重複排除スケジュール部の処理フローを示す図である。 実施例3または4に係る仮想ストレージシステムを含む情報システムの構成を示す図である。 ストレージシステム情報の形式を示す図である。 実施例3または4におけるリード処理実行部の処理フローを示す図である。 実施例3または4における外部パッケージリード実行部の処理フローを示す図である。 実施例3における重複排除スケジュール部の処理フローを示す図である。 実施例4におけるハッシュ値格納情報の形式を示す図である。 実施例4における重複排除スケジュール部の処理フローを示す図である。
以下、幾つかの実施例について、図面を用いて説明する。実施例の説明に入る前に、実施例で用いられる各種用語について説明する。
「ボリューム」とは、ストレージシステムや記憶デバイス等のターゲットデバイスが、ホスト計算機等のイニシエータに提供する記憶空間のことを意味する。イニシエータがボリューム上の領域に対するデータ書き込み要求を発行すると、その領域に割り当てられている物理記憶領域にデータが格納される。
以下で説明する実施例に係るストレージシステムでは、ストレージコントローラと記憶デバイス(フラッシュパッケージ)のそれぞれに、容量仮想化機能が実装されている。本明細書において、ストレージコントローラが容量仮想化機能を用いて定義するボリュームで、ホストに提供されるボリュームのことは「論理ボリューム」と呼ばれる。一方フラッシュパッケージがストレージコントローラに提供するボリュームで、容量仮想化機能を用いて定義されたボリュームを、「フラッシュボリューム」と呼ぶ。ストレージコントローラの持つ容量仮想化機能は、上位レベルの容量仮想化機能と呼ばれ、フラッシュパッケージが持つ容量仮想化機能は、下位レベルの容量仮想化機能と呼ばれる。
論理ボリューム(またはフラッシュボリューム)上の領域には、初期状態(ボリュームが定義された直後)では物理記憶領域が割り当てられていない。ホスト(またはストレージコントローラ)が論理ボリューム(またはフラッシュボリューム)上の領域にデータ書き込み要求を発行した時点で、ストレージコントローラ(またはフラッシュパッケージ)は、その領域に割り当てられるべき物理記憶領域を動的に決定する。
以下で説明する実施例では、論理ボリュームに物理記憶領域を割り当てる時の最小単位は「ページ」と呼ばれる。一般にページとは、フラッシュメモリにおける読み書き処理の最小単位を指すが、以下で説明する実施例では、フラッシュメモリにおけるリード・ライトの単位は、ページではなく「セグメント」と呼ぶ。また論理ボリュームに割り当てられる記憶領域のことは「実ページ」と呼ばれ、実ページが割り当てられる対象となる、論理ボリューム上の領域は「仮想ページ」と呼ばれる。
フラッシュメモリにおける、データの消去単位は「ブロック」と呼ばれる。ブロックには、複数のセグメントが含まれるため、ブロックのサイズはセグメントサイズの整数倍である。一方、以下で説明する実施例におけるページ(実ページ)は、ブロックまたはセグメントとは直接的に関係のない概念で、ページのサイズとブロック(またはセグメント)のサイズとの間には、必ずしも相関がなければならないわけではない。ただし以下の実施例では、説明の簡単化のため、実ページは少なくともセグメントの整数倍という関係にある例が説明される。
フラッシュパッケージは、容量仮想化機能を用いて「フラッシュボリューム」を定義する。フラッシュボリュームに物理記憶領域を割り当てる単位は、以下で説明される実施例ではセグメントである。つまりフラッシュメモリにおける読書き処理の最小単位と等しい。フラッシュボリュームに割り当てられる物理記憶領域は「実セグメント」と呼ばれ、実セグメントが割り当てられるフラッシュボリューム上領域は「仮想セグメント」と呼ばれる。
記憶領域の「更新」とは、記憶領域に格納されているデータの内容を新しい内容に書き換える(上書きする)ことを意味する。ある記憶領域が更新される前に、その記憶領域に格納されていたデータは、「更新前データ」または「旧データ」と呼ばれる。一方その記憶領域に新たに書き込まれるデータのことは、「更新データ」または「更新後データ」と呼ばれる。
本実施例では、「重複排除」とは、ストレージシステム等の記憶装置内に内容が同一のデータが複数存在する場合、1つだけを記憶装置に残し、それ以外のデータを記憶装置から削除する処理である。以下で説明する実施例に係るストレージシステムでは、重複排除の単位はセグメントである。重複排除の単位とは、2つ(以上の)データの異同を比較する時の、各データの最小サイズである。つまり以下で説明する実施例ではセグメントごとにデータの比較が行われる。そして同一データの書き込まれた実セグメントが複数ある場合、1つの実セグメントだけが残される。
以下で説明するいくつかの実施例に係るストレージシステムでは、フラッシュパッケージが重複排除処理を実施することがある。またこのフラッシュパッケージのように容量仮想化機能が用いられる場合、(1または複数の)フラッシュボリューム上の複数の仮想セグメントに対して同内容のデータが書き込まれた場合、同内容のデータが書き込まれた各仮想セグメントには、共通の実セグメントが割り当てられる。
本実施例において、データの「特徴量」とは、データに対して所定の演算を施すことで得られる値を意味する。所定の演算の種類は必ずしも特定の物に限定される必要はない。ただし同内容の複数のデータに所定の演算を施した場合、必ず同じ値が導出されることが保証されている必要がある。この条件に該当する演算の例として、たとえばSHA−256等のハッシュ関数がある。ハッシュ関数を用いて算出される値のことをハッシュ値と呼ぶ。ハッシュ値は特徴量の一例である。ハッシュ値のサイズは、元のデータのサイズに比べて非常に小さい(たとえば数百分の一のサイズ)になるため、例えば複数のデータの異同を判定する場合(たとえば重複排除処理)際に用いられる。
以下で説明する実施例では、特に断りのない限り、特徴量の計算にSHA−256等のハッシュ関数が用いられる。本実施例では、データAにハッシュ関数を適用することでハッシュ値Hが求められる場合、値HはデータAの特徴量、またはデータAのハッシュ値と呼ばれる。逆にデータAのことを、「ハッシュ値Hを持つデータ」と呼ぶことがある。
本実施例において「衝突」とは、複数の異なるデータそれぞれに対して所定の演算を施して特徴量を生成した時、生成されたそれぞれの特徴量が同一になることを意味する。データ同士の比較に特徴量を用いる場合、衝突が発生することは好ましくない。上で挙げたハッシュ関数SHA−256により生成されるハッシュ値は、衝突が発生する確率が極めて低いという特徴がある。
図1は、本実施例における情報システムの構成を示す。情報システムは、ストレージシステム100、ホスト110と両者を接続するSAN(Storage Area Network)120を有する。ホスト110は、ユーザアプリケーションが動作するコンピュータで、ストレージシステム100との間で、SAN120経由で、必要なデータを読み書きする。SAN120は例えば、Fibre Channel等の規格に従うネットワークである。また、本発明は、ホスト110とストレージシステム100を直接、接続しても有効である。
ストレージシステム100は、一つ以上のストレージコントローラ200、キャッシュメモリ210、共有メモリ220、フラッシュパッケージ230、そしてこれらの構成要素を接続する一つ以上の接続装置250、とを有する。また、図1では、ストレージシステム100内の記憶デバイスは、すべてフラッシュパッケージ230であるが、ストレージシステム100はHDDのような他の種類の記憶デバイスを含んでいてもよい。また、本実施例において、フラッシュパッケージ230の容量はすべて等しいものとする。ただし別の実施形態として、ストレージシステム100に搭載される各フラッシュパッケージ230の容量が異なっていてもよい。
ストレージコントローラ200は、ホスト110から発行されたリードライト要求を処理するプロセッサ260とメモリ270を有する。本実施例に係るストレージシステム100の特徴の1つは、重複排除処理をフラッシュパッケージ230が実行することである。一般に、重複排除処理においては、ストレージシステム100等の記憶装置に新たにデータ(データAと呼ぶ)が書き込まれた場合、ハッシュ値のような特徴量を計算する。もしデータAの特徴量と同じ特徴量を持つデータが存在した場合(仮にそのデータを、データBと呼ぶ)、データAとデータBをビット単位で比較する。比較の結果データAとBが同じであれば、データAは記憶装置に格納しないようにして、格納容量を削減する。特徴量を用いるのは、データの内容を比較する候補を絞り込むためである。本実施例に係るストレージシステム100では、特徴量の計算はフラッシュパッケージ230が行う。ただし別の実施形態として、特徴量の計算がストレージコントローラ200で行われてもよい。
接続装置250は、ストレージシステム100内の各構成要素を接続する機構である。また、本実施例では、高信頼化のために、各フラッシュパッケージ230は、複数の接続装置250で複数のストレージコントローラ200に接続されているものとする。ただし、一つのフラッシュパッケージ230が一つの接続装置250にしか接続されていない場合も本発明は有効である。
キャッシュメモリ210、共有メモリ220は、通常DRAMなどの揮発メモリで構成されるが、バッテリーなどにより不揮発化されているものとする。ただ、本発明は、キャッシュメモリ210、共有メモリ220が不揮発化されていなくても有効である。
キャッシュメモリ210には、フラッシュパッケージ230に格納されたデータの中で、ストレージコントローラ200からよくアクセスされるデータが格納される。またストレージコントローラ200はキャッシュメモリ210をいわゆるライトバックキャッシュとして用いる。つまりストレージコントローラ200は、ホスト110からライト要求と共に受け取ったデータを、キャッシュメモリ210に書き込み、その時点でホスト110にライト要求が完了した旨を応答する。キャッシュメモリ210からフラッシュパッケージ230へのデータ書き込みは、ホスト110からのライト要求とは非同期に実施されてよい。ただし別の実施形態として、いわゆるライトスルー方式(ライトデータがフラッシュパッケージ230に格納された時点で、ホスト110にライト要求が完了した旨を応答する方式)が用いられてもよい。
共有メモリ220は、キャッシュメモリ210の制御情報、ストレージシステム100内の重要な管理情報、ストレージコントローラ200間の連絡情報、同期情報などが格納される。
なお、本実施例に係る各フラッシュパッケージ230はボリューム(記憶空間)を形成し、このボリュームの領域をストレージコントローラ200に提供する。つまりストレージコントローラ200はフラッシュパッケージ230を、一台の記憶デバイスとして認識する。また本実施例では、フラッシュパッケージ230が形成するボリュームを、「フラッシュボリューム」と呼ぶ。
またストレージコントローラ200は、高信頼化のために、フラッシュパッケージ230のデータを回復できるRedundant Arrays of Inexpensive/Independent Disks/Devices (RAID)機能をもっているものとする。RAID機能では、複数(たとえば4つ)のフラッシュパッケージ230から成るグループ(いわゆるRAIDグループ)が定義され、RAIDグループ内の一台のフラッシュパッケージ230が故障した場合には、ストレージコントローラ200はRAIDグループ内の残りのフラッシュパッケージ230に格納されている情報をもとに、故障したフラッシュパッケージ230に格納されていたデータ内容を復旧することができる。本実施例では、この複数のフラッシュパッケージ230から成るRAIDグループのことを、フラッシュパッケージグループ280と呼ぶ。フラッシュパッケージグループ280は複数定義されてよい。なお、RAID機能をストレージコントローラ200がもっていなくとも本発明は有効である。また、本発明は、ストレージシステム100内に、フラッシュパッケージ230以外の記憶デバイス、例えば、HDD(Hard Disk Drive)のような記憶デバイスが含まれていても有効である。
図2は、フラッシュパッケージ230の構成を示している。フラッシュパッケージ230は、不揮発性半導体メモリを記憶媒体として用いたフラッシュチップ300を複数有し、またパッケージプロセッサ310、パッケージメモリ320、バッファ330、パッケージバス340、パッケージバス転送装置350、ハッシュ回路370を有する。なお、本実施例では、フラッシュパッケージ230は、圧縮・伸張機能を持っていない例を説明する。ただし、フラッシュパッケージ230が圧縮・伸張機能を持っていてもよい。
ハッシュ回路370は、ストレージコントローラ200からフラッシュパッケージ230に書き込まれたデータのハッシュ値(特徴量)を計算する。本実施例ではハッシュ値の算出の際、衝突確率が極めて小さいSHA−256などのハッシュアルゴリズムが用いられる。そのため、2つのデータから生成されるハッシュ値が等しければ、2つのデータの内容は等しいと判断できる。ただし別の実施形態として、SHA−256以外のハッシュアルゴリズムが用いられてもよい。
パッケージプロセッサ310は、ストレージコントローラ200からのリード・ライト要求を受け付け、対応する処理を実行する。バッファ330は、ストレージコントローラ200とフラッシュチップ300との間でリード・ライトされるデータを格納する。本実施例では、バッファ330は揮発メモリであるものとする。またパッケージプロセッサ310はストレージコントローラ200からライト要求と書き込みデータを受け取ると、受け取った書き込みデータをフラッシュチップ300に書き込んだ後、ストレージコントローラ200にライト処理が完了した旨を通知する。ただし、本発明は、バッファ330が不揮発メモリで、ストレージコントローラ200から受け取ったライト要求を、受け取った書き込みデータをバッファ330に書き込んだ段階で、完了させても有効である。
パッケージメモリ320には、パッケージプロセッサ310が実行するプログラム、フラッシュチップ300の管理情報などが格納される。フラッシュパッケージ230の管理情報は重要な情報であるので、計画停止時には、管理情報を特定のフラッシュチップ300に退避できることが望ましい。また、突発的な障害に備え、バッテリーをもち、これを利用して、障害などが発生しても、管理情報を特定のフラッシュチップ300に退避できることが望ましい。
重複排除に関するすべての情報をパッケージメモリ320に格納すると、パッケージメモリ320の容量が大きくなりコスト高になり得る。そのため、本実施例に係るフラッシュパッケージ230では、全情報はフラッシュチップ300に格納され、一部の情報がパッケージメモリ320に格納されるものとする。ただし別の実施形態として、すべての情報がパッケージメモリ320に格納されるようにしてもよい。
パッケージバス340は、バッファ330とフラッシュチップ300との間でデータ転送を行うバスで、一本以上存在する。性能向上のために、フラッシュパッケージ230は複数のパッケージバス340を持つのが一般的だが、一本でも本発明は有効である。
パッケージバス転送装置350は、パッケージバス340ごとに存在し、パッケージプロセッサ310の指示にしたがって、バッファ330とフラッシュチップ300との間で、データ転送を実行する。
ハッシュ回路370は、バッファ330に接続されていて、パッケージプロセッサ310の指示に従い、ストレージコントローラ200から書き込まれたデータのハッシュ値を計算する。
フラッシュチップ300はたとえば、NAND型フラッシュメモリ等の不揮発性半導体メモリチップである。フラッシュメモリは周知のとおり、データの読み出し・書き込みの単位はセグメント(一般的にはページと呼ばれるが、本明細書ではセグメントと呼ぶ)である。またデータ消去は、セグメントの集合であるブロック(本実施例では、実ブロックと呼ばれる)ごとに行われる。フラッシュチップ300内には、実ブロックの集合体であるダイが複数個存在しており、さらに実ブロックには複数のセグメントが存在している。なお本実施例では、実ブロックに存在するセグメントのことを、「実セグメント」と呼ぶ。そしてフラッシュボリューム上の領域で、実セグメントの割り当てられる領域のことを「仮想セグメント」と呼ぶ。
フラッシュパッケージ230は、各フラッシュチップ300に識別番号を付して管理する。フラッシュチップ300の識別子をチップIDと呼ぶ。また、各ダイ、各実ブロックにも識別番号が付される。ダイの識別番号をダイ番号、実ブロックの識別子をブロック番号と呼ぶ。ダイ番号はダイが属するフラッシュチップ300内で一意な識別番号で、ブロック番号は実ブロックが属するダイの中で一意な識別番号である。また実ブロック内の実セグメントに付される識別番号は、相対セグメント番号と呼ばれる。実ブロック内の先頭実セグメントの相対セグメント番号は0で、後続の実ブロックには順に、1、2、…の番号が付される。
続いて、本実施例におけるストレージシステム100が管理する情報について説明するが、その前に論理ボリューム、フラッシュボリュームの構成について説明する。本実施例においては、ストレージコントローラ200は上位レベルの容量仮想化機能をサポートしているものとする。ただし、本発明は、ストレージコントローラ200が、上位レベルの容量仮想化機能をもっていなくとも有効である。
通常、上位レベルの容量仮想化機能において、記憶領域の割り当て単位は、ページと呼ばれる。なお、本実施例では、論理ボリュームの空間は、仮想ページという単位で分割されているものとし、フラッシュパッケージグループ280の記憶領域は、実ページという単位で分割されているものとする。
図3を用いて、論理ボリューム、仮想ページ、実ページ、フラッシュパッケージグループ280の関係について説明する。ストレージコントローラ200は、1以上の論理ボリュームを定義して、ホスト110等の上位装置に提供することができる。そして先に述べたとおり、ストレージコントローラ200は、各論理ボリュームの記憶空間を、複数の仮想ページ(図3:VP0、VP1、VP2)という所定単位の領域に分割して管理している。なお、仮想ページのサイズは、共有メモリ220内の仮想ページ容量2600(後述)に格納されている。また、本実施例に係るストレージシステム100においては、すべての仮想ページの容量は同じとするが、ストレージシステム100内に異なるサイズの仮想ページが存在する構成でもよい。
仮想ページは、ストレージコントローラ200内部で論理ボリュームの記憶空間の管理のためにのみ用いられる概念である。ホスト110は論理ボリュームの記憶領域にアクセスする際には、LBA(Logical Block Address)などのアドレスを用いて、アクセス対象の記憶領域を特定する。ホスト110が論理ボリュームへのアクセス要求を発行した時、ストレージコントローラ200は、ホスト110が指定したLBAを仮想ページ番号(各仮想ページに付されている識別番号)及び仮想ページ内の相対アドレス(仮想ページ先頭からのオフセットアドレス)に変換する。この変換は、LBAを仮想ページサイズで除算することで実現できる。仮に仮想ページのサイズがP(MB)とすると、論理ボリュームの先頭位置からP(MB)分の領域が仮想ページ#0(#0は仮想ページ番号を表す)として管理され、その次のP(MB)分の領域が仮想ページ#1として管理される。そしてそれ以降も同様に、P(MB)の領域がそれぞれ、仮想ページ#2、#3…として管理される。
ストレージコントローラ200が論理ボリュームを定義した直後は、各仮想ページに物理記憶領域は割り当てられていない。ストレージコントローラ200は、ホスト110から仮想ページに対するライト要求を受け付けた時点ではじめて、当該仮想ページに対して物理記憶領域を割り当てる。仮想ページに割り当てられる物理記憶領域のことを実ページと呼ぶ。図3では、仮想ページ#0(VP0)に実ページRP0が割り当てられている状態を表している。
実ページとは、フラッシュパッケージグループ280の複数のフラッシュボリュームの記憶領域を用いて形成される領域である。図3において、230−1,230−2,230−3,230−4はそれぞれ、各フラッシュパッケージ230のフラッシュボリュームを表している。また、図3で例示しているフラッシュパッケージグループ280のRAIDタイプは、RAID4の3D+1P構成(データドライブ3台、パリティドライブ1台で構成されるRAIDグループ)である。
ストレージコントローラ200は、フラッシュパッケージグループ280に属する各フラッシュパッケージ230のフラッシュボリューム(230−1,230−2,230−3,230−4)を、ストライプブロックと呼ばれる複数の固定サイズの記憶領域に分割して管理する。たとえば図3において、0(D),1(D)、2(D)…、またはP0,P1…と記載されているそれぞれの領域が、ストライプブロックを表している。また本実施例では、ストライプブロックのサイズは、フラッシュボリュームの仮想セグメントのサイズと等しい例を説明するが、別の実施形態として、ストライプブロックと仮想セグメントのサイズは異なっている構成が採用されてもよい。
図3で、ストライプブロックのうち、P0,P1…と記載されているストライプブロックは、RAID機能により生成される冗長データ(パリティ)の格納されるストライプブロックであり、これを「パリティストライプ」と呼ぶ。一方、0(D),1(D)、2(D)…と記載されているストライプブロックは、ホスト110から書き込まれるデータ(冗長データではないデータ)が格納されるストライプブロックである。このストライプブロックのことは、「データストライプ」と呼ばれる。パリティストライプには、複数のデータストライプを用いて生成される冗長データが格納される。
以下、パリティストライプと、当該パリティストライプに格納される冗長データを生成するために用いられるデータストライプのセットのことを、「ストライプライン」と呼ぶ。本実施例に係るストレージシステム100の場合、たとえばパリティストライプP0には、データストライプ0(D),1(D),2(D)を用いて生成される冗長データ(パリティ)が格納される関係にあり、データストライプ0(D),1(D),2(D)とパリティストライプP0は、同一のストライプラインに属する。
つまり1つのストライプラインに属する各ストライプブロックは、フラッシュボリューム(230−1,230−2,230−3,230−4)上の同じ位置(アドレス)に存在する。ただし別の実施形態として、同一ストライプラインに属する各ストライプブロックが、フラッシュボリューム上の異なるアドレスに存在する構成が採用されてもよい。そして本実施例に係るストレージシステム100では、図3に示されるように、実ページ(たとえばRP0、RP1)は、1または複数のストライプラインから構成される。
また実ページが仮想ページに割り当てられる場合、データストライプ(0(D),1(D)等)のみが割り当てられ、パリティストライプは割り当てられない。そのため、実ページ上のライトデータの格納される領域の合計サイズは、仮想ページのサイズと等しい関係にある。つまり、(実ページのサイズーパリティ格納領域のサイズ)=仮想ページサイズ、の関係にある。図3ではRAID4の構成例についてのみ示されているが、たとえばフラッシュパッケージグループ280のRAIDタイプがRAID1の場合には、実ページサイズは、仮想ページサイズ(仮想ページ容量2600)の2倍になる。
仮想ページ内の各領域と、実ページ内の各領域との関係(マッピング)は、図3に示されている通りである。つまり、実ページの先頭ストライプからパリティを除いた領域(0(D)、1(D)、2(D))が、仮想ページの先頭領域に割り当てられている。それ以降も同様に、実ページの2番目以降の各ストライプからパリティを除いた領域(3(D)、4(D)、5(D)…)が、順番に仮想ページの領域に割り当てられる。
このように、仮想ページ内の各領域と実ページ内の各領域とのマッピングは規則的にマッピングされているため、ストレージシステム100は、ホスト110からのアクセス要求で指定されている論理ボリューム上のアクセス位置(LBA)から仮想ページ番号及び仮想ページ内の相対アドレス(仮想ページ先頭からのオフセットアドレス)を求めることで、当該アクセス位置に対応付けられているフラッシュパッケージ230及びそのフラッシュパッケージ230内の領域(データストライプ)を一意に算出できる。さらにアクセス位置に対応付けられているデータストライプに加え、そのデータストライプと同一ストライプラインに属するパリティストライプも一意に定まる。ただし、仮想ページ内の各領域と実ページ内の各領域とのマッピングは、ここで説明したマッピング方法に限定されるものではない。
また容量仮想化技術においては、各論理ボリュームを定義する時、実記憶媒体の容量よりも各論理ボリュームの合計記憶容量が大きくなるように定義することもできる。このため一般的に、仮想ページ数のほうが、実ページ数より多い。本発明の実施例に係るストレージ装置でも、仮想ページ数を実ページ数より多くすることができる。
なお、論理ボリューム中の各仮想ページに割り当てられる実ページは、必ずしも同一フラッシュパッケージグループ280内の実ページに限定されない。仮想ページ#0に割り当てられる実ページと、仮想ページ#1に割り当てられる実ページが、それぞれ異なるフラッシュパッケージグループ280内の実ページであってもよい。ただし本実施例では、1つの論理ボリュームの各仮想ページに割り当てられるべき実ページは全て、RAIDタイプが同じフラッシュパッケージグループ280から割り当てられる例を説明する。
続いてフラッシュボリュームについて説明する。本実施例においては、それぞれのフラッシュパッケージ230は、容量仮想化機能(下位レベルの容量仮想化機能)をもっており、かつ重複排除処理を行う。そのためフラッシュパッケージ230はストレージコントローラ200に、見かけ上、実際の物理容量(フラッシュチップ300の合計容量)より大きな容量を持つフラッシュボリュームを提供できる。図4は、フラッシュボリュームV1と実ブロックの関係を示したものである。
フラッシュパッケージ230は、フラッシュボリュームV1を、実ブロックm個分のサイズに等しい領域に分割して管理している。本実施例では、この領域を「仮想ブロックグループ」と呼ぶ。また便宜上、仮想ブロックグループ内の、実ブロックのサイズと等しいサイズの領域のことを、「仮想ブロック」と呼ぶ。つまり仮想ブロックグループは、m個の仮想ブロックから構成される記憶領域といえる。
各仮想ブロックグループには識別番号が付され、これを仮想ブロックグループ番号と呼ぶ。また、仮想ブロックグループ番号がn(nは0以上の整数値とする)の仮想ブロックグループのことを「仮想ブロックグループ#n」と表記する。またこの表記方法は、仮想ブロックグループ以外の物(セグメント、ページ等)にも用いられる。実ブロック(または仮想ブロック)のサイズがB(KB)の時、フラッシュボリュームV1の先頭からm×B(KB)の領域が仮想ブロックグループ#0として管理され、以下順に、各m×B(KB)の領域が、仮想ブロックグループ#1、#2…として管理される。
本実施例では、フラッシュパッケージ230が、まだ実ブロックを割り当てていない仮想ブロックグループに対する書き込み要求を受け付けたとき、はじめて実ブロックを割り当てる。また本実施例に係るフラッシュパッケージ230は、1つの仮想ブロックグループに対して最大で(m+1)個の実ブロックを割り当てる。以下、本実施例で、実ブロックの最大割り当て数をm+1個にした理由を以下に示す。
仮に、仮想ブロックグループにm個の実ブロックを割り当てる方法が用いられるケースを想定する。また仮想ブロックグループの全領域にデータが書き込まれ、その時データがほとんど重複排除できなかった場合を想定する。この場合、仮想ブロックグループに実ブロックがm個割り当てられるが、実ブロックに空き容量はほとんどないことになる。
このとき、ブロック内の一部のデータを書き換える要求(普通のライト要求)を、ストレージコントローラ200からフラッシュパッケージ230が受け取った場合を想定する。フラッシュメモリのブロックは書き換えができないので、フラッシュパッケージ230は、そのブロックの全データをバッファ330に読み出し、バッファ330上で書き換え要求の発生した部分だけ更新して、当該ブロックを一度消去した後、ブロック全体にデータを格納しなければならない。フラッシュパッケージ230がライト要求を受け取るたびに、以上の動作(ブロックのリード、消去、そしてライト)を実行すると、処理時間が過大になりすぎ、実用的とは言いがたい。
これを解決するため、本実施例に係るフラッシュパッケージ230では仮想ブロックグループに実ブロックを1つ余計に割り当てて、空き領域を確保することにより、空き領域に追加書き込みを行うようにする。空き領域が小さくなって、書き換えデータに入らなくなった場合、消去処理を行う。これにより、複数回(たとえばn回)のライト要求に対して1回消去処理を実行すればよいので、性能を向上させることができる。また、消去処理の回数の削減は、フラッシュメモリの長寿命化にもつながる。
先にも述べたが、フラッシュメモリのアクセス(読み書き)単位は、「セグメント」である。そのためフラッシュパッケージ230はフラッシュボリュームV1の空間を、セグメントのサイズと等しい領域ごとに分割して管理する。この領域は「仮想セグメント」と呼ばれる。図4において、仮想セグメント#0、仮想セグメント#1、…が仮想セグメントを表す。仮想セグメントは、重複排除処理の単位でもある。
フラッシュパッケージ230がストレージコントローラ200からフラッシュボリュームV1に対するアクセス要求を受け付けると、まずアクセス要求で指定されているアドレスを、仮想セグメントを特定するための識別子に変換する。フラッシュパッケージ230で用いられる、仮想セグメントを特定するための識別子には、複数の種類(内部仮想セグメント番号、相対仮想セグメント番号、仮想セグメントアドレス)がある。
内部仮想セグメント番号は、フラッシュパッケージ230内で仮想セグメントを一意に特定可能な識別子である。フラッシュボリュームV1の先頭に位置する仮想セグメントの内部仮想セグメント番号は0と定められている。そして後続の仮想セグメントの内部仮想セグメント番号には順に、1,2,…の連続番号が用いられる。図4において、各仮想セグメントに付されている番号(#1、#s等)は、内部仮想セグメント番号を表している。
相対仮想セグメント番号は、仮想ブロックグループ内で仮想セグメントを一意に特定可能な識別子である。各仮想ブロックグループ内の先頭の仮想セグメントの相対仮想セグメント番号は0と定められている。そして後続の各仮想セグメントの相対仮想セグメント番号には順に、1,2,…の連続番号が用いられる。
仮想セグメントアドレスは、内部仮想セグメント番号にフラッシュパッケージの識別子(パッケージIDと呼ばれる)を連結して生成されるアドレスである。仮想セグメントアドレスが与えられると、ストレージシステム100内で1つの仮想セグメントを一意に特定可能である。
続いて、本実施例におけるストレージシステム100が管理する情報の説明を行う。図5は、ストレージシステム100の共有メモリ220の中に格納される情報のうち、本実施例に関係する情報を示している。共有メモリ220には少なくとも、論理ボリューム情報2000、実ページ情報2100、空き実ページ管理情報ポインタ2200、フラッシュパッケージグループ情報2300、フラッシュパッケージ情報2500、仮想ページ容量2600に、ハッシュ値格納情報2400が格納される。ハッシュ値格納情報2400以外のこれらの情報は、上位レベルの容量仮想化技術を実現するために必要な情報である。
以下、それぞれの情報について説明する。図6は、論理ボリューム情報2000の形式を示したものである。論理ボリューム情報2000は、論理ボリュームごとに存在する情報で、論理ボリュームの属性情報を管理するための情報である。以下、ある論理ボリューム情報2000によって属性情報が管理される論理ボリュームのことを、「管理対象論理ボリューム」と呼ぶ。論理ボリューム情報2000は、論理ボリュームID2001、論理容量2002、論理ボリュームRAIDタイプ2003、実ページポインタ2004を含む。
論理ボリュームID2001は、管理対象論理ボリュームのIDを示す。一般的に、ホスト110は、論理ボリュームの識別子(たとえばLogical Unit Number(LUN)等の識別子である)、論理ボリューム内のアドレス(LBA)、読み書きしたいデータの長さを指定して、アクセス要求(リード要求やライト要求)を発行する。論理ボリュームID2001には、ホスト110が論理ボリュームに対してアクセス要求を発行する時に指定する、論理ボリュームの識別子が格納される。
論理容量2002は、管理対象論理ボリュームの容量である。論理ボリュームRAIDタイプ2003は、管理対象論理ボリュームのRAIDタイプを表す。論理ボリュームRAIDタイプ2003に格納される情報には、RAID0、RAID1などのRAIDタイプの他、RAID5のように、N台の容量に対し、1台の容量の冗長データを格納する場合、Nの具体的数値が含まれる。ただし、任意のRAIDタイプが指定できるわけでなく、少なくとも一つのフラッシュパッケージグループ280がもつRAIDタイプである必要がある。管理対象論理ボリュームの仮想ページに実ページを割り当てる際、ストレージコントローラ200は、フラッシュパッケージグループ280のRAIDタイプが論理ボリュームRAIDタイプ2003と同じフラッシュパッケージグループ280から実ページを選択する。
実ページポインタ2004は、管理対象論理ボリュームの仮想ページに割り当てられた実ページのページ管理情報(後述する実ページ情報2100)へのポインタである。実ページポインタ2004の数は、管理対象論理ボリュームの仮想ページの数(論理容量2002を仮想ページ容量2600で割った数になるが、余りがでれば+1)である。管理対象論理ボリュームの仮想ページ数がnであれば、実ページポインタ2004はn個存在する(2004−0〜2004−(n−1)の実ページポインタが存在する)。
論理ボリューム情報2000内の複数の実ページポインタ2004(2004−0〜2004−(n−1))のうち、先頭からk番目の実ページポインタ2004−(k−1)には、仮想ページ#(k−1)に割り当てられた実ページのページ管理情報(後述する実ページ情報2100)へのポインタが格納される。また、実ページが割り当てられる契機は、論理ボリュームが定義された時ではなく、仮想ページに対して実際にデータ書き込みの要求を受信した契機である。したがって、まだ書き込みが行われていない仮想ページに対応する実ページポインタ2004は無効値(NULL)になっている。
図7は、実ページ情報2100の形式である。実ページ情報2100は、実ページについての情報を管理するためのもので、実ページごとに1つの実ページ情報2100が存在する。実ページ情報2100は、パッケージグループ2101、実ページアドレス2102、空きページポインタ2103、ページデータ格納量2104を含む。なお、以下の実ページ情報2100の説明の過程で、ある実ページ情報2100によって管理される実ページのことを、「管理対象実ページ」と呼ぶ。
パッケージグループ2101には、管理対象実ページが属するフラッシュパッケージグループ280の識別子が格納される。以下、フラッシュパッケージグループ280の識別子のことを、「パッケージグループID」と呼ぶ。
実ページアドレス2102には、管理対象実ページが存在する位置(アドレス)の情報が格納される。実ページアドレス2102に格納されるアドレスは、管理対象実ページが属するフラッシュパッケージグループ280内の相対アドレスである。空きページポインタ2103は、管理対象実ページが仮想ページに割り当てられていない場合に用いられる情報である。本実施例において、仮想ページに割り当てられていない実ページのことを、「空き実ページ」または「空きページ」と呼ぶ。管理対象実ページが仮想ページに割り当てられていない場合、その空きページポインタ2103には、別の空きページの実ページ情報2100が格納される。管理対象実ページが仮想ページに割り当てられている場合、空きページポインタ2103はヌル(NULL)値となる。
ページデータ格納量2104は、管理対象実ページに格納したデータ量である。ただし、この情報は、管理対象実ページに割り当てられているフラッシュパッケージ230(の記憶領域)に関する属性情報ではなく、管理対象実ページが割り当てられている仮想ページのデータに関する属性情報である。したがって、この仮想ページに別の実ページが割り当てられ、現在の実ページのデータが新しい実ページにコピーされた場合、ページデータ格納量2104を、新しい実ページの管理情報として引き継ぐ必要がある。
図8は、フラッシュパッケージ情報2500のフォーマットを表している。フラッシュパッケージ情報2500はフラッシュパッケージ230を管理するための情報で、フラッシュパッケージID2501、フラッシュパッケージ仮想容量2502、ブロック容量2503を含む。フラッシュパッケージ情報2500は、フラッシュパッケージ230毎に存在する。以下、あるフラッシュパッケージ情報2500で管理されるフラッシュパッケージ230を、管理対象フラッシュパッケージと呼ぶ。
フラッシュパッケージID2501は管理対象フラッシュパッケージの識別子(パッケージIDと呼ぶ)である。フラッシュパッケージ仮想容量2502は、管理対象フラッシュパッケージが形成するフラッシュボリュームの記憶領域のうち、ストレージコントローラ200に提供している領域のサイズであり、本実施例ではこのサイズのことを「仮想容量」と呼ぶ。
本発明では、このフラッシュパッケージ仮想容量2502を、フラッシュパッケージ230の重複排除率などに応じて調整するのが特長である。本実施例では、フラッシュパッケージ230がこの容量を決定するが、ストレージコントローラ200が決定してもよい。フラッシュパッケージ230から、仮想容量が変化した旨の通知を受けると、ストレージコントローラ200は、この値をフラッシュパッケージ仮想容量2502に設定する。
ブロック容量2503は、ブロックのサイズである。したがって、フラッシュパッケージ仮想容量2502をブロック容量2503で割った値が、このフラッシュパッケージ230のブロック数となる。
再び図4を用いて、フラッシュボリュームと仮想容量の関係について概説する。本実施例に係るフラッシュパッケージ230は、フラッシュボリュームV1のうち、仮想容量(フラッシュパッケージ仮想容量2502)に等しいサイズの領域を、ストレージコントローラ200に提供する。原則としてフラッシュボリュームV1上の任意の領域をストレージコントローラ200に提供してもよいが、本実施例では一例として図4に示されるように、フラッシュボリュームV1の先頭から始まる連続領域(領域A。この領域のサイズは仮想容量に等しい)を提供する例を説明する。
仮想容量は、フラッシュパッケージ230の持つ全フラッシュチップ300の合計記憶容量より大きくてもよい。図4において、ストレージコントローラ200はフラッシュボリュームV1上の、領域A(仮想容量に等しいサイズの領域)だけアクセスできる。また仮想容量は、先に述べたとおり変動可能である。仮想容量(つまり領域A)のサイズが増加すると、アクセス可能な領域は増加することになる。
フラッシュパッケージ230の仮想容量の調整は、たとえば特許文献2に記載のものと同様の考え方で行われるとよい。フラッシュボリュームV1上の仮想セグメントのうち、n個の仮想セグメントに対してデータ書き込みが行われたとする。書き込まれたデータはフラッシュチップ300の実セグメントに格納される(実セグメントが消費されると言い換えてもよい)。
重複排除が殆ど行われない場合、n個に近い数の実セグメントが消費される。この場合には、仮想容量はフラッシュパッケージ230内の実セグメントの合計と同程度であることが望まれる。ただし重複排除処理が行われると、データ書き込みが行われた仮想セグメントよりも少ない実セグメントしか消費されない。たとえばn/10個の実セグメントしか消費されないこともあり得る。その場合に、もし仮想容量がフラッシュパッケージ230内の実セグメントの合計と等しいと、多くの実セグメントが未使用となり、記憶領域を有効活用できない。この場合には実セグメントの合計よりも多い記憶容量(たとえば実セグメントの総記憶容量の10倍)を、仮想容量としてストレージコントローラ200に提供すると、フラッシュパッケージ230内の記憶領域(実セグメント)を有効に使用できる。
つまり、データ書き込みが行われた仮想セグメントの量と、消費された実セグメントの量の比(重複排除率という)に応じて、仮想容量を調整(拡張または縮小)すると、フラッシュパッケージ230内の記憶領域(実セグメント)を有効に使用できる。ただし、仮想容量の調整の具体的な方法は、本発明と直接関係しないため、詳細な説明は略す。
またフラッシュパッケージ230は、フラッシュボリュームV1の終端に「隠し領域」と呼ばれる領域を確保している。隠し領域は、後述するハッシュインデックス情報3500を格納するために設けられている。隠し領域にはストレージコントローラ200はアクセスできない。ただしフラッシュパッケージ230で実行されるプログラム(少なくともハッシュインデックス情報3500の参照更新を行うプログラム)は、隠し領域にアクセスできる。
図9は、フラッシュパッケージグループ情報2300の形式を示す。フラッシュパッケージグループ情報2300は、フラッシュパッケージグループ280についての情報を管理するために用いられる。1つのフラッシュパッケージグループ280に対して、1つのフラッシュパッケージグループ情報2300が存在する。
フラッシュパッケージグループ情報2300は、フラッシュパッケージグループID2301、パッケージグループRAIDタイプ2302、実ページ数2303、空き実ページ数2304、フラッシュパッケージポインタ2305を有する。以下、あるフラッシュパッケージグループ情報2300で管理されるフラッシュパッケージグループ280のことを、「管理対象パッケージグループ」と呼ぶ。
フラッシュパッケージグループID2301は、管理対象パッケージグループの識別子である。パッケージグループRAIDタイプ2302は、管理対象パッケージグループのRAIDタイプである。このRAIDタイプは、論理ボリュームRAIDタイプ2003を説明したときに述べたとおりである。
実ページ数2303は、空き実ページ数2304はそれぞれ、管理対象パッケージグループの全実ページ数、空き実ページ数を示す。
フラッシュパッケージポインタ2305は、管理対象パッケージグループに属するフラッシュパッケージ230のパッケージIDである。フラッシュパッケージグループ情報2300に含まれるフラッシュパッケージポインタ2305の数は、管理対象パッケージグループに属するフラッシュパッケージ230の数と等しい。またこの数は、パッケージグループRAIDタイプ2302によって決まる値である。
続いて空き実ページ管理情報ポインタ2200について説明する。空き実ページ管理情報ポインタ2200は、フラッシュパッケージグループ280ごとに設けられる情報である。図10は、空き実ページ管理情報ポインタ2200によって管理される空き実ページの集合を表している。この構造を、空き実ページ管理情報キュー2201と呼ぶ。また、空き実ページに対応した実ページ情報2100を空き実ページ情報2100と呼ぶ。
空き実ページ管理情報ポインタ2200は、空き実ページ管理情報キュー2201の先頭の空き実ページ情報2100をポイントする(つまり空き実ページ管理情報ポインタ2200には、先頭の空き実ページ情報2100のアドレスが格納される)。次に、先頭の実ページ情報2100の中の空きページポインタ2103が次の空き実ページ情報2100を指す。図10では、最後の空き実ページ情報2100の空きページポインタ2103は、空き実ページ管理情報ポインタ2200を指し示しているが、ヌル値が格納されてもよい。
ストレージコントローラ200は、実ページを割り当てていない仮想ページに対する書き込み要求を受け付けると、その仮想ページの属する論理ボリュームの論理ボリュームRAIDタイプ2003と同一のRAIDタイプ(パッケージグループRAIDタイプ2302)を持つフラッシュパッケージグループ280のいずれかを選択し、選択されたフラッシュパッケージグループ280が持つ空き実ページを選択し、仮想ページに割り当てる。例えば、空き実ページ数の最も多いフラッシュパッケージグループ280の空き実ページ管理情報ポインタ2200から、空き実ページが選択されるとよい。
続いて図11を用いて、ハッシュ値格納情報2400のフォーマットを説明する。本実施例に係るストレージシステム100では、重複排除の判定で用いられるハッシュ値は、フラッシュチップ300に格納される。本実施例に係るストレージシステム100の特徴は、ハッシュ値を、複数のフラッシュパッケージ230に分散して格納する点である。ハッシュ値は、データが更新される度に内容が変化することがほとんどである。またデータに比べて容量が小さい。そのためハッシュ値を特定の領域に集約して格納すると、その領域のブロック消去回数がデータに比べ大きくなり、フラッシュメモリの消去回数が早期に限界数に到達する可能性が高い。これが、ストレージシステム100がハッシュ値を複数のフラッシュパッケージ230に分散して格納する理由である。
また、本実施例に係るストレージシステム100のもう一つの特徴は、フラッシュパッケージ230にハッシュ値とデータの双方を格納する点である。これにより、データを格納した実セグメントとハッシュ値を格納した実セグメントの双方の消去回数を、フラッシュパッケージ230が(ローカルな)ウェアレベリングにより、均衡化する。ハッシュ値の更新回数とデータの更新回数のオーダはだいたい同じなので、フラッシュパッケージ230の全体の実セグメントの更新回数は、データの更新回数とほぼ同じオーダにすることができる。
ハッシュ値格納情報2400は、各ハッシュ値をどのフラッシュパッケージ230に格納して管理するかを示した情報である。本実施例に係るストレージシステム100では、ハッシュ空間(ハッシュ値の取りえる値の範囲。たとえばストレージシステム100で用いられるハッシュ関数で得られる値が0〜(2−1)の値をとり得る場合、ハッシュ空間のサイズは2となる)をフラッシュパッケージ230より十分大きな数(仮にk個とする)で分割し、それぞれの分割単位に属するハッシュ値に関する情報を、ストレージシステム100内のいずれかフラッシュパッケージ230に格納する(十分大きな数に分割するのは、それぞれの分割単位により、ハッシュ値に関する情報の大きさはバラバラになる可能性があり、かつ、その情報の更新頻度もバラバラになるためである。たとえば、ハッシュ値の空間が、2の32乗であれば、フラッシュパッケージ230の数(フラッシュパッケージ230の数は多くとも千程度である)より十分大きな数、例えば、数万個に分割される)。
ハッシュ値格納情報2400は、ハッシュ範囲2401とフラッシュパッケージID2402のセットを複数有する。ここでは、ハッシュ範囲2401とフラッシュパッケージID2402のセットを、エクステント2410と呼ぶ。図11ではエクステント2410−1,2410−2、…、2410−kが記載されている。エクステント2410の個数はk個である。ハッシュ空間のサイズが2の場合、最初のハッシュ範囲2401は、0から2÷k−1で、2番目は、2÷kから2×2÷k−1である。i番目は、(i−1)×2÷kからi×2÷k−1である。
フラッシュパッケージID2402には、フラッシュパッケージ230のパッケージIDが格納される。たとえばあるエクステント2410内のハッシュ範囲2401に格納されているハッシュ値範囲がa〜bで、またそのエクステント2410内のフラッシュパッケージID2402がpの場合、フラッシュパッケージ#pに範囲a〜bのハッシュ値が格納されることを意味する。またこの場合、a〜bの範囲のハッシュ値のことを、「フラッシュパッケージ#pが担当するハッシュ値」と呼ぶ。
次に、フラッシュパッケージ230が有する管理情報について説明する。フラッシュパッケージ230は、ほとんどの管理情報をパッケージメモリ320内に格納している。図12は、パッケージメモリ320に含まれる情報を示している。パッケージメモリ320に含まれる情報には、パッケージ情報3000、チップ情報3100、仮想ブロックグループ情報3200、実ブロック情報3300、空き実ブロック情報ポインタ3600、フラッシュパッケージグループ情報2300、ハッシュ値格納情報2400、履歴情報3400、リーフセグメント以外のハッシュインデックス情報3500がある。
ハッシュ値格納情報2400、フラッシュパッケージグループ情報2300は、ストレージコントローラ200が持つハッシュ値格納情報2400、フラッシュパッケージグループ情報2300と殆ど同じであるため、ここでは内容の説明は略す。なお、ストレージシステム100に含まれるすべてのフラッシュパッケージグループ280のフラッシュパッケージグループ情報2300が、パッケージメモリ320内に格納される。
ハッシュ値格納情報2400、フラッシュパッケージグループ情報2300は、たとえば初期化時に、ストレージコントローラ200から各フラッシュパッケージ230に提供される。またストレージコントローラ200がハッシュ値格納情報2400とフラッシュパッケージグループ情報2300を更新するたびに、ストレージコントローラ200は更新した情報を各フラッシュパッケージ230に提供する。
本実施例に係るストレージシステム100で、ストレージコントローラ200がもつハッシュ値格納情報2400と同様の情報を各フラッシュパッケージ230がもつ理由は、重複排除処理の際、ストレージシステム100だけでなく各フラッシュパッケージ230も、各フラッシュパッケージ230が担当しているハッシュ値に関する情報を認識している必要があるためである。
また、フラッシュパッケージ230が、ストレージコントローラ200が管理しているフラッシュパッケージグループ情報2300と同じ情報をもつ理由は、フラッシュパッケージ230が重複排除の判定を行う際に、重複排除されるべきでないデータを識別するためである。たとえば同じストライプラインに属するデータについて重複排除処理が行われると冗長性が失われ、フラッシュパッケージ230の障害時にデータの再生成ができないことがある。そのため本実施例に係るフラッシュパッケージ230は、同じストライプラインに属するデータについては重複排除処理を行わないようにする。その際にフラッシュパッケージ230は、フラッシュパッケージグループ情報2300を用いて、複数のデータが同一ストライプラインに属するか否か判定を行う。
図13は、パッケージ情報3000の形式を示している。パッケージ情報3000は、パッケージID3001、仮想パッケージ容量3002、実パッケージ容量3003、フラッシュブロック容量3004、パッケージ空きブロック数3005、内部情報格納ブロック数3009、内部情報格納アドレス3010を有する。
パッケージID3001は、当該フラッシュパッケージ230の識別子である。仮想パッケージ容量3002は、当該フラッシュパッケージ230の仮想容量である。実パッケージ容量3003は、当該フラッシュパッケージグループ280の物理記憶領域(フラッシュチップ300の実ブロックまたは実セグメント)の容量である。ただこの容量は、ストレージコントローラ200からのライトデータを格納するための容量、重複排除に用いる情報を格納するための容量、パッケージメモリ320の情報を退避するための容量、リクラメーションを行う等の目的で使用される領域(予備領域)の容量の合計である。
フラッシュブロック容量3004は、フラッシュメモリの消去単位であるブロックのサイズである。パッケージ空きブロック数3005は、当該フラッシュパッケージ230内の空きブロックの数である。
内部情報格納ブロック数3009は、パッケージメモリ320に格納されたパッケージ情報3000、チップ情報3100、仮想ブロックグループ情報3200、実ブロック情報3300、履歴情報3400、リーフセグメント以外のハッシュインデックス情報3500、空き実プロック情報ポインタ3600を、電源OFF時または障害発生時に退避させる実ブロック(この実ブロックを「内部情報格納ブロック」と呼ぶ)のブロック数である。内部情報格納アドレス3010は、内部情報格納ブロックのアドレスである。パッケージ情報3000、チップ情報3100、仮想ブロックグループ情報3200、実ブロック情報3300は重要な情報なので、n重に格納してもよい。また、退避される回数はそう多くないので、実ブロックの消去回数なども問題にならないと考えられる。
図14は、チップ情報3100の形式である。チップ情報3100は、フラッシュチップ300の属性情報を管理するための情報である。チップ情報3100は、フラッシュチップ300ごとに存在する情報である。チップ情報3100は、チップID3101、チップ実ブロック数3102、チップ内空き実ブロック数3103、接続バスID3104を有する。以下、あるチップ情報3100が管理対象とするフラッシュチップ300のことを、「管理対象チップ」と呼ぶ。
チップID3101は、管理対象チップのチップIDである。チップ実ブロック数3102は、管理対象チップがもつ実ブロックの数である。チップ内空き実ブロック数3103は、管理対象チップ内の空き実ブロックの数を示している。なお空き実ブロックとは、仮想ブロックグループに割り当てられていない実ブロックのことを意味する。接続バスID3104は、管理対象チップが接続されているパッケージバス340の識別子である。
図15は、実ブロック情報3300の形式である。実ブロック情報3300は、実ブロックごとに存在する情報である。実ブロック情報3300は、実ブロック識別子3301、空き実ブロックポインタ3302、実ブロック内空き容量3304、実セグメントビットマップ3305を含む。以下の説明では、ある実ブロック情報3300の管理対象となる実ブロックを、「管理対象実ブロック」と呼ぶ。
実ブロック識別子3301は、管理対象実ブロックの識別子である。本実施例では実ブロックの識別子は、フラッシュパッケージ230内の実ブロックを一意に特定可能にするために、実ブロックが属するフラッシュチップ300のチップID、ダイ番号、ブロック番号の組み合わせとして表現される。空き実ブロックポインタ3302は、管理対象実ブロックが仮想ブロックグループに割り当てられていない(空き状態にある)時、次の空き状態にある実ブロックの実ブロック情報3300を指している。
実ブロック内空き容量3304は、管理対象実ブロックの現在の空き容量を示している。パッケージプロセッサ310は、ストレージコントローラ200から管理対象実ブロックの実ブロック内空き容量3304以下の大きさのライトデータを受領した時、管理対象実ブロックの空き領域にライトデータを格納できる。ライトデータを格納した後、パッケージプロセッサ310は実ブロック内空き容量3304から格納したデータのサイズを減算する。なお、フラッシュメモリの最小書き込み単位はセグメントなので、格納したデータのサイズは、セグメント(実セグメント)の整数倍である。
実セグメントビットマップ3305は、実ブロック内の実セグメント数がN個の場合、Nビットのサイズの情報である。実セグメントビットマップ3305内のk番目のビットが1(オン)の場合、管理対象実ブロック内の先頭からk番目の実セグメントが使用中(仮想セグメントに割り当てられている)ことを意味し、0(オフ)の場合、管理対象実ブロック内の先頭からk番目の実セグメントが未使用(仮想セグメントに割り当てられていない)であることを意味する。
続いて空き実ブロック情報ポインタ3600について説明する。空き実ブロック情報ポインタ3600は、フラッシュチップ300ごとに存在する。図16は、空き実ブロック情報ポインタ3600によって管理される空き実ブロックの集合を表している。この構造を、空き実ブロック情報キュー1700と呼ぶ。空き実ブロック情報ポインタ3600は、空き実ブロック情報キュー1700内の先頭の空き実ブロックの実ブロック情報3300をポイントする(つまり空き実ブロック情報ポインタ3600には、先頭の空き実ブロックの実ブロック情報3300が格納されている、パッケージメモリ320上アドレスが格納される)。次に、先頭の空き実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302が次の空き実ブロックの実ブロック情報3300をポイントする。図16では、空き実ブロック情報キュー1700の最後尾の空き実ブロックの実ブロック情報3300の空き実ブロックポインタ3302は、空き実ブロック情報ポインタ3600を示しているが、ヌル値でもよい。
パッケージプロセッサ310は、実ブロックが割り当てられていない仮想ブロックグループ内仮想セグメントに対する書き込み要求を受け付けると、フラッシュチップ300の中のいずれかに対応する空き実ブロック情報ポインタ3600から、空き実ブロックを探し、仮想ブロックグループに割り当てる。例えば、空き実ブロック数(チップ内空き実ブロック数3103)の最も多いフラッシュチップ300から、空き実ブロックが選択されるとよい。
図17は、仮想ブロックグループ情報3200の形式である。仮想ブロックグループ情報3200は、仮想ブロックグループを管理するための情報で、仮想ブロックグループごとに存在する情報である。仮想ブロックグループ情報3200はパッケージメモリ320内で、仮想ブロックグループのアドレス順に並んでいるものとする。パッケージメモリ320内の先頭仮想ブロックグループ情報3200が、仮想ブロックグループ#0の管理情報である。またパッケージメモリ320内の先頭からk番目の仮想ブロックグループ情報3200は、仮想ブロックグループ#(k−1)の管理情報である。
仮想ブロックグループ情報3200は、仮想ブロックグループ識別子3201、実ブロック情報ポインタ3202、データ格納量3203、新仮想セグメントポインタ3205、新ハッシュ値3206、旧仮想セグメントポインタ3210、旧ハッシュ値3211、消去防止仮想セグメント数3207、消去防止アドレス3208、消去防止ハッシュ値3209を含む。以下、仮想ブロックグループ情報3200で管理される仮想ブロックグループのことを、「管理対象仮想ブロックグループ」と呼ぶ。
本実施例では、重複排除処理の単位がセグメントである場合の例を説明する。ただし本発明は、重複排除の単位がセグメントでない場合も有効である。本実施例に係るストレージシステム100は、更新データの書き込みが行われた仮想セグメントごとに、当該仮想セグメントに書き込まれた更新データのハッシュ値と同じハッシュ値をもつデータがいずれかのフラッシュパッケージ230に既に格納されていないかをチェックする。もしそのようなデータが既に存在する場合、更新データは格納されない(削除される)。これによって、フラッシュパッケージ230に格納されるデータ量を削減できる効果がある。
仮想ブロックグループ識別子3201は、管理対象仮想ブロックグループの識別子である。実ブロック情報ポインタ3202は、管理対象仮想ブロックグループに割り当てられた実ブロックの、実ブロック情報3300へのポインタ(実ブロック情報3300が格納されている、パッケージメモリ320上アドレス)である。実ブロック情報ポインタ3202は、m+1個存在する。実ブロック情報ポインタ3202は、実ブロックを割り当ていないときには、ヌル値となる。当該仮想ブロックグループに割り当てられている実ブロックの数をp個(m+1以下)とすると、先頭からp個の実ブロック情報ポインタ3202が有効である(ヌル値でない)。
データ格納量3203は、管理対象仮想ブロックグループに格納されているデータ量をあらわす。最大容量は、(実ブロックの容量×(m+1))となる。フラッシュメモリの場合、仮想セグメントの内容が更新されると、それまで仮想セグメントに割り当てられていた実セグメントとは異なる実セグメントに更新データが格納される。そのため、同一の仮想セグメントに対して書き込まれたデータ(最新のデータ及び更新前データ)が複数個所に存在する。そのためデータ格納量3203は、仮想ブロックグループ内仮想セグメントの合計サイズよりも大きくなることがある。
続いて説明する新仮想セグメントポインタ3205、新ハッシュ値3206、消去防止仮想セグメント数3207、消去防止アドレス3208、消去防止ハッシュ値3209、旧仮想セグメントポインタ3210、旧ハッシュ値3211は、仮想ブロックグループ内の仮想セグメントごとに設けられる情報である。以下では、これらの情報をまとめて「仮想セグメント管理情報」と呼ぶこともある。
新仮想セグメントポインタ3205、新ハッシュ値3206、旧仮想セグメントポインタ3210、旧ハッシュ値3211はそれぞれ、仮想ブロックグループ情報3200内に、仮想ブロックグループ内仮想セグメント数と同数存在する情報である。なお、図中で、新仮想セグメントポインタ3205の参照番号が「3205−s」のように記載されている箇所がある。これは相対仮想セグメント番号が“s”の仮想セグメントの新仮想セグメントポインタであることを表している。またこの参照番号の付与規則は、新ハッシュ値3206、旧仮想セグメントポインタ3210、旧ハッシュ値3211、消去防止仮想セグメント数3207、消去防止アドレス3208、消去防止ハッシュ値3209についても同様である。
新仮想セグメントポインタ3205は、現在仮想セグメントに割り当てられている領域のアドレスを表す。正確には、新仮想セグメントポインタ3205には、ストレージコントローラ200が仮想セグメントに対して書き込みが行われたデータのうち、最新のデータ(更新後データ)が格納された領域(実セグメントまたは仮想セグメント)のアドレス情報が格納される。新ハッシュ値3206は、仮想セグメントに書き込まれた最新データのハッシュ値である。具体的には、新仮想セグメントポインタ3205で特定される領域に格納されたデータのハッシュ値である。
新仮想セグメントポインタ3205、旧仮想セグメントポインタ3210、及び消去防止アドレス3208には、実セグメントを直接指し示す情報か、仮想セグメントを指し示す情報のいずれかが格納される。実セグメントを直接指し示す情報は、データの格納された実ブロックの識別子(実ブロック識別子3301)とその実ブロック内の相対アドレス(相対セグメント番号)の組み合わせで構成される情報で、この情報を実セグメントアドレスと呼ぶ。
たとえば図18に示す例では、フラッシュパッケージ230−Aの仮想セグメント#xに書き込まれた最新データは、実ブロック#0の実セグメント#1(相対セグメント番号が1の実セグメントを表す)に格納されている。その場合仮想セグメント#xの新仮想セグメントポインタ(3205)には、実ブロック#0の実ブロック識別子3301と、相対セグメント番号(1)の組が格納される。ストレージコントローラ200から仮想セグメント#xのリード要求を受領すると、フラッシュパッケージ230−Aは、仮想セグメント#xの新仮想セグメントポインタ(3205)を参照することで、リード対象データの格納されている実セグメント(実ブロック#0内の実セグメント#1)を特定できる。
一方、仮想セグメントを指し示す情報には、仮想セグメントアドレスが用いられる。仮想セグメントの重複排除処理が行われると、新仮想セグメントポインタ3205に仮想セグメントアドレスが格納されることがある。図18において、たとえば仮想セグメント#yに、仮想セグメント#xに書き込まれたデータと同じデータが書き込まれ、重複排除処理が行われたケースを想定する。その場合、仮想セグメント#yの新仮想セグメントポインタ(3205)には、フラッシュパッケージ230−Aの仮想セグメント#xの仮想セグメントアドレスが格納されることになる。
本実施例では、図18に示された状態のように、(仮想セグメント#yの)新仮想セグメントポインタ3205に仮想セグメント#xの仮想セグメントアドレスが格納されている場合、仮想セグメント#yは「仮想セグメント#xを参照している」と表現する。また仮想セグメント#xは、「仮想セグメント#yに参照されている仮想セグメント」と表現される。また(仮想セグメント#yの)旧仮想セグメントポインタ3210や消去防止アドレス3208に仮想セグメント#xの仮想セグメントアドレスが格納されている場合にも、「仮想セグメント#yは仮想セグメント#xを参照している」と表現される。なお、実セグメントについても同様の表現が用いられる。たとえば図18において、仮想セグメント#xの新仮想セグメントポインタ3205には、実ブロック#0の実セグメント#1の実セグメントアドレスが格納されている。この場合、「実セグメント#1は仮想セグメント#xに参照されている」と表現される。
なお本実施例では、フラッシュパッケージ230(パッケージプロセッサ310)が、新仮想セグメントポインタ3205(または旧仮想セグメントポインタ3210、や消去防止アドレス3208)に格納されている情報が実セグメントアドレスであるか仮想セグメントアドレスであるか認識できるように、実セグメントアドレスと仮想セグメントアドレスのフォーマットが定められている。たとえば実セグメントアドレスの最上位ビットは常に“1”で、仮想セグメントアドレスの最上位ビットは常に“0”である、と定められているとよい。
図18の状態にあるフラッシュパッケージ230−Bに対して、ストレージコントローラ200が仮想セグメント#yのリード要求を発行すると、フラッシュパッケージ230−Bは仮想セグメント#yの新仮想セグメントポインタ(3205)を参照することで、新仮想セグメントポインタ(3205)に仮想セグメント#xの仮想セグメントアドレスが格納されていることを認識する。この場合フラッシュパッケージ230−Bはストレージコントローラ200に、読み出された仮想セグメントアドレス等を返送する。この情報を受けたストレージコントローラ200は、返送された仮想セグメントアドレス(仮想セグメント#x)をアクセス先とするリード要求を発行することで、リード対象のデータを得る(つまりアクセスのリダイレクションが行われる)。詳細は後述する。
旧仮想セグメントポインタ3210は、仮想セグメントに書き込まれたデータのうち、更新前データが格納された領域のアドレス情報が格納される。旧ハッシュ値3211は、旧仮想セグメントポインタ3210で特定される領域に格納されたデータのハッシュ値である。図18において、仮想セグメント#xの旧仮想セグメントポインタ(3210)は、実ブロック#bの実セグメント#0をポイントしている。これは仮想セグメント#xの更新前データが、実ブロック#bの実セグメント#0に格納されていることを意味する。
仮想セグメントに対する更新が発生すると、過去にその仮想セグメントに書き込まれたデータ(更新前データ)は原則として消去してもよいはずである。ただし重複排除処理が行われると、この更新前データを他の仮想セグメントが参照する(他の仮想セグメントの新仮想セグメントポインタ3205等によってポイントされる)状態が発生することがある(たとえば図18では、フラッシュパッケージ230−Aの仮想セグメント#xが、フラッシュパッケージ230−Bの仮想セグメント#yによって参照されている)。その場合、この更新前のデータを消去できないので、これを記憶(退避)しておくために旧仮想セグメントポインタ3210、旧ハッシュ値3211が用いられる。
そして、仮想セグメントに更なる更新が発生した場合、旧仮想セグメントポインタ3210、旧ハッシュ値3211に格納された内容も退避しておく必要が出る。そのために、後述する消去防止アドレス3208、消去防止ハッシュ値3209が用いられる。
なお、本実施例では、新仮想セグメントポインタ3205、新ハッシュ値3206、旧仮想セグメントポインタ3210、旧ハッシュ値3211が、仮想セグメントごとに存在する例を説明しているが、2つ以上の仮想セグメントごとに同様の情報をもたせるようにしてもよい。
消去防止アドレス3208、消去防止ハッシュ値3209は、旧仮想セグメントポインタ3210、旧ハッシュ値3211の値を退避するために用いられる。退避が必要な旧仮想セグメントポインタ3210と旧ハッシュ値3211の数は1とは限らない。そのため消去防止アドレス3208と消去防止ハッシュ値3209は、1つの仮想セグメントに対して1または複数設けられる。
また消去防止仮想セグメント数3207は、消去してはいけない仮想セグメントの数(つまり、消去防止アドレス3208、消去防止ハッシュ値3209のセットの数)を示している。図17に示されている仮想ブロックグループ情報3200の例では、仮想ブロックグループ内の(s+1)番目の仮想セグメント(相対仮想セグメント番号がsの仮想セグメント)の消去防止アドレス(3208−s1,3208−s2)、消去防止ハッシュ値(3209−s1,3209−s2)はそれぞれ2つ存在する。この場合、消去防止仮想セグメント数(3207−s)の値は2になる。
以上のように、仮想セグメントごとに、新仮想セグメントポインタ3205、旧仮想セグメントポインタ3210、消去防止アドレス3208という情報が設けられており、結果として1つの仮想セグメントに複数の実セグメント(または仮想セグメント)が割り当てられることがある。上で述べたとおり、仮想セグメントに対してストレージコントローラ200から書き込まれたデータのうち、最新のデータ(更新後データ)は、新仮想セグメントポインタ3205でポイントされる実セグメントに格納されている。そのため、フラッシュパッケージ230はストレージコントローラ200からリード要求を受領した時は、原則として上で述べたように、新仮想セグメントポインタ3205でポイントされる実セグメントのデータを読み出して返送する。
ただし、アクセスのリダイレクションが発生した場合には、更新前データ(つまり旧仮想セグメントポインタ3210、消去防止アドレス3208でポイントされる実セグメントに格納されたデータ)を返送する必要があるかもしれない。この具体的方法は後述する。
なお、以下では、仮想セグメントに書き込まれたデータのうち、仮想セグメントの新仮想セグメントポインタ3205でポイントされる実セグメントに格納されたデータの事を、「仮想セグメントの更新後データ」または「仮想セグメントの更新データ」と呼ぶ。一方、仮想セグメントの旧仮想セグメントポインタ3210または消去防止アドレス3208でポイントされる実セグメントに格納されたデータのことは、「仮想セグメントの更新前データ」または「仮想セグメントの旧データ」と呼ぶ。
なお、本実施例に係るストレージシステム100は、ハッシュ関数SHA−256を用いて、仮想セグメントに書き込まれるデータのハッシュ値を計算する。SHA−256は衝突が発生する確率が極めて小さい。そのため本実施例に係るストレージシステム100では、ハッシュ値が同一のデータが複数ある場合、それらのデータの内容は同じであるとみなし、重複排除処理を行う。ただし、ハッシュ値の比較に加えて各データの全内容を(ビットまたはバイト単位で)比較することで重複排除の判定が行われる場合にも、本発明は適用可能である。
続いて図19に示されている履歴情報3400について説明する。本実施例に係るストレージシステム100では、重複排除処理はホスト110のライト処理とは非同期に実行される。このためフラッシュパッケージ230は、ライト処理の履歴を示す履歴情報3400を維持する。履歴情報3400は、履歴情報数3401、ライトアドレス3402、更新前ハッシュ値3403、更新後ハッシュ値3404をもつ。
ライトアドレス3402は、ストレージコントローラ200からライトデータの書き込みが行われた仮想セグメントの仮想セグメントアドレスである。以下、ライトアドレス3402のことを、「仮想セグメントアドレス3402」と表記することもある。
更新前ハッシュ値3403と更新後ハッシュ値3404は、ライトアドレス3402で特定される仮想セグメントに書き込まれたデータ(更新後データまたは更新前データ)のハッシュ値を表す。更新後ハッシュ値3404は、更新後データのハッシュ値を示す情報である。一方更新前ハッシュ値3403は更新前データのハッシュ値を示す情報である。以下では、ライトアドレス3402、更新前ハッシュ値3403、更新後ハッシュ値3404のセットを「ライト履歴」と呼ぶ。
履歴情報数3401は、履歴情報3400に格納されているライト履歴(ライトアドレス3402、更新前ハッシュ値3403、更新後ハッシュ値3404のセット)の数を示す情報で、初期値は0である。フラッシュパッケージ230がストレージコントローラ200からライト要求を受け付け、ライト処理を行うたびに、ライト履歴が履歴情報3400に追加され、履歴情報数3401の値も加算される。ライト履歴は、ライト要求を受け付けた時刻順に履歴情報3400内に格納される。履歴情報数3401の直後に格納されるライト履歴が、最も古いライト履歴となる。ストレージコントローラ200から履歴情報送信要求を受領すると、フラッシュパッケージ230は履歴情報3400をストレージコントローラ200に送出し、履歴情報3400内の情報を全クリアする(履歴情報数3401が0にされる。また、各ライト履歴も消去されてもよい)。
続いてハッシュインデックス情報3500について説明する。先に述べたとおり、本実施例に係るストレージシステム100では、各フラッシュパッケージ230が担当するハッシュ値の範囲はあらかじめ決められている。ハッシュインデックス情報3500は、ハッシュ値が与えられた時に、そのハッシュ値を持つデータの格納されているフラッシュパッケージ230(正確には仮想セグメントアドレス)を特定するための情報である。ハッシュインデックス情報3500には、フラッシュパッケージ230が担当するハッシュ値と、そのハッシュ値をもつデータの格納位置についての情報が格納される。
ハッシュインデックス情報3500の構造を、図20に示す。この構造は基本的には、DBMS(データベース管理システム)が管理するインデックスに用いられるB+Tree等と同じ構造である。
リーフセグメント3501は、B+Tree等の木構造におけるリーフノードに相当する。そして本実施例では、B+Treeのルートノードからリーフノードに至る経路上に存在する各ノードのことは、階層セグメント3509と呼ばれる。リーフセグメント3501以外の情報(各階層セグメント3509)は、パッケージメモリ320(と内部情報格納ブロック)に格納されている。一方、リーフセグメント3501はフラッシュチップ300に格納される。
ただし先に述べたとおり、フラッシュパッケージ230はフラッシュボリューム上に、リーフセグメント3501の格納される領域(隠し領域)を設けている。リーフセグメント3501の参照または更新を行うプログラム(後述する重複排除判定部12300等)は、隠し領域上の仮想セグメントに対してリード要求またはライト要求を発行することで、リーフセグメント3501の読み書きを行う。その結果リーフセグメント3501がフラッシュチップ300(仮想セグメントに割り当てられる実セグメント)に書き込まれる。
そのため、リーフセグメント3501の大きさは、仮想セグメントと同サイズである。リーフセグメント3501に、仮想セグメントのサイズに満たない量の情報しか格納されないこともあるが、その場合リーフセグメント3501の更新を行うプログラムは、“0”等の無効データをpaddingすることで、リーフセグメント3501を仮想セグメントと同サイズの大きさにして、フラッシュチップ300に格納する。
リーフセグメント3501には、ハッシュ値とそのハッシュ値をもつデータの格納位置の集合が格納される。この、データの格納位置を表現するための情報としては、仮想セグメントアドレスが用いられる。そのため、以下では、ハッシュ値Hをもつデータの格納位置のことを、「ハッシュ値Hを持つ仮想セグメント」と呼ぶ。
リーフセグメント3501に格納されるハッシュ値の範囲についての情報は、リーフセグメント3501の親ノード(階層セグメント3509)に含まれている。図20を用いてリーフセグメント3501に格納されるハッシュ値の範囲について説明する。図20において、リーフセグメント3501−1とリーフセグメント3501−2は、共通の親ノードである階層セグメント3509−1に接続されている。
階層セグメント3509は、リーフアドレス3507とハッシュ値の最小値(Min(hash))3508のセットを1以上(階層セグメント3509に接続されるリーフセグメント3501の数と同数)含む。リーフアドレス3507はリーフセグメント3501へのポインタである。リーフセグメント3501へのポインタに用いられる値は、仮想セグメントアドレスである(リーフセグメント3501が仮想セグメントに書き込まれるからである)。Min(hash)3508には、リーフアドレス3507でポイントされるリーフセグメント3501に格納されるべきハッシュ値の最小値が格納される。
図20の構造例において、たとえばMin(hash)3508−1に0、Min(hash)3508−2にk(kは0より大きい値)が格納されていた場合、リーフアドレス3507−1でポイントされるリーフセグメント3501−1には、0から(k−1)の範囲のハッシュ値が格納され、リーフセグメント3501−2には、k以上の値のハッシュ値が格納される。そのため、各階層セグメント3509の内容(Min(hash)3508)を参照することで、探索対象のハッシュ値が格納されたリーフセグメント3501を特定することができる。ただし初期状態では、リーフセグメント3501にハッシュ値は格納されていない。フラッシュパッケージ230にライトデータが格納され、ライトデータのハッシュ値が計算された後、リーフセグメント3501にハッシュ値は格納されるが、詳細は後述する。
なお、階層セグメント3509(たとえば図20の階層セグメント3509−1)の親ノードである階層セグメント3509にも、リーフアドレス3507とMin(hash)3508のセットが1以上含まれる。この場合のリーフアドレス3507には、下位の階層セグメント3509が置かれているメモリ(パッケージメモリ320)上のアドレスが用いられる。そして、このリーフアドレス3507に対応するMin(hash)3508には、下位の階層セグメント3509に格納されている複数のMin(hash)3508の中の最小値が格納される。この方法で、さらに、上位の階層セグメント3509が形成され、最上位の階層セグメント3509つまりルートノードには、ハッシュ値の全空間に関する情報が格納できるような構造となる。
リーフセグメント3501に格納される情報の詳細を、図21を用いて説明する。リーフセグメント3501には、登録ハッシュ値3502、登録データ数3503、セグメント数3504、登録アドレス3505、無効フラグ3506のセットが1以上格納される。以下ではこのセットのことを、エントリ3510と呼ぶ。
図21の例では、エントリ3510が3つ格納されている例が示されている。ただしリーフセグメント3501内のエントリ3510の数は、3未満のこともあれば、4以上になることもある。また、登録アドレス3505と無効フラグ3506のセットは、エントリ3510内に複数個格納されることがある。図21の例では、エントリ3510−1に、登録アドレス3505と無効フラグ3506のセットが3個格納されている。
以下、エントリ3510内に格納される情報について説明する。先に述べたとおり、ハッシュ値はリーフセグメント3501に格納される。具体的には、エントリ3510内の登録ハッシュ値3502にハッシュ値が格納される。1つのエントリ3510に格納されるハッシュ値は1つである。たとえば、あるリーフセグメント3501にハッシュ値がn個格納される場合、そのリーフセグメント3501にエントリ3510がn個設けられ、各エントリ3510の登録ハッシュ値3502に、ハッシュ値が格納される。
また、登録ハッシュ値3502の直後には、登録データ数3503が格納される。登録データ数3503は、エントリ3510内の登録ハッシュ値3502に格納されたハッシュ値と同じハッシュ値をもつ仮想セグメント(重複セグメントと呼ぶ)の数を示す。ただし登録データ数3503には、重複排除処理対象になっていない仮想セグメントの数は含まれない。
登録データ数3503の後に、セグメント数3504、登録アドレス3505、無効フラグ3506が格納される。登録アドレス3505は、エントリ3510内の登録ハッシュ値3502に格納されたハッシュ値をもつ仮想セグメントの仮想セグメントアドレスである。そして無効フラグ3506は、この直前の登録アドレス3505に有効な値が格納されているか否かを表す情報である。無効フラグ3506に“1”(ON)が格納されている時、この直前の登録アドレス3505に有効な値が格納されていないことを表す。
セグメント数3504には、エントリ3510内に格納されている登録アドレス3505と無効フラグ3506のセットの数が格納される。原則として、重複排除処理が行われた直後、同一ハッシュ値を持つ仮想セグメントは、ストレージシステム100内に1つだけ存在すればよい(つまりエントリ3510内に登録アドレス3505は1つだけあればよい)。ただし本実施例に係るストレージシステム100は、同一ストライプラインに同じハッシュ値を持つ仮想セグメントが存在する場合、先に述べた理由から、それらの仮想セグメントについて重複排除処理を行わない。そしてフラッシュパッケージ230は、1番目の登録アドレス3505で特定される仮想セグメントと同じハッシュ値を持つ仮想セグメントが同一ストライプライン上に存在した場合、それらの仮想セグメントの仮想セグメントアドレスを、2番目以降の登録アドレス3505に格納する。この処理の詳細は後述する。
先にも述べたが、登録データ数3503には、重複排除処理対象になっていない仮想セグメントの数は含まれない。登録データ数3503には、1番目の登録アドレス3505で特定される仮想セグメント、そしてこの仮想セグメントと異なるストライプライン上に存在し、かつ同じハッシュ値を持つ仮想セグメント(つまり重複排除処理の対象になった仮想セグメント)の合計が格納される。1番目の登録アドレス3505で特定される仮想セグメントと同じハッシュ値を持つ仮想セグメントが、すべて同一ストライプライン上に存在した場合には、登録データ数3503は1となる。
なお、ストレージコントローラ200から仮想セグメントに対して新たなデータが書き込まれ、そのデータのハッシュ値がハッシュインデックス情報3500に存在しない場合、そのハッシュ値を格納するためのエントリ3510がリーフセグメント3501に追加される。しかしエントリ3510が一つのリーフセグメント3501に格納しきれなくなると、リーフセグメント3501が追加される。そしてこれまでリーフセグメント3501(あるいは階層セグメント3509)に格納されていた情報は、再配置される。ただし、この操作は、B+Tree等の木構造へのデータ挿入と同様の公知の操作であるので、ここでは説明を略す。
次に、上記に説明した管理情報を用いて、ストレージコントローラ200とフラッシュパッケージ230が実行する処理の説明を行う。
まず、ストレージコントローラ200で行われる処理について説明する。なおストレージコントローラ200で行われる処理は原則として、ストレージコントローラ200内のプロセッサ260がプログラムを実行することで実現される。また、そのプログラムはメモリ270内に格納されている。図22は、メモリ270内に、格納された本実施例に関するプログラムが示されている。
本実施例に関するプログラムは、リード処理実行部4000、ライト要求受付部4100、ライトアフタ処理実行部4200、重複排除スケジュール部4300である。これらのプログラムは、上位レベルのウェアレベリング技術、容量仮想化技術を実現するプログラムである。なお以下の各処理の説明においては、プログラム(リード処理実行部4000等)を主語として、処理の説明を行っている箇所がある。ただしこれは実際には、プログラム(リード処理実行部4000等)がプロセッサ260で実行されることで、処理が行われることを意味する。
なお、すでに述べたが、本実施例に係るストレージシステム100では、フラッシュパッケージ230が、ウェアレベリング機能と下位レベルの容量仮想化機能を実行する。ただし別の実施形態として、ウェアレベリングと下位レベルの容量仮想化機能をストレージコントローラ200が実行してもよい。その場合、ウェアレベリング機能と下位レベルの容量仮想化機能を実現するプログラムが、ストレージコントローラ200で実行される。したがって、上位レベルのプログラム(上位レベルの容量仮想化機能を実現するプログラム等)と下位レベルのプログラム双方が、ストレージコントローラ200で実行されるので、プログラム間のインターフェイスが異なってくるが、上位レベルのプログラムが実行する内容は基本的に大きな相違はない。したがって、本実施例では、下位レベルのウェアレベリング技術、容量仮想化技術を実現するのは、フラッシュパッケージ230であることを前提に、リード処理実行部4000、ライト要求受付部4100、ライトアフタ処理実行部4200、重複排除スケジュール部4300の処理フローを詳細に説明する。
また本実施例では、ホスト110からのリード要求またはライト要求で指定されるデータアクセス範囲は、フラッシュメモリのリード・ライト単位である仮想セグメント境界に一致している前提で説明する。もちろん、ホスト110から指定されるアクセス範囲が、仮想セグメント境界に一致していない場合でも、論理ボリュームはアクセス可能である。たとえば、仮想セグメントの一部の領域がライト範囲に指定された場合、フラッシュパッケージ230は仮想セグメント全体を読み出し、指定された部分領域のみ更新し、仮想セグメント全体を書き込む。
図23は、リード処理実行部4000の処理フローである。リード処理実行部4000は、ホスト110から、ストレージコントローラ200が、リード要求を受け付けたときに実行される。
ステップ5000:リード処理実行部4000(プロセッサ260)は、受け取ったリード要求で指定されたリード対象領域のアドレスから、リード対象領域に対応する仮想ページの仮想ページ#と仮想ページ内の相対アドレスを計算する。
ステップ5001:リード処理実行部4000は、リード対象となったデータが、キャッシュメモリ210に格納されているか(ヒットしているか)をチェックする。これは、公知の技術である。ヒットしている場合(ステップ5001:Yes)、次にステップ5011が行われる。ヒットしていない場合(ステップ5001:No)、次にステップ5002が行われる。
ステップ5002:ここでは、リード対象としているデータをキャッシュメモリ210にロードする必要がある。ますリード処理実行部4000は、論理ボリューム情報2000の実ページポインタ2004を参照することで、リード対象仮想ページに割り当てられている実ページの実ページ情報2100を特定する。なお、リード対象仮想ページに割り当てられた実ページを、以下の説明では「リード対象実ページ」と呼ぶ。
ステップ5003:リード処理実行部4000は、特定された実ページ情報2100のパッケージグループ2101、実ページアドレス2102から、リード対象実ページが属するフラッシュパッケージグループ280とリード対象実ページ(の先頭)が位置するフラッシュパッケージグループ280内アドレスを算出する。
ステップ5004:リード処理実行部4000は、ステップ5001で得た仮想ページ内の相対アドレスとパッケージグループRAIDタイプ2302から、リード対象データの格納されている実ページ上位置(具体的には実ページ内相対アドレス)を計算する。そしてリード処理実行部4000は、計算した実ページ内相対アドレス、パッケージグループRAIDタイプ2302とフラッシュパッケージポインタ2305とを用いて、リード対象データの格納されているフラッシュパッケージ230、及びそのフラッシュパッケージ230内のアドレスを特定する。
ステップ5005: リード処理実行部4000は、ステップ5004で特定したフラッシュパッケージ230のアドレスに対して、リード要求を発行する。
ステップ5006:リード処理実行部4000は、フラッシュパッケージ230からデータが送られてくるのを待つ。
ステップ5007:リード要求を発行した結果、フラッシュパッケージ230から、データが重複排除されている旨の応答が返されることがある。この場合、応答には仮想セグメントアドレスとハッシュ値のセットが含まれている。ステップ5007ではリード処理実行部4000は、データが重複排除されている旨の応答がフラッシュパッケージ230から返却されたか判定する。そうであれば(ステップ5007:Yes)、リード処理実行部4000は次にステップ5009を実行する。そうでない場合(ステップ5007:No)は、フラッシュパッケージ230からはリードデータが返却されてくる。この場合は次にステップ5008が実行される。
ステップ5008:リード処理実行部4000は、キャッシュメモリ210に、リード対象データを格納するための領域を確保し、フラッシュパッケージ230から送られてきたデータを、確保された領域に格納する。 この後、ステップ5011が行われる。
ステップ5009:このステップが実行されるのは、フラッシュパッケージから、データが重複排除されている旨の応答(仮想セグメントアドレスとハッシュ値のセットを含む応答)が返された時である。応答に含まれる仮想セグメントアドレスは、リード対象データが実際に格納されているフラッシュパッケージ230及びその仮想セグメントを示す情報である。この場合、リード処理実行部4000は応答に含まれている仮想セグメントアドレス及びハッシュ値を指定したリード要求(後述する「ハッシュ指定型リード要求」)を、実際にデータが格納されているフラッシュパッケージ230(応答に含まれている仮想セグメントアドレスには、パッケージIDが含まれているので、それによりフラッシュパッケージ230を特定できる)に発行する。
ステップ5010:リード処理実行部4000は、フラッシュパッケージ230からデータが送られてくるのを待つ。フラッシュパッケージ230からのデータ転送が開始されると、リード処理実行部4000はステップ5008を実行する。
ステップ5011:リード処理実行部4000は、リード対象データをキャッシュメモリ210から読み出してホスト110へ送り、処理を完了する。
図24は、ライト要求受付部4100の処理フローである。ライト要求受付部4100は、ストレージコントローラ200が、ホスト110からライト要求を受け付けたときに実行される。
ステップ6000:ライト要求受付部4100(プロセッサ260)は、受け取ったライト要求で指定されたライト対象領域のアドレスから、ライト対象領域に対応する仮想ページの仮想ページ#と仮想ページ内の相対アドレスを計算する。
ステップ6001:ライト要求受付部4100は、ライト要求で指定されている論理ボリュームの論理ボリューム情報2000を特定する。そしてライト要求受付部4100は、ステップ6000で特定された仮想ページに実ページが割り当てられているかを、特定した論理ボリューム情報2000内の実ページポインタ2004を参照することでチェックする。実ページが割り当てられている場合、ステップ6002はスキップされ、次にステップ6003が実行される。
ステップ6002:ライト要求受付部4100は、ライト対象領域に対応する仮想ページに実ページを割り当てる。この時ライト要求受付部4100は、ステップ6001で特定された論理ボリューム情報2000の論理ボリュームRAIDタイプ2003と、各フラッシュパッケージグループ情報2300のパッケージグループRAIDタイプ2303や空き実ページ数2304等を参照することで、どのフラッシュパッケージグループ280の実ページを割り当てるかを決める。その後ライト要求受付部4100は、決定されたフラッシュパッケージグループ280の空き実ページ管理情報ポインタ2200を参照して、先頭の空き実ページ情報2100を、ライト対象領域が属する仮想ページの実ページポインタ2004が示すようにする。これで、ライト対象領域が属する仮想ページに実ページを割り当てたことになる。
なお、空き実ページ管理情報ポインタ2200は、次の実ページ情報2100(仮想ページに割り当てた実ページの実ページ情報2100の中の空きページポインタ2103が示す実ページ情報2100)を示すように変更され、さらに、仮想ページに割り当てた実ページの実ページ情報2100の中の空きページポインタ2103はヌルにされる。またライト要求受付部4100は、当該実ページに対応するフラッシュパッケージグループ管理情報の空き実ページ数2304の数を減らす。本実施例では、仮想ページを実ページに割り当てる処理がライト要求を受け付けたときに実施される例を説明したが、この割り当て処理は、フラッシュパッケージ230へデータを格納するまでに実行されればよい。
ステップ6003:ライト要求受付部4100は、ホスト110から当該ライト要求で指定されたライトデータを、キャッシュメモリ210に格納する。なお、キャッシュメモリ210にライトデータを格納する際には、ライト要求受付部4100はそのライトデータの書き込み位置情報(フラッシュパッケージ230のID及び、フラッシュボリューム上アドレス(LBA)等)を付加して格納する。その後、処理を終了する。
フラッシュパッケージグループ280は、RAID構成をとるので、キャッシュメモリ210上に格納したライトデータに対応する冗長データ(ライトデータの格納されたデータストライプと同一ストライプラインに属するパリティストライプに格納されるべき冗長データ)を生成する必要がある。ただし、これは、公知の方法であるので、詳細に説明はしない。冗長データの生成は、たとえばステップ6003の直後に行われると良い。プロセッサ260は冗長データを作成すると、一旦キャッシュメモリ210に冗長データを格納する。
また、先に述べたとおり、仮想ページ上のアドレスから、データを格納するデータストライプに加えて、そのデータに対応する冗長データを格納すべきパリティストライプも一意に定まる。なお、キャッシュメモリ210に冗長データを格納する際、ライトデータと同様に、プロセッサ260は書き込み位置情報を冗長データに付加する。
ライトデータ、冗長データは、ライトアフタ処理実行部4200によって、フラッシュパッケージ230に書き込まれるが、フラッシュパッケージ230にとって、両者はいずれもフラッシュパッケージ230へ書き込むデータなので、両者を区別する必要はない。そのためライトアフタ処理実行部4200は、ライトデータを書き込む場合と冗長データを書き込む場合とで、異なる処理を行うことはない。
ただし、重複排除処理の観点からは、冗長データは、複数のデータの論理演算(排他的論理和等)の結果生成されるものであるため、通常のデータに比較して、重複排除できる確率(他に同じデータがある確率)は小さい。このため、重複排除のオーバヘッドを削減するため、重複排除の対象にしなくともよい。この場合、ストレージコントローラ200は、冗長データを書き込む際には、フラッシュパッケージ230に、当該データは、重複排除処理の対象にしない旨の情報を付加する。その旨を受領したフラッシュパッケージ230は、冗長データを重複排除の対象にしなくともよい。
図25は、ライトアフタ処理実行部4200の処理フローである。ライトアフタ処理実行部4200は、プロセッサ260が所定の契機で実行する処理である。たとえば定期的にライトアフタ処理実行部4200が実行されてもよい。またはキャッシュメモリ210上のダーティデータ量が所定量を超過した時点でライトアフタ処理実行部4200が実行されてもよい。
ライトアフタ処理実行部4200は、ホスト110から受け取ったライトデータまたは冗長データをフラッシュパッケージ230に書き込む処理を実行する。ただし、ライトアフタ処理実行部4200は、ライトデータ、冗長データの両者を、フラッシュパッケージ230に書き込むべきデータとして、両者を区別せずに処理する。
ステップ7000:ライトアフタ処理実行部4200(プロセッサ260)は、キャッシュメモリ210をサーチして、フラッシュパッケージ230に書き込むべきデータを決める。ライトアフタ処理実行部4200は、見出したデータに付与されている書き込み位置情報を取り出す。なお、ここではライトアフタ処理実行部4200によって書き込まれる領域の範囲が、複数のフラッシュパッケージ230に跨らない場合の例を説明する。
ステップ7001:ライトアフタ処理実行部4200は書き込み位置情報に基づいて、しかるべきフラッシュパッケージ230にライト要求を発行する。なお、このときライトアフタ処理実行部4200は、冗長データを書き込む場合には、このデータ(冗長データ)を重複排除の対象にしない旨の指示を出してもよい。
ステップ7002:ライトアフタ処理実行部4200は、ライト要求の完了をまつ。ライトアフタ処理実行部4200は、フラッシュパッケージ230から当該ライト要求に関する終了報告が返却されると、処理を終了する。
図26は、重複排除スケジュール部4300の処理フローである。重複排除スケジュール部4300はストレージシステム100内の全フラッシュパッケージ230に蓄積された履歴情報3400を取得し、重複排除処理をスケジュールする。本処理は、適当な間隔で実行されるものとする。
ステップ12000:重複排除スケジュール部4300は、ストレージシステム100内の各フラッシュパッケージ230に、履歴情報送信要求を発行し、各フラッシュパッケージ230から履歴情報3400が送られてくるのをまつ。履歴情報送信要求を受領したフラッシュパッケージ230は、履歴情報3400をストレージコントローラ(重複排除スケジュール部4300)に返送する。フラッシュパッケージ230が行う処理は後述する。
ステップ12001:重複排除スケジュール部4300は、それぞれのフラッシュパッケージ230から送られてきた履歴情報3400を参照して、リスト1とリスト2を作成する。リスト1とリスト2については、以下で図27を参照しながら説明する。
先に述べたとおり、履歴情報3400には、ライトアドレス3402と更新前ハッシュ値3403と更新後ハッシュ値3404のセット(「ライト履歴」と呼ぶ)が1以上含まれている。図27に示されているように、リスト1は、各ライト履歴から更新後ハッシュ値3404を除去することで生成されたレコードの集合である。そしてリスト2は、各ライト履歴から更新前ハッシュ値3403を除去することで生成されたレコードの集合である。
なお、同一の仮想セグメントに対し、複数回の更新が発生していることがある(履歴情報3400に同一の仮想セグメントに対するライト履歴が複数個含まれていることがある)。重複排除スケジュール部4300は、同一の仮想セグメントに対し複数回の更新が発生している場合(複数のライト履歴が存在する場合)、ライトアドレス3402が等しい複数のライト履歴のうち、最初の(最も古い)ライト履歴と、最後の(最も新しい)ライト履歴を取り出す。そして重複排除スケジュール部4300は、前者から更新後ハッシュ値3404を除去することで生成されたレコードをリスト1に、後者から更新前ハッシュ値3403を除去することで生成されたレコードをリスト2に登録する。ただし、旧データのハッシュ値がヌル値である場合には、重複排除スケジュール部4300はこの旧ハッシュ値と仮想セグメントのアドレスをリスト1に登録しない。
ステップ12002:ここでは重複排除スケジュール部4300は、リスト1とリスト2内の情報を、ハッシュ値(更新前ハッシュ値3403または更新後ハッシュ値3404)に基づいて、各フラッシュパッケージ230に送信すべき情報に分割する。以下、分割されたリスト1内の情報のうち、フラッシュパッケージ#fに送信する情報を「リスト1−f」と呼び、リスト2内の情報のうち、フラッシュパッケージ#fに送信する情報を「リスト2−f」と呼ぶ。
情報の分割の仕方は以下の通りである。たとえばフラッシュパッケージ#fが担当するハッシュ値の範囲がa〜bの場合、リスト1のうち、(更新前)ハッシュ値3403がa〜bの範囲に含まれるレコードを抽出したものを、フラッシュパッケージ#fに送信すべき情報とし、リスト1−fとする。同様に、リスト2のうち、(更新後)ハッシュ値3404がa〜bの範囲に含まれるレコードを抽出したものを、フラッシュパッケージ#fに送信すべき情報とし、リスト2−fとする。
ステップ12003:重複排除スケジュール部4300は、各フラッシュパッケージ230に重複排除判定要求を発行する。その時重複排除スケジュール部4300は重複排除判定要求とともに、フラッシュパッケージ230ごとに分割したリスト1とのリスト2をフラッシュパッケージ230に送る(たとえばフラッシュパッケージ#fにはリスト1−fとリスト2−fが送られる)。その後時重複排除スケジュール部4300は、各フラッシュパッケージ230からの応答を待つ。
フラッシュパッケージ230(たとえばフラッシュパッケージ#f)は重複排除判定要求と共にリスト1−fを受領すると、リスト1−fに登録されている仮想セグメントアドレス3402ごとに、仮想セグメントアドレス3402で特定される仮想セグメントの旧データを消去するか否かを判定し、その結果をストレージコントローラ200(重複排除スケジュール部4300)に返送する。返送されてくる結果情報のことを「消去候補」と呼ぶ。
図28に消去候補の例を示している。消去候補は、フラッシュパッケージ230に仮想セグメントの旧データの消去を指示する情報である。本実施例において、仮想セグメントの旧データの消去とは、仮想セグメントの旧仮想セグメントポインタ3210(または消去防止アドレス3208)の値を無効値(NULL)にする処理を意味する。この処理により、旧仮想セグメントポインタ3210(または消去防止アドレス3208)でポイントされるセグメント(たとえば実セグメント)は、仮想セグメントに割り当てられていない状態になるので、実質的にその仮想セグメントの旧データが削除された状態になる。また、これまで仮想セグメントに割り当てられていた実セグメントは、フラッシュパッケージ230で実施されるガベージコレクション処理などによって、(その実セグメントを含む)実ブロックの消去が行われた後、別の用途に用いられる。この処理は公知のため、ここでの説明は略す。
消去候補は、仮想セグメントアドレス3601、ハッシュ値3602、消去Flag3603から構成されるレコードのリストである。レコード内の消去Flag3603が“1”の場合、そのレコードの仮想セグメントアドレス3601で特定される仮想セグメントの旧データを消去して良いことを意味する。レコード内の消去Flag3603が“0”の場合、そのレコードの仮想セグメントアドレス3601で特定される仮想セグメントの旧データは消去してはいけないことを意味する。またハッシュ値3602は仮想セグメントアドレス3601で特定される仮想セグメントの旧データのハッシュ値である。
また、フラッシュパッケージ230(たとえばフラッシュパッケージ#f)は(重複排除判定要求と共に)リスト2−fを受領すると、リスト2−fに登録されている仮想セグメントアドレス3402ごとに、仮想セグメントアドレス3402で特定される仮想セグメントの更新データは重複排除処理可能か否かを判定し、その結果をストレージコントローラ200(重複排除スケジュール部4300)に返送する。返送されてくる結果情報のことを「重複候補」と呼ぶ。
なお本実施例において、「仮想セグメントの重複排除」または「仮想セグメントの更新データの重複排除」とは、ある仮想セグメント(対象セグメントと呼ぶ)の新仮想セグメントポインタ3205でポイントされる実セグメントに代えて、その実セグメントと同一のデータを有している仮想セグメントの仮想セグメントアドレスを、対象セグメントの新仮想セグメントポインタ3205に格納する処理のことを意味する。これにより、これまで対象セグメントに割り当てられていた(新仮想セグメントポインタ3205でポイントされていた)実セグメントは、実質的に削除されたことになる。
図29に重複候補の例を示している。重複候補は、フラッシュパッケージ230に仮想セグメントの重複排除処理を指示する情報である。重複候補は、仮想セグメントアドレス3701、重複Flag3702、重複Addr3703から構成されるレコードのリストである。レコード内の重複Flag3702が“1”の場合、そのレコードの仮想セグメントアドレス3701で特定される仮想セグメントの更新データは重複排除可能で、仮想セグメントアドレス3701で特定される領域のデータを削除してもよいことを意味する。またその場合、重複Addr3703には、仮想セグメントアドレス3701で特定される仮想セグメントとハッシュ値が同じである仮想セグメントのアドレス(仮想セグメントアドレス)が格納されている。またレコード内の重複Flag3702が“0”の場合、そのレコードの仮想セグメントアドレス3701で特定される仮想セグメントの更新データは重複排除処理可能でないことを意味する。
ステップ12004:重複排除スケジュール部4300は、各フラッシュパッケージ230から受領した消去候補内の各レコードを、送信すべきフラッシュパッケージ230毎に分類する。この時の分類は、仮想セグメントアドレス3601に基づいて行われる。仮想セグメントアドレスにはフラッシュパッケージ230の識別子(パッケージID)が含まれている。仮想セグメントアドレス3601に含まれているパッケージIDが“f”の場合、そのレコードをフラッシュパッケージ#fに送信すると決定する。またフラッシュパッケージ#fに送信すべきレコードのリストは、「消去候補−f」と呼ぶ。
ステップ12005:重複排除スケジュール部4300は、受領した重複候補内の各レコードを、送信すべきフラッシュパッケージ230毎に分類する。この分類はステップ12004で行われる分類と同様に、仮想セグメントアドレス3701に基づいて行われる。以下では重複候補内のレコードのうち、フラッシュパッケージ#fに送信すべきレコードのリストは、「重複候補−f」と呼ぶ。
ステップ12006:重複排除スケジュール部4300は、各フラッシュパッケージ230に重複排除実行要求を発行する。その時重複排除スケジュール部4300は重複排除実行要求とともに、ステップ12004とステップ12005で分類(作成)された重複候補と消去候補を、フラッシュパッケージ230に送り(たとえばフラッシュパッケージ#fには重複候補−fと消去候補−fが送られる)、回答がかえってくるのを待つ。
つまりここではストレージコントローラ200(重複排除スケジュール部4300)は、各フラッシュパッケージ230から受領した重複候補と消去候補を、仮想セグメントアドレス(3601,3701)に基づいて、送信先のフラッシュパッケージへと転送している。言い換えるとフラッシュパッケージ230は、作成した重複候補と消去候補を、ストレージコントローラ200を介して各フラッシュパッケージ230に送信しているものといえる。
フラッシュパッケージ230は、重複候補と消去候補が送信されると、消去Flag3603が“1”のレコードに含まれる仮想セグメントアドレス3601で特定される仮想セグメントの旧データを消去し、また重複Flag3702が“1”のレコードに含まれる仮想セグメントアドレス3601で特定される仮想セグメントについては、重複排除処理を実行する。この処理の詳細は後述する。
ステップ12007:重複排除スケジュール部4300は、各フラッシュパッケージ230から回答がかえってくると、処理を完了する。
次に、フラッシュパッケージ230が実行する動作の説明を行う。フラッシュパッケージ230の動作は、パッケージプロセッサ310が実行し、そのプログラムは、パッケージメモリ320内に格納されている。
図30は、パッケージメモリ320内に、格納された本実施例に関するプログラムが示されている。本実施例に関するプログラムは、データリード処理実行部12600、データライト処理実行部12100、履歴情報送信部12200、重複排除判定部12300、重複排除実行部12400、ハッシュ指定型リード実行部12500である。以下、それぞれのプログラムの処理フローを説明する。なお以下の各処理の説明においては、プログラム(データリード処理実行部12600等)を主語として、処理の説明を行っている箇所がある。ただしこれは実際には、プログラム(データリード処理実行部12600等)がパッケージプロセッサ310で実行されることで、処理が行われることを意味する。
図31は、データリード処理実行部12600の処理フローである。データリード処理実行部12600は、ストレージコントローラ200から、リード要求を受け取ったときに実行される。また、本処理は、重複排除判定部12300がリーフセグメント3501を読み出す際にも利用される。なお、本実施例で示す図31の処理フローでは、一つの仮想ブロックグループに格納されたデータをリードする処理フローを示している。ただし、本発明は、リード要求で、複数の仮想ブロックグループに跨って格納されたデータを読み出すようにした場合も有効である。
また、本実施例に係るストレージコントローラ200が発行するリード要求は2種類存在する。第1のリード要求では、リード対象領域(アドレスとデータ長とで特定される領域)が指定される。一方第2のリード要求では、リード対象領域に加えてハッシュ値が指定される。以下、第1のリード要求を「通常リード要求」と呼び、第2のリード要求を「ハッシュ指定型リード要求」と呼ぶ。図31で説明される処理フローは、ストレージコントローラ200から通常リード要求を受領した時に行われるものである。
ステップ13000:データリード処理実行部12600(パッケージプロセッサ310)は、受け取ったリード要求で指定されているリード対象アドレスから、リード対象領域が属する仮想ブロックグループと、アクセスする仮想ブロックグループ内の相対アドレスを計算する。リード対象アドレスがLBAで表現されている場合、データリード処理実行部12600はリード対象アドレス×512÷(m×フラッシュブロック容量3004)を計算する。この計算で算出される商が仮想ブロックグループ番号で、剰余が仮想ブロックグループ内相対アドレスである。これによりデータリード処理実行部12600は、リード対象とする仮想ブロックグループ(仮想ブロックグループ情報3200)を特定できる。
ステップ13001:当該ステップでデータリード処理実行部12600は、ステップ13000で求められた仮想ブロックグループ内の相対アドレスを相対仮想セグメント番号に変換し、さらにそれを用いてアクセス対象の仮想セグメントの新仮想セグメントポインタ3205を特定する。
ステップ13002:データリード処理実行部12600は、新仮想セグメントポインタ3205に格納されているアドレスが実セグメントアドレスか識別する。得られたアドレスが実セグメントアドレスである場合には(ステップ13002:No)、データリード処理実行部12600は次にステップ13003を実行する。そうでない場合(ステップ13002:Yes)、ステップ13008が実行される。
ステップ13003:先に述べたとおり、実セグメントアドレスには、データの格納された実ブロックの識別子とその実ブロック内の相対アドレス(相対セグメント番号)のセットが含まれている。データリード処理実行部12600は、実セグメントアドレスに含まれている情報により、アクセス対象領域が存在するフラッシュチップ300と、そのフラッシュチップ300内の位置(アドレス)を特定する。
ステップ13004:データリード処理実行部12600は、ステップ13003で特定されたフラッシュチップ300のチップ情報3100を参照することで、当該フラッシュチップ300が接続されているパッケージバス340を識別し、対応するパッケージバス転送装置350を認識する。
ステップ13005:データリード処理実行部12600は、ステップ13004で認識したパッケージバス転送装置350に、フラッシュチップ300からバッファ330にデータを転送するよう指示する。
ステップ13006:この後、データリード処理実行部12600は転送が完了するのを待つ。
ステップ13007:データリード処理実行部12600は、バッファ330に格納された、ストレージコントローラ200から要求されたリードデータを、ストレージコントローラ200に送り、処理を終了する。
ステップ13008:このステップが実行される場合、ステップ13001で特定された新仮想セグメントポインタ3205には仮想セグメントアドレスが格納されている。データリード処理実行部12600は新仮想セグメントポインタ3205の内容と、新ハッシュ値3206をストレージコントローラ200に返送して、処理を完了する。
なお、新仮想セグメントポインタ3205に格納されている仮想セグメントアドレスをチェックした結果、その仮想セグメントアドレスが自フラッシュパッケージ(データリード処理実行部12600が実行されているフラッシュパッケージ230)内の仮想セグメントを指すアドレスであることもあり得る。その場合、リード対象データは自フラッシュパッケージ内にある。そのためこの場合には、データリード処理実行部12600は、新仮想セグメントポインタ3205の内容と、新ハッシュ値3206を返送する代わりに、フラッシュパッケージ230内に格納されているデータを探し出して、ストレージコントローラ200に探し出したデータを返送してもよい。
図32は、ハッシュ指定型リード実行部12500の処理フローである。この処理は、フラッシュパッケージ230がストレージコントローラ200からハッシュ指定型リード要求を受領した時(ステップ5009が実行された時)に行われる。先に述べたとおり、ハッシュ指定型リード要求には、アクセス対象領域の情報(アドレス)に加え、ハッシュ値が含まれる。なお、以下の説明では、ハッシュ指定型リード要求のことを「リード要求」と略記する。
ステップ13500:この処理は、ステップ13000と同じである。この処理により、ハッシュ指定型リード実行部12500はアクセス対象領域に対応する、仮想ブロックグループ内の相対仮想セグメント番号を特定する。ここでは仮に、特定された相対仮想セグメント番号が“s”であった場合について説明する。また相対仮想セグメント番号が“s”の仮想セグメントは、「仮想セグメント#s」と表記する。
ステップ13501:ハッシュ指定型リード実行部12500は、受け取ったリード要求で指定されているハッシュ値を、仮想セグメント#sの新ハッシュ値3206、旧ハッシュ値3211、消去防止ハッシュ値3209と照合する。リード要求で指定されているハッシュ値が新ハッシュ値3206と一致している場合、ハッシュ指定型リード実行部12500は仮想セグメント#sの新仮想セグメントポインタ3205に格納されている情報(アドレス)を取得する。
もしリード要求で指定されているハッシュ値が旧ハッシュ値3211と一致している場合、ハッシュ指定型リード実行部12500は仮想セグメント#sの旧仮想セグメントポインタ3210に格納されている情報(アドレス)を取得する。一方リード要求で指定されているハッシュ値が消去防止ハッシュ値3209と一致している場合、ハッシュ指定型リード実行部12500は仮想セグメント#sの消去防止アドレス3208に格納されている情報(アドレス)を取得する。なお、仮想セグメント#sに消去防止ハッシュ値3209と消去防止アドレス3208が複数設けられている場合、ハッシュ指定型リード実行部12500は、リード要求で指定されているハッシュ値を、それぞれの消去防止ハッシュ値3209と比較照合する。
ステップ13503:ステップ13501で取得されるアドレスは実セグメントアドレスである。データリード処理実行部12600は、ステップ13501で得られた実セグメントアドレスから、リード対象データの格納されているフラッシュチップ300の識別子及びそのフラッシュチップ300内のアドレスを特定する。これはステップ13003と同様の処理である。
ステップ13504:ステップ13004と同様の処理が行われる。
ステップ13505:ステップ13005と同様の処理が行われる。
ステップ13506:ステップ13006と同様の処理が行われる。
ステップ13507:ステップ13007と同様の処理が行われる。 これにより、ストレージコントローラ200にデータが返送される。
続いて図33と図34を用いて、データライト処理実行部12100の処理フローを説明する。データライト処理実行部12100は、ストレージコントローラ200から、フラッシュパッケージ230が、ライト要求を受け付けたときに実行される。また、本処理フローは、重複排除判定部12300が、リーフセグメントの書き込みを行う場合にも実行される。
なお、本実施例で示す図33と図34の処理フローでは、ライト要求で指定される範囲が一つの仮想ブロックグループ内に含まれ、複数の仮想ブロックグループに跨らない場合の処理を示している。ただし、本発明は、複数の仮想ブロックグループに跨った領域に対するライト要求を受け付けた場合も有効である。
ステップ14000:データライト処理実行部12100(パッケージプロセッサ310)は、受け取ったライト要求がライト対象とするアドレスから、ライト対象領域が属する仮想ブロックグループとアクセスする仮想ブロックグループ内相対アドレスを計算する。これはステップ13000で行われる計算と同様である。またデータライト処理実行部12100は、ライト対象領域が属する仮想ブロックグループ内の相対アドレスを相対仮想セグメント番号に変換することで、ライト対象領域に対応する仮想セグメントを特定する。以下ではこの仮想セグメントを「ライト対象仮想セグメント」と呼ぶ。またここでは、ライト対象仮想セグメントの新仮想セグメントポインタ3205も特定される。
本実施例では、ストレージコントローラ200からのライト要求で指定されるライト範囲が、仮想セグメント境界に一致している例を説明する。もちろん、本発明は、ストレージコントローラ200からのライト要求で、仮想セグメントの一部のみを指定された場合にも有効である。なお、フラッシュ仮想セグメントの一部の領域が指定された場合、フラッシュパッケージ230は仮想セグメント全体をバッファ330等に読み出し、バッファ330上で指定された部分領域のみ更新し、更新された1仮想セグメント分のデータを仮想セグメントに対して書き込む。
ステップ14001:データライト処理実行部12100は、ストレージコントローラ200から当該ライト要求で指定されたライトデータを受け取り、バッファ330に格納する。またデータライト処理実行部12100はハッシュ回路370を用いて、そのデータのハッシュ値を計算する。
ステップ14002:データライト処理実行部12100は、ライト対象となった仮想セグメントが属する仮想ブロックグループの仮想ブロックグループ情報3200(以下、「対象仮想ブロックグループ情報」と呼ぶ)の中から、最初の実ブロック情報ポインタ3202を獲得する。そしてデータライト処理実行部12100は、この値がヌルかどうか、すなわち、実ブロックが割り当てられているかをチェックする。実ブロックが割り当てられていれば(ステップ14002:No)、データライト処理実行部12100は次にステップ14005を実行する。実ブロックが割り当てられていない場合(ステップ14002:Yes)は、次にステップ14003が実行される。
ステップ14003:データライト処理実行部12100は、ライト対象となった仮想セグメントが属する仮想ブロックグループに、空き状態にある実ブロックを割り当てる。なお、ここでは、割り当てる実ブロックは消去されていてデータは格納されていないものとする。
具体的にはデータライト処理実行部12100は、各チップ情報3100のチップ内空き実ブロック数3103等を参照して、空き実ブロックを取得する対象のフラッシュチップ300を決める。その後データライト処理実行部12100は、決定したフラッシュチップ300の空き実ブロック情報ポインタ3600を参照して、先頭の実ブロック情報3300へのポインタを得る。そしてデータライト処理実行部12100は、得られたポインタを対象仮想ブロックグループ情報の最初の実ブロック情報ポインタ3202に格納する。これで、仮想ブロックグループに最初の実ブロックが割り当てられる。
なお、空き実ブロック情報ポインタ3600は、次の実ブロック情報3300(仮想ブロックグループに割り当てられた実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302が示す実ブロック情報3300)を示すように変更され、さらに、仮想ブロックに割り当てられた実ブロックの実ブロック情報3300の中の空き実ブロックポインタ3302はヌルにされる。またデータライト処理実行部12100は、当該実ブロックに対応するチップ情報3100のチップ内空き実ブロック数3103の数を減らす。そしてデータライト処理実行部12100は、割り当てた実ブロックに対応する実ブロック内空き容量3304を、実ブロックの容量にする。ここでは、割り当てた実ブロックの先頭から、データを書き込むことになる。
ステップ14004:データライト処理実行部12100は、割り当てられた実ブロックの先頭実セグメントの、実セグメントアドレスを生成する。具体的には実ブロックの識別子と実ブロック内の相対アドレス(ここでは相対アドレスは0になる)を組み合わせることで、実セグメントアドレスが生成できる。そしてデータライト処理実行部12100は、ライト対象仮想セグメントの新仮想セグメントポインタ3205に、生成された実セグメントアドレスをセットする。これによりライト対象仮想セグメントに実セグメントが割り当てられたことになる。またデータライト処理実行部12100は、ステップ14001で計算したハッシュ値を、ライト対象仮想セグメントの新ハッシュ値3206にセットする。さらにデータライト処理実行部12100は、ライト対象仮想セグメントの旧仮想セグメントポインタ3210と旧ハッシュ値3211をヌル値にする。またデータライト処理実行部12100は、データ格納量3203に0をセットする。この後、データライト処理実行部12100はステップ14010を実行する。
ステップ14005:データライト処理実行部12100は、ライト対象となる実ブロックに対応する実ブロック情報3300を特定する。これは仮想ブロックグループ情報3200内の、有効な値(非NULL値)が格納されている実ブロック情報ポインタ3202のうち、最後尾の実ブロック情報ポインタ3202でポイントされる実ブロック情報3300である。データライト処理実行部12100は、特定された実ブロック情報3300の実ブロック内空き容量3304とバッファ330に格納したライトデータの長さとから、受け取ったデータを、当該実ブロックの空き領域に書き込めるかをチェックする。書き込める場合(ステップ14005:No)、次にステップ14008が実行される。そうでない場合には、データライト処理実行部12100は次にステップ14006を実行する。
ステップ14006:本ステップは、書き込み対象とした実ブロックの空き領域より、ライトデータの長さが大きい場合に実行されるステップである。本ステップでは、データライト処理実行部12100は仮想ブロックグループに、m+1個の実ブロックが割り当てられているか判定する(仮想ブロックグループ情報3200内のm+1個の実ブロック情報ポインタ3202がすべて非NULL値か判定する)。m+1個の実ブロックが割り当てられている場合、データライト処理実行部12100はステップ14013を実行する。
ステップ14007:このステップは、対応する仮想ブロックグループに空き状態にある実ブロックを割り当てるステップで、ステップ14003と同様の処理が行われる。
ステップ14008:データライト処理実行部12100は、仮想ブロックグループ情報3200内のライト対象仮想セグメントの旧仮想セグメントポインタ3210をチェックして、ヌル値であれば、ライト対象仮想セグメントの新仮想セグメントポインタ3205と新ハッシュ値3206をそれぞれ、旧仮想セグメントポインタ3210と旧ハッシュ値3211にコピーする(旧仮想セグメントポインタ3210がヌル値でない場合、旧仮想セグメントポインタ3210、旧ハッシュ値3211への情報コピーは行われない)。なお、初めて当該仮想セグメントに対するライト要求を受け付けた場合、当該仮想セグメントの旧仮想セグメントポインタ3210、旧ハッシュ値3211はヌル値である。旧ハッシュ値3211がヌル値であるということは、そのハッシュ値が無効であることを意味する。
ステップ14009:データライト処理実行部12100は、:当該仮想ブロックグループに割り当てた実ブロックの中の最終の実ブロック(実ブロック情報ポインタ3202がヌル値でない最後の実ブロック情報ポインタ3202が示す実ブロック)を書き込み対象と決定する。またデータライト処理実行部12100は、ステップ14001で計算したハッシュ値を、ライト対象仮想セグメントの新ハッシュ値3206に設定する。
ステップ14010:データライト処理実行部12100は、ライト対象仮想セグメントの新ハッシュ値3206と旧ハッシュ値3211と、ライト対象の仮想セグメントアドレスを履歴情報3400に追加し、履歴情報数3401を1つ増やす。またデータライト処理実行部12100は、データ書き込み対象実ブロックの実ブロック内空き容量3304から、今回書き込みを行うアドレス(実セグメントアドレス。つまりチップID、ダイ番号、ブロック番号そして実ブロック内相対セグメント番号の組み合わせである)を決定する。データライト処理実行部12100は実ブロックの先頭の実セグメントから順にデータを書き込むため、実ブロック内空き容量3304と実ブロックのサイズが分かっていれば、今回書き込みを行うべき、実ブロック内相対アドレス(相対セグメント番号)は容易に決定される。データライト処理実行部12100はこのアドレスを、ライト対象仮想セグメントの新仮想セグメントポインタ3205に設定する。またデータライト処理実行部12100は、実セグメントビットマップ3305のうち、今回書き込み対象になった実セグメントに対応するビットをオンにする。
ステップ14011:データライト処理実行部12100は、バッファ330内のライトデータを、ライト対象の実セグメントに書き込む要求を転送装置に設定して、書き込みが完了するのを待つ。
ステップ14012:データライト処理実行部12100は、書き込み対象の実ブロックに対応する実ブロック内空き容量3304から、今回書き込みを行った実セグメントの合計サイズに相当する値を削減する。さらにデータライト処理実行部12100は、ライト対象とした仮想セグメントの容量を、データ格納量3203に加える。そしてデータライト処理実行部12100は、ストレージコントローラ200に処理の完了を報告し、処理を完了する。
ステップ14013:ここでは、仮想ブロックグループにこれまで割り当てられていた実ブロック内の有効データを、新たな空き実ブロックに移動する処理(いわゆるガベージコレクション処理)が行われる。具体的にはデータライト処理実行部12100は、仮想ブロックグループにこれまで割り当てられていた実ブロックの中で、有効な情報、すなわち、新仮想セグメントポインタ3205、旧仮想セグメントポインタ3210、消去防止アドレス3208でポイントされている実セグメントに格納されているデータだけを読み出し、読み出したデータを新たな空き実ブロックに書き込み、仮想ブロックグループ情報3200を更新する。具体的にはデータライト処理実行部12100は、実ブロック情報ポインタ3202に、データが書き込まれた実ブロックの実ブロック情報3300へのポインタを格納し、新仮想セグメントポインタ3205、旧仮想セグメントポインタ3210、消去防止アドレス3208には、データを書き込んだ実ブロック(の実セグメント)のアドレスを設定する。また、新たにデータが書き込まれた実ブロックの実ブロック情報3300については、実ブロック内空き容量3304と実セグメントビットマップ3305の設定も行われる。なお、ここで新たに割り当てられる実ブロックは、ウェアレベリングアルゴリズム(各実ブロックの消去回数を均衡させるアルゴリズム)にしたがって、選択されるものとする。なお、ウェアレベリングは、公知の技術であるため、ここでは詳細に説明しない。また、これまで仮想ブロックグループに割り当てられていた実ブロックは、消去処理が行われ、空き実ブロックとして管理される。この後、ステップ14005が実行される。
図35は、履歴情報送信部12200の処理フローである。履歴情報送信部12200は、ストレージコントローラ200から履歴情報送信要求が送られた時(ステップ12000)に実行される。
ステップ15000:履歴情報送信部12200は履歴情報3400を、ストレージコントローラ200に送る。
ステップ15001:履歴情報送信部12200は履歴情報3400を初期化する。具体的には履歴情報送信部12200は、パッケージメモリ320内の履歴情報3400の格納されていた領域を0クリアする。この後、処理を終了する。
図36は、重複排除実行部12400の処理フローである。重複排除実行部12400は、ストレージコントローラ200から重複排除実行要求と、先に説明した消去候補と重複候補が送られてきたとき(ステップ12006)に実行される処理フローである(正確にはフラッシュパッケージ230には、ステップ12004、ステップ12005で分類された消去候補と重複候補が送られてくる。たとえばフラッシュパッケージ#xは、消去候補ーxと重複候補ーxを受け取る。ただし以下の説明では、消去候補ーxと重複候補ーxのことをそれぞれ、「消去候補」、「重複候補」と呼ぶ)。
ステップ16000:重複排除実行部12400は、ストレージコントローラ200から送られてきた消去候補のレコードを、消去Flag3603が“1”のレコードと、“0”のレコードに分ける。
ステップ16001:本ステップでは、消去Flag3603が“1”のレコードについての処理が行われる。以下、ステップ16000を実行した結果、消去Flag3603が“1”のレコードが1つ存在した場合の例を説明する。なお、ステップ16001の説明において、このレコードの仮想セグメントアドレス3601で特定される仮想セグメントのことを、「対象仮想セグメント」と呼ぶ。
重複排除実行部12400はレコードの仮想セグメントアドレス3601から、対象仮想セグメントが属する仮想ブロックグループと、対象仮想セグメントの相対仮想セグメント番号を求める。以下では求められた相対仮想セグメント番号が“s”の場合の例を説明する。
そして重複排除実行部12400は、特定された仮想ブロックグループの仮想ブロックグループ情報3200を参照することで、対象仮想セグメントの旧ハッシュ値3211(3211−s)と消去防止ハッシュ値3209(3209−s)を読み出し、これらとハッシュ値3602を比較する。
ハッシュ値3602が旧ハッシュ値3211ーsと一致した場合、重複排除実行部12400は旧仮想セグメントポインタ3210ーsに格納されているアドレスが実セグメントアドレスか判定する。実セグメントアドレスである場合、重複排除実行部12400はデータ格納量3203から仮想セグメントのサイズを減算する。
また重複排除実行部12400は、旧仮想セグメントポインタ3210ーsに格納されていたアドレス(具体的には実セグメントアドレスに含まれる実ブロック識別子)と実ブロック情報ポインタ3202を参照することで、旧データの格納されていた実セグメントを有する実ブロックの実ブロック情報3300を特定する。そして重複排除実行部12400は、その実ブロック情報3300の実セグメントビットマップ3305のうち、旧データが格納されていた実セグメントに対応するビットをオフする。旧仮想セグメントポインタ3210ーsに格納されているアドレスが実セグメントアドレスでない場合には、これらの処理は行われない。
そして重複排除実行部12400は、旧仮想セグメントポインタ3210ーsと旧ハッシュ値3211ーsをヌルにする。これにより、仮想セグメントに割り当てられていた、旧データを格納(退避)していた領域(旧仮想セグメントポインタ3210ーsでポイントされる実セグメント)が、実質的に削除されたことになる。
ハッシュ値3602が消去防止ハッシュ値3209ーsと一致した場合、重複排除実行部12400は消去防止ハッシュ値3209ーsと消去防止アドレス3208ーsをヌルにし、消去防止仮想セグメント数3207ーsを1減らす。これにより、仮想セグメントに割り当てられていた、旧データを格納(退避)していた領域(消去防止アドレス3208ーsでポイントされる実セグメント)が、実質的に削除されたことになる。
また、重複排除実行部12400はデータ格納量3203から仮想セグメントのサイズを減算し、これまで消去防止アドレス3208ーsにポイントされていた実セグメントに対応する実セグメントビットマップ3305のビットをオフする。これは、上で説明した旧仮想セグメントポインタ3210ーsに対して行われる処理と同じである。
さらに重複排除実行部12400は、ヌルにした、消去防止ハッシュ値3209ーsと消去防止アドレス3208ーsより後ろに格納されている、消去防止ハッシュ値3209と消去防止アドレス3208を、ヌル値にした消去防止ハッシュ値3209と消去防止アドレス3208まで、前詰めする。
ステップ16002:本ステップでは、消去Flag3603が“0”のレコードについての処理が行われる。以下ではステップ16001と同様、消去Flag3603が“0”のレコードが1つであった場合の例を説明する。また、このレコードの仮想セグメントアドレス3601で特定される仮想セグメントのことを、「対象仮想セグメント」と呼ぶ。
重複排除実行部12400はレコードの仮想セグメントアドレス3601から、対象仮想セグメントが属する仮想ブロックグループと、対象仮想セグメントの相対仮想セグメント番号を求める。以下では求められた相対仮想セグメント番号が“s”の場合の例を説明する。重複排除実行部12400は、特定された仮想ブロックグループの仮想ブロックグループ情報3200の更新を行う。
具体的には重複排除実行部12400は、消去防止仮想セグメント数3207−sを1増やす。さらに重複排除実行部12400は、旧仮想セグメントポインタ3210と旧ハッシュ値3211を消去防止アドレス3208、消去防止ハッシュ値3209の領域にコピーする。さらに重複排除実行部12400は、旧仮想セグメントポインタ3210、旧ハッシュ値3211をヌルにする。
ステップ16003:ここでは、重複候補に関する処理が実行される。重複候補の中に、重複Flag3702が“0”のレコードが含まれていた場合、そのレコードは無視される。重複Flag3702が“1”のレコードが含まれていた場合、そのレコードの仮想セグメントアドレス3701で特定される仮想セグメントについては、重複排除処理が行われるべきである。以下、重複候補内に重複Flag3702が“1”のレコードが1つ含まれていた場合の例を説明する。また、以下の例では、そのレコードの仮想セグメントアドレス3701で特定される仮想セグメント(対象仮想セグメントと呼ぶ)の相対仮想セグメント番号が“s”の場合の例を説明する。
重複排除実行部12400は対象仮想セグメントが属する仮想ブロックグループの仮想ブロックグループ情報3200を更新する。具体的には重複排除実行部12400は、新仮想セグメントポインタ3205ーsを一度ヌルにし、データ格納量3203から仮想セグメントのサイズを削減する。また重複排除実行部12400は、ステップ16001の処理と同様な方法で、新仮想セグメントポインタ3205−sが指し示していた実セグメントに対応する実セグメントビットマップ3305をオフする。
さらに重複排除実行部12400は、新仮想セグメントポインタ3205ーsに、重複Addr3703の値をセットする。これにより新仮想セグメントポインタ3205ーsは、ハッシュ値が同じ仮想セグメントを指すようになり、対象仮想セグメントの重複排除処理が行われた状態になる。なお、ハッシュ値が同じ仮想セグメントは、同一フラッシュパッケージ230内に存在することもあれば、別のフラッシュパッケージ230内に存在することもある。
ステップ16003が完了すると、重複排除実行部12400はストレージコントローラ200に、処理が完了したことを通知して、終了する。なお、上では、各ステップで処理対象となる消去候補のレコード(あるいは重複候補のレコード)が1つの場合の例を説明したが、消去候補のレコード(あるいは重複候補のレコード)が複数ある場合には、各レコードについて上で説明した処理が行われる。
図37は、重複排除判定部12300の処理フローである。重複排除判定部12300は、ストレージコントローラ200から重複排除判定要求と、先に説明したリスト1とリスト2が送られた時(ステップ12003)に実行される処理フローである。重複排除判定部12300は、当該フラッシュパッケージ230が担当するハッシュ値に関するリストを受け取ることになる(たとえばフラッシュパッケージ#xは、リスト1ーx、リスト2ーxを受け取る)。
ステップ17000:本ステップでは、リスト1ーxに関する処理が実行される。重複排除判定部12300はリスト1ーxから、レコードを1つずつ読み出して、各レコードに格納された仮想セグメントアドレス3402と(更新前)ハッシュ値3403に基づいて、仮想セグメントの旧データの消去可否判定を行い、消去候補のレコードを作成する。
以下、リスト1ーx内のある1つのレコードが読み出された時に行われる処理の例を説明する。また以下では、読み出されたレコードの(更新前)ハッシュ値3403がHであった場合の例を説明する。また、読み出されたレコードの仮想セグメントアドレス3402で特定される仮想セグメントのことを、「対象セグメント」と呼び、対象セグメントの仮想セグメントアドレス(つまり仮想セグメントアドレス3402)を「対象セグメントアドレス」と呼ぶ。
(更新前)ハッシュ値3403がHであった場合、重複排除判定部12300は、ハッシュインデックス情報3500を検索し、ハッシュ値Hの情報が格納されているリーフセグメント3501を特定し、バッファ330へ読みだす。この時重複排除判定部12300はデータリード処理実行部12600を呼び出すことで、リーフセグメント3501の格納されている仮想セグメントの読み出しを行う。
続いて重複排除判定部12300は、読み出したリーフセグメント3501から、登録ハッシュ値3502がHであるエントリ3510を特定する。さらに重複排除判定部12300は、そのエントリ3510の中に、対象セグメントアドレスと等しい値の登録アドレス3505が存在するか判定し、判定結果によって異なる処理を行う。
まず、対象セグメントアドレスの値と等しい登録アドレス3505が存在する場合について説明する。この場合、存在した登録アドレス3505が、エントリ3510内の先頭の登録アドレス3505であるケースと、そうでないケースがあり得る。
対象セグメントアドレスの値と等しい登録アドレス3505が、エントリ3510内の先頭の登録アドレス3505でない場合、対象セグメントの旧データは消去してもよい。エントリ3510内の2番目以降の登録アドレス3505には、重複排除処理が行われていない仮想セグメントのアドレスが格納されているから(1番目の登録アドレス3505と同一ストライプラインに属する仮想セグメントの仮想セグメントアドレスが格納されている)、この仮想セグメントの旧データは削除されても問題が発生しない。
そのためこの時には、重複排除判定部12300は、消去候補のレコードとして、仮想セグメントアドレス3601に対象セグメントアドレスが格納され、ハッシュ値3602にH、消去Flag3603に1が格納されたレコードを作成する。また重複排除判定部12300は、対象セグメントアドレスの値と等しい登録アドレス3505に対応する無効フラグ3506をオンにする。同時に登録アドレス3505にNULLが格納されるようにしてもよい。また重複排除判定部12300は、セグメント数3504を1削減する。
なお、ここで行われるエントリ3510の編集(セグメント数3504等の更新など)は、バッファ330上に読み出されたエントリ3510の内容に対して行われるものである。
一方、エントリ3510の先頭の登録アドレス3505が、対象セグメントアドレスの値と等しかった場合、対象セグメントの旧データは消去して良い場合とそうでない場合があり得る。登録データ数3503が1の場合、対象セグメントアドレス(または先頭の登録アドレス3505)で特定される仮想セグメント以外に、ハッシュ値Hを持つ仮想セグメントは存在しないことを意味する。そのためこの場合、対象セグメントの旧データは消去されて良い。また登録データ数3503が1でもセグメント数3504が2以上の値である場合、ハッシュ値Hを持つ仮想セグメントは複数存在する。ただしこの場合、ハッシュ値Hを持つ仮想セグメントはいずれも、あるフラッシュパッケージグループ280内の同一ストライプラインに存在する。同一ストライプラインに属する仮想セグメントは重複排除処理が行われていないので消去してもよい。一方、登録データ数3503が2以上の場合、対象セグメントを参照している仮想セグメントが存在する(重複排除されている)ことを意味する。その場合、対象セグメントの旧データは消去されるべきでない。
そのため、登録データ数3503が1の場合、重複排除判定部12300は消去候補のレコードとして、仮想セグメントアドレス3601に対象セグメントアドレスが格納され、ハッシュ値3602にH、消去Flag3603に1が格納されたレコードを作成する。さらに重複排除判定部12300は、リーフセグメント3501から登録ハッシュ値3502がHであるエントリ3510を削除する。これは、ハッシュ値Hをもつ仮想セグメントで、かつ重複排除処理対象となる仮想セグメントが無くなったからである。
登録データ数3503が2以上の場合には、重複排除判定部12300は消去候補のレコードとして、仮想セグメントアドレス3601に対象セグメントアドレスが格納され、ハッシュ値3602にH、消去Flag3603に0が格納されたレコードを作成する(つまり対象セグメントの消去を行わせない)。またこの時、重複排除判定部12300はエントリ3510の内容変更は行わない。
続いて、エントリ3510内に、対象セグメントアドレスの値と等しい登録アドレス3505が存在しない場合について説明する。この場合、対象セグメントは、エントリ3510の先頭の登録アドレス3505で特定される仮想セグメントを参照している仮想セグメントである。逆に対象セグメントは他の仮想セグメントから参照されているわけではないので、対象セグメントの旧データは消去されてよい。そのため、重複排除判定部12300は消去候補のレコードとして、仮想セグメントアドレス3601に対象セグメントアドレスが格納され、ハッシュ値3602にH、消去Flag3603に1が格納されたレコードを作成する。さらに重複排除判定部12300は、登録データ数3503を1削減する。ここで行われる登録データ数3503の更新も、バッファ330上に読み出されたエントリ3510の内容に対して行われるものである。
以上のような処理がリスト1内の全レコードについて行われる。リスト1内の全レコードについて、上で述べた処理が行われた後、重複排除判定部12300は、バッファ330上で編集(更新)されたリーフセグメント3501の書き込みを行う。その際重複排除判定部12300は、図33と図34に示したデータライト処理実行部12100を呼び出すことで書き込みを実行する。データライト処理実行部12100の説明から分かる通り、仮想セグメントに対する書き込みを行うと、書き込みデータは、仮想セグメントに割り当てられている実セグメントとは異なる実セグメント(空き実セグメント)に書き込まれることになる。
ステップ17001:本ステップでは、リスト2に関する処理が実行される。重複排除判定部12300はリスト2ーxからレコードを1つずつ読み出して、各レコードに格納された仮想セグメントアドレス3402と(更新後)ハッシュ値3404に基づいて、重複排除の判定を行い、重複候補のレコードを作成する。以下、リスト2ーx内のある1つのレコードが読み出された時に行われる処理の例を説明する。ステップ17000の説明の場合と同様、以下では読み出されたレコードの(更新後)ハッシュ値3404がHであった場合の例を説明する。また、読み出されたレコードの仮想セグメントアドレス3402で特定される仮想セグメントのことを、「対象セグメント」と呼び、対象セグメントの仮想セグメントアドレス(つまり仮想セグメントアドレス3402)を「対象セグメントアドレス」と呼ぶ。
(更新後)ハッシュ値3404がHであった場合、重複排除判定部12300は、ハッシュインデックス情報3500を検索し、ハッシュ値Hの情報が格納されている可能性があるリーフセグメント3501を特定し、バッファ330へ読み出す。ステップ17000と同様、この時重複排除判定部12300はデータリード処理実行部12600を呼び出すことで、リーフセグメント3501の読み出しを行う。
続いて重複排除判定部12300は、読み出したリーフセグメント3501内に、登録ハッシュ値3502がHであるエントリ3510があるか判定する。該当するエントリ3510が見つからない場合、重複排除ができない(重複データが存在しないことを意味する)。この場合には重複排除判定部12300は、重複候補のレコードとして、仮想セグメントアドレス3701に対象セグメントアドレスが格納され、重複Flag3702に0、重複Addr3703にNULLが格納されたレコードを作成する。また重複排除判定部12300は、バッファ330上に読み出されたリーフセグメント3501内に、ハッシュ値Hと仮想セグメントアドレスを記録する。具体的には重複排除判定部12300は、登録ハッシュ値3502にHが格納されたエントリ3510を新たに作成する。また重複排除判定部12300は、登録データ数3503とセグメント数を1にし、エントリ3510内の先頭の登録アドレス3505に、対象セグメントアドレスをセットし、無効フラグ3506をオフにする。
登録ハッシュ値3502がHであるエントリ3510がある場合、重複排除できる可能性がある。この場合重複排除判定部12300は、エントリ3510内の先頭の登録アドレス3505に記録されている仮想セグメントアドレスと対象セグメントアドレスを比較して、両者が同一のストライプラインに属しているか判定する。この判定の際にフラッシュパッケージグループ情報2300が用いられる。
具体的には、登録アドレス3505に記録されている仮想セグメントアドレスと対象セグメントアドレスに含まれているパッケージIDが、いずれも同一フラッシュパッケージグループ280内のフラッシュパッケージ230のもので、かつ登録アドレス3505に記録されている仮想セグメントアドレスと対象セグメントアドレスに含まれている内部仮想セグメント番号が等しい場合、両者は同一のストライプラインに属していると判断できる。
両者が同一のストライプラインに属する場合、重複排除判定部12300は対象セグメントの重複排除処理は行わないと決定する。そのため重複排除判定部12300は重複候補のレコードとして、仮想セグメントアドレス3701に対象セグメントアドレスが格納され、重複Flag3702に0、重複Addr3703にNULLが格納されたレコードを作成する。さらに重複排除判定部12300は、バッファ330上に読み出されたリーフセグメント3501内のエントリ3510の更新を行う。具体的には重複排除判定部12300は、セグメント数3504の値を1加算し、またエントリ内に登録アドレス3505と無効フラグ3506のセットを追加し、追加されたセット内の新しい登録アドレス3505に対象セグメントアドレスをセットし、無効フラグ3506をオフにする。
両者が同一のストライプラインに属さない場合、対象セグメントは重複排除されてよい。重複排除判定部12300は、重複候補のレコードとして、仮想セグメントアドレス3701に対象セグメントアドレスが格納され、重複Flag3702に1、重複Addr3703にエントリ3510内の先頭の登録アドレス3505の内容が格納されたレコードを作成する。また重複排除判定部12300は、エントリ3510内の登録データ数3503を一つ増やす。
以上のような処理がリスト2内の全レコードについて行われる。その後重複排除判定部12300は、バッファ330上で編集(更新)されたリーフセグメント3501の書き込みを行う。ステップ17000で説明したとおり、重複排除判定部12300は、図33と図34に示したデータライト処理実行部12100を呼び出すことで書き込みを実行する。
ステップ17002:重複排除判定部12300は、ステップ17000、ステップ17001で作成された消去候補と重複候補のリストをストレージコントローラ200に返却し、その後、処理を完了する。
以上が重複排除判定部12300の処理である。なお、上では、ステップ17000の完了後、バッファ330上で編集(更新)されたリーフセグメント3501の書き込み(実セグメントへの書き込み)が行われ、さらにステップ17001の完了後にバッファ330上で編集(更新)されたリーフセグメント3501の書き込みが行われる例を説明した。ただしステップ17000とステップ17001で処理(参照または更新)対象となるリーフセグメント3501には同じものが含まれていることもある。そのため重複排除判定部12300は、リーフセグメント3501の実セグメントへの書き込みを、ステップ17000の完了時点では行わず、ステップ17001でまとめて行ってもよい。
以上で本実施例に係るストレージシステムの説明を終える。本実施例に係るストレージシステムでは、フラッシュパッケージ間のデータの重複排除を実行できるので、重複排除の効率が良い。また原則として、フラッシュパッケージが重複排除処理を実行するので、ストレージコントローラが性能上のボトルネックになることがないという利点がある。
また本実施例に係るストレージシステムでは、重複排除処理のためにストレージコントローラとフラッシュパッケージとの間でやり取りされる情報は、ハッシュ値と対応するデータアドレスのみである。そして、ストレージコントローラは複数のハッシュ値及びデータアドレスを1回のコマンドで転送することで、ストレージコントローラからのフラッシュパッケージへのアクセス回数を削減する。
また、重複排除処理を行うストレージシステムでは、上で述べた実施例に係るストレージシステムのハッシュインデックスのように、データのハッシュ値と、そのハッシュ値を持つデータが格納された領域の情報(以下、インデックスと呼ぶ)を記憶しておく必要がある。これらの情報は膨大になるため、DRAM等の高価な記憶媒体に格納すると、記憶デバイスのビットコストが高くなる。そのため本実施例に係るストレージシステムでは、これらの情報をフラッシュパッケージのフラッシュメモリに格納している。
インデックスは、ホストからのデータライト(更新)が発生するたびに変更される。そのため、インデックスを特定のフラッシュパッケージに集約して格納すると、そのフラッシュパッケージの更新数が膨大になるため、性能の隘路になり易く、フラッシュメモリの寿命も短くなる。
上で説明した実施例に係るストレージシステムでは、インデックスを複数のフラッシュパッケージに分散して格納し、分散格納されたインデックスはそれぞれのフラッシュパッケージで管理(参照または更新)される。そのためインデックスに係る処理が特定のコントローラ(またはフラッシュパッケージ)に集中することがない。また、インデックスの書き込まれるフラッシュメモリ上の領域(セグメント)も、ウェアレベリング処理の対象として管理されるため、インデックスの書き込まれるセグメントとデータの書き込まれるセグメントとで、消去回数に偏りが出ないように制御される。
また、インデックスの更新処理にかかるオーバヘッドは大きい。データが更新された場合、通常は、ハッシュ値も異なった値(旧ハッシュ値から新ハッシュ値)に変更される。このためデータが1回更新されると、インデックスに対して、1)当該データがもつハッシュ値を新ハッシュ値に更新する、2)新ハッシュ値をもつデータの集合に当該データのアドレスを付加する、3)旧ハッシュ値をもつデータの集合から当該データのアドレスを削除する、という3回の更新が発生する。ストレージコントローラでこの更新を行おうとすると、これらの情報を読み出すためのフラッシュメモリアクセスが3回、書き込むためのフラッシュメモリアクセスが3回発生するので、大きなオーバヘッドになる。
上で説明した実施例に係るストレージシステムでは、ストレージコントローラとフラッシュパッケージ間で、重複排除処理で用いられるライト処理履歴及びライトデータのハッシュ値の転送を行う際、複数回のライト処理履歴及びハッシュ値をまとめて転送する。そのため情報転送のオーバヘッドを小さくすることができる。
続いて実施例2の説明を行う。実施例2における情報システムのハードウェア構成は、実施例1における情報システム(図1)と同様である。また以下の説明では、実施例1に係る情報システムの構成物と同じ物を特定する際、実施例1で用いた参照番号を用いる。
実施例1に係るストレージシステムと実施例2に係るストレージシステムとでは、主に以下の違いがある。実施例1に係るフラッシュパッケージは、重複排除の可否を判定するプログラム(重複排除判定部12300)を有し、重複排除判定部12300を実行することで、ストレージコントローラ200から送られてくる情報(リスト1、リスト2)をもとに、重複排除可否の判定等を行っていた。一方、実施例2に係るストレージシステムでは、ストレージコントローラ200が、実施例1で説明した重複排除判定部12300と同様の処理を行うプログラム(実施例2では、これを「重複排除判定部12300’」と呼ぶ)を有する。そしてストレージコントローラ200が重複排除判定部12300’を実行することで、重複排除可否の判定等を行う。逆に実施例2に係るフラッシュパッケージは、重複排除判定部12300を有さない。
続いて、実施例1に係るストレージシステムの有する管理情報と、実施例2に係るストレージシステムが有する管理情報の違いについて説明する。実施例2に係るフラッシュパッケージ230は、実施例1に係るフラッシュパッケージと異なり、ハッシュインデックス情報3500を持たない。代わりに実施例2に係るストレージシステムでは、ストレージコントローラ200がハッシュインデックス情報3500を管理し、ハッシュインデックス情報3500は共有メモリ220上に格納される。そのため、実施例2に係るフラッシュパッケージ230は、必ずしもフラッシュボリュームに隠し領域を設ける必要はない。
実施例2において、ストレージコントローラ200が有するハッシュインデックス情報3500のフォーマットは、実施例1で説明したものと同じである。ただし、実施例2に係るハッシュインデックス情報3500では、リーフセグメント3501へのポインタであるリーフアドレス3507には、リーフセグメント3501が格納されている共有メモリ220上アドレスが用いられる点が、実施例1におけるハッシュインデックス情報と異なる(実施例1におけるハッシュインデックス情報では、リーフアドレスに仮想セグメントアドレスが用いられた)。
また実施例2に係るフラッシュパッケージ230は、フラッシュパッケージグループ情報2300とハッシュ値格納情報2400を持っていなくて良い。一方実施例2に係るストレージコントローラ200は、実施例1と同様にフラッシュパッケージグループ情報2300を有するが、ハッシュ値格納情報2400を有する必要はない。
実施例2に係るストレージシステムでは、ストレージコントローラ200がハッシュインデックス情報3500の参照・更新を行う。なお、実施例1に係るストレージシステムでは、各フラッシュパッケージ230がハッシュインデックス情報3500を有していたため、ストレージシステム内にはフラッシュパッケージ230と同数のハッシュインデックス情報3500が存在していた。一方実施例2に係るストレージシステムでは、ストレージコントローラ200が1つのハッシュインデックス情報3500を有するだけで良い。また、実施例2においては、ハッシュインデックス情報3500が共有メモリ220に格納されている例を説明するが、共有メモリ220に代えてキャッシュメモリ210にハッシュインデックス情報3500が格納されていてもよい。あるいは実施例2に係るストレージシステムでは、ハッシュインデックス情報3500が、フラッシュパッケージ230やHDD等の記憶デバイスが有する記憶領域に格納されるように構成されていてもよい。
次に、実施例2に係るストレージコントローラ200が実行する処理の説明を行う。なお、先に述べたとおり、実施例2に係るフラッシュパッケージは、重複排除判定部12300を有さず、重複排除判定部12300を実行しない点だけが、実施例1におけるフラッシュパッケージと異なる。そのため、実施例2に係るフラッシュパッケージが実行する処理の説明は略す。
実施例2に係るストレージコントローラ200はそのメモリ270内に、少なくともリード処理実行部4000、ライト要求受付部4100、ライトアフタ処理実行部4200、重複排除スケジュール部4300’、重複排除判定部12300’というプログラムを有する(図示は略す)。リード処理実行部4000、ライト要求受付部4100、ライトアフタ処理実行部4200はいずれも、実施例1で説明したものと同じプログラムである。つまり、ホスト110からライト要求またはリード要求を受け付けた時に実施例2に係るストレージシステム100で行われる処理は、実施例1で説明したものと同じである。
重複排除スケジュール部4300’は、実施例1で説明した重複排除スケジュール部4300と類似したプログラムだが、若干の相違点がある。以下ではこの相違点を主に説明する。図38を用いて、重複排除スケジュール部4300’が行う処理の流れを説明する。
ステップ12000とステップ12001は、実施例1で説明したもの(図26のステップ12000〜ステップ12001)と同じ処理である。そのためここでの説明は略す。ステップ12001が完了した後、重複排除スケジュール部4300’は次にステップ12003’を実行する。
ステップ12003’:このステップは、実施例1で説明したステップ12003に代わる処理である。ステップ12003’では重複排除スケジュール部4300’は、ステップ12001で作成されたリスト1、リスト2を用いて、重複排除可否の判定を行う。この時、重複排除スケジュール部4300’は重複排除判定部12300’をコールすることで、重複排除可否の判定を行う。重複排除判定部12300’は実施例1で説明した重複排除判定部12300と同様の処理を行うことにより、旧データ(更新前データ)の消去可否の判定、更新データの重複排除可否の判定を行い、消去候補と重複候補(実施例1で説明したものと同様のもの)を出力する。
ステップ12003’の後、重複排除スケジュール部4300’はステップ12004〜ステップ12007を実行する。ステップ12004〜ステップ12007は、実施例1で説明したステップ12004〜ステップ12007と同じ処理であるため、ここでの説明は略す。
続いて、重複排除判定部12300’の処理の流れの説明を行う。実施例1で説明した重複排除判定部12300と、実施例2における重複排除判定部12300’との主な違いは、重複排除判定部12300’はストレージコントローラ200のプロセッサ260で実行されることである。また重複排除判定部12300’の処理の流れは、実施例1で説明した重複排除判定部12300の処理の流れと同様のため、ここではフローチャートの図示は略し、実施例1で用いた図37を参照しながら説明する。また以下の説明では、重複排除判定部12300’の処理のうち、実施例1で説明した重複排除判定部12300の処理と異なる点を主に説明する。
重複排除判定部12300’は、重複排除スケジュール部4300’から呼び出されたことを契機に、処理を開始する。この時重複排除判定部12300’は重複排除スケジュール部4300’からリスト1とリスト2を受領する。実施例1では重複排除スケジュール部4300がリスト1とリスト2を(ハッシュ値に基づいて)分割し、分割されたリスト1及びリスト2を、フラッシュパッケージ230の重複排除判定部12300に送信していた。実施例2に係る重複排除スケジュール部4300はリスト1とリスト2の分割を行わない。そのため、この時重複排除判定部12300’は、重複排除スケジュール部4300’から分割されてないリスト1とリスト2を受領する。
重複排除判定部12300’がリスト1とリスト2を受領した後に行う処理、特に図37のステップ17000及びステップ17001は、実施例1で説明したものと殆ど同様である。なおステップ17000及びステップ17001では、ハッシュインデックス情報3500の更新が行われることがあるが、実施例2においては、ハッシュインデックス情報3500が共有メモリ220上に格納されているため、実施例1における重複排除判定部12300のように、仮想セグメント(に割り当てられた実セグメント)からリーフセグメント3501の内容をバッファに読み出して、バッファ上で更新された内容を仮想セグメントに書き出す等の処理が不要である点が、実施例1で説明したものと異なる。
ステップ17000及びステップ17001が実行された結果、消去候補と重複候補が生成される。実施例1における重複排除判定部12300は、ステップ17001の終了後、消去候補と重複候補を(フラッシュパッケージ230から)ストレージコントローラ200に返却したが、実施例2における重複排除判定部12300’は、生成された消去候補と重複候補を、呼び出し元のプログラム(重複排除スケジュール部4300’)に送信する。その後重複排除判定部12300’は処理を終了する。
実施例2に係るストレージシステムは以上の処理を行うことにより、実施例1に係るストレージシステムと同様に、重複排除処理を行うことができる。
図39は、実施例3に係る情報システムのハードウェア構成を示している。実施例3に係る情報システムは、複数の実ストレージシステム(100−1,100−2,...)と、1以上のホスト110と、両者を接続するSAN120を有している。それぞれの実ストレージシステム(100−1,100−2,...)のハードウェア構成は、実施例1または2で説明したストレージシステム100と同じで、一つ以上のストレージコントローラ200、キャッシュメモリ210、共有メモリ220、フラッシュパッケージ230、そしてこれらの構成要素を接続する一つ以上の接続装置250、とを有する(図39では、これらの構成要素の図示は略している)。以下では、各実ストレージシステム(100−1,100−2,...)を総称する場合、「実ストレージシステム100」と表記する。
また図39において、実ストレージシステム100の有する要素190は、実ストレージシステム100をSAN120に接続するための通信インターフェイスである。本実施例ではこれを「ポート」と呼ぶ。各実ストレージシステム100は、ポート190を1以上有する。ポート190は、実ストレージシステム100が、ホスト110や他の実ストレージシステム100との間でデータの送受信を行うために用いられる。
実施例3に係る実ストレージシステム100は、実ストレージシステム100同士でデータや要求の送受信を行うことがあり、その時に実ストレージシステム100はポート190を介してデータや要求の送受信を行う。なお、実施例1または実施例2に係るストレージシステムもポートを有するが、実施例1または2ではポートの説明は略している。
また、実施例3に係る情報システムはストレージ管理サーバ180を有し、ストレージ管理サーバ180はLocal Area Network(LAN)130を介して各実ストレージシステム100に接続されている。
実施例3に係る実ストレージシステム100は、実施例1に係るストレージシステム100の有する機能と同じ機能を有する。そのため、実施例1で説明したように、実ストレージシステム100は1以上の論理ボリュームを定義して、ホスト110等に提供する。そして実ストレージシステム100が各論理ボリュームの記憶空間を複数の仮想ページに分割して管理する点、フラッシュパッケージグループ280の領域から実ページが形成され、実ページが仮想ページに割り当てられる点も、実施例1と同じである。
さらに実施例3に係る実ストレージシステム100は、実施例1に係るストレージシステム100の有する機能の他、それぞれの実ストレージシステム100が有する記憶領域を互いに使用する(共有する)機能を有する。そのため実施例3では、互いに記憶領域を使用可能な実ストレージシステム100の集合を「仮想ストレージシステム1000」と呼ぶ。
仮想ストレージシステム1000はたとえば情報システムのユーザ(管理者)によって定義されるとよい。管理者が、1つの仮想ストレージシステム1000に属する実ストレージシステム100のセットを決定すると、ストレージ管理サーバ180を用いて、各実ストレージシステム100に対して、1つの仮想ストレージシステム1000に属するべき実ストレージシステム100の識別番号(たとえば製造番号等)のセットを通知する、各実ストレージシステム100はこの情報を受領することで、仮想ストレージシステム1000に属する各実ストレージシステム100を認識できる。
各実ストレージシステム100が互いに記憶領域を共有する構成の一つの例は、複数の実ストレージシステム100を跨って重複排除が行われる構成である。以下では、複数の実ストレージシステム100を跨って重複排除が行われる構成の例を、実施例1でも用いられた図18を参照しながら説明する。なお、図18に記載のフラッシュパッケージ230−Aが実ストレージシステム100−1に搭載されているもので、一方実ストレージシステム100−2はフラッシュパッケージ230−Bを搭載している前提で説明する。
フラッシュパッケージ230−Bの仮想セグメント#yに、フラッシュパッケージ230−Aの仮想セグメント#xに書き込まれていたデータと同じデータが書き込まれたケースを想定する。その場合、フラッシュパッケージ230−Bの仮想セグメント#yには、一旦はフラッシュパッケージ230−B内の実セグメントが割り当てられて、書き込まれたデータは割り当てられた実セグメントに格納される。
その後行われる重複排除処理において、フラッシュパッケージ230ーBは、仮想セグメント#yの新仮想セグメントポインタ(3205)に、フラッシュパッケージ230−Aの仮想セグメント#xの仮想セグメントアドレスを格納することで、仮想セグメント#yが仮想セグメント#xを参照するようにする。そして、それまで仮想セグメント#yに割り当てられていた実セグメントは、仮想セグメント#yに割り当てられなくなる(ただし実施例1で説明したように、仮想ストレージシステム1000内に、仮想セグメント#yを参照する他の仮想セグメントがあった場合には、実セグメントのアドレスは仮想セグメント#yの消去防止アドレス3208(または旧仮想セグメントポインタ3210)に退避され、実セグメントが仮想セグメント#yに割り当てられた状態が維持される)。
その後、ホスト110が仮想セグメント#yをリード対象範囲に含むリード要求を発行すると、仮想セグメント#xを有するフラッシュパッケージ230−Aからデータが読み出されて、ホスト110に返送される。この処理は後述する。このように、実施例3に係る仮想ストレージシステム1000では複数の実ストレージシステム100に跨った重複排除が行われるため、実施例1または2に係るストレージシステムよりも、データ量削減の効果が大きくなることが期待できる。
また、各実ストレージシステム100が互いに記憶領域を共有する別の例として、各実ストレージシステム100が実ページを共有する構成もありえる。たとえば実ストレージシステム100−1は、実ストレージシステム100−1が定義した論理ボリュームの仮想ページに、実ストレージシステム100−2が有する実ページを割り当て、ホスト110から、実ストレージシステム100−1が定義した論理ボリュームの仮想ページに対するライトデータを受領した時、そのライトデータを実ストレージシステム100−2が有する実ページに格納する機能を有していてもよい。ただしこの機能は、重複排除処理とは直接の関係がないため、本明細書ではこの機能の説明を略す。また以下の説明においても、実ストレージシステム100はこの機能を有していないことを前提として、説明を行う。
続いて、実施例3に係る実ストレージシステム100が有する管理情報について説明する。まず実ストレージシステム100は共有メモリ220上に、少なくとも実施例1で説明した管理情報(図5に示された管理情報)を保持する。これに加えて実ストレージシステム100は、仮想ストレージシステム1000内の各実ストレージシステム100についての情報(後述するストレージシステム情報2700)も、共有メモリ220上に保持する。
図40を用いて、ストレージシステム情報2700の内容を説明する。ストレージシステム情報2700は、仮想ストレージシステム1000内の各実ストレージシステム100が有するフラッシュパッケージ230の情報と、各実ストレージシステム100の有するポートの情報の集合である。
また、仮想ストレージシステム1000内の、ある1台の実ストレージシステム100が有するフラッシュパッケージ230の情報とポートの情報のセットを、「実ストレージシステム情報2710」と呼ぶ。ストレージシステム情報2700には、仮想ストレージシステム1000内のすべての実ストレージシステム100の実ストレージシステム情報2710が含まれる。
実ストレージシステム情報2710の内容について、図40を参照しながら説明する。実ストレージシステム情報2710には、実ストレージシステムID2711、ポートアドレス2712、フラッシュパッケージID2713が含まれる。
実ストレージシステムID2711は、実ストレージシステム100の識別番号(たとえば製造番号等である)である。ポートアドレス2712は、実ストレージシステム100が有するポートの識別子で、たとえばN_Port IDあるいはWWN(World Wide Name)等である。実施例3に係る実ストレージシステム100は、SAN120を経由して、他の実ストレージシステム100に対してデータ送受信要求(後述する外部パッケージリード要求等の要求)を発行することがある。この時、要求送信対象の実ストレージシステム100の有するポートを指定したアクセス要求を発行する。ポートアドレス2712はそのために用いられる。また実ストレージシステム100がポートを複数有する場合、実ストレージシステム情報2710内に複数のポートアドレス2712が格納されていてよい。
フラッシュパッケージID2713は、実ストレージシステム100が有するフラッシュパッケージ230のパッケージIDである。通常、実ストレージシステム100には複数のフラッシュパッケージ230が搭載されている。実ストレージシステム情報2710内には、実ストレージシステム100が有する全てのフラッシュパッケージ230のパッケージIDが格納されている。なお、実施例3に係る仮想ストレージシステム1000では、各フラッシュパッケージ230のパッケージIDには、仮想ストレージシステム1000内で一意な識別子が用いられる。
ストレージシステム情報2700は、仮想ストレージシステム1000内のすべての実ストレージシステム100が有する情報である。また仮想ストレージシステム1000内の各実ストレージシステム100が有するストレージシステム情報2700の内容は同じである。
続いて、実施例3に係る実ストレージシステム100が有するハッシュ値格納情報2400について説明する。ただしハッシュ値格納情報2400のフォーマットは、実施例1で説明したものと同じ(図11)であるので、ここでの図示は略す。
実施例3に係る仮想ストレージシステム1000では実施例1と同様、各フラッシュパッケージ230が重複排除可否の判定を行い、ハッシュ値はフラッシュパッケージ230に格納される(実施例1で説明したように、ハッシュ値はハッシュインデックス情報3500内のリーフセグメント3501に格納される)。また実施例1と同じく、各フラッシュパッケージ230が担当するハッシュ値の範囲は、フラッシュパッケージ230毎に異なっている。実施例3に係る仮想ストレージシステム1000が有するハッシュ値格納情報2400には、実施例1で説明したハッシュ値格納情報2400と同様に、各フラッシュパッケージ230が担当するハッシュ値の範囲に関する情報が格納されている。実施例1と同様、実施例3に係る仮想ストレージシステム1000でも、ハッシュ値格納情報2400は、各実ストレージシステム100の共有メモリ220と、各フラッシュパッケージ230のパッケージメモリ320内に格納される。
実施例3に係るハッシュ値格納情報2400のフォーマットは実施例1で説明したものと同じで、ハッシュ範囲2401とフラッシュパッケージID2402のセットが複数含まれる。実施例3に係る実ストレージシステム100が有するハッシュ値格納情報2400と、実施例1に係るストレージシステム100が有するハッシュ値格納情報2400との違いは、実施例1に係るストレージシステム100が有するハッシュ値格納情報2400には、ストレージシステム100内の各フラッシュパッケージが担当するハッシュ値の情報だけが含まれているが、実施例3に係る実ストレージシステム100が有するハッシュ値格納情報2400には、仮想ストレージシステム1000内の各実ストレージシステム100が有する全フラッシュパッケージ230が担当するハッシュ値の情報が含まれる点である。
次に、フラッシュパッケージ230が有する管理情報について説明する。実施例3に係るフラッシュパッケージ230が有する管理情報の種類は、実施例1に係るフラッシュパッケージ230が有する管理情報(図12)と同じである。また各管理情報のフォーマットも、実施例1と実施例3とで違いはない。
ただし、実施例1に係るフラッシュパッケージ230が有する管理情報と、実施例3に係るフラッシュパッケージ230が有する管理情報には、以下の違いがある。実施例1に係るフラッシュパッケージ230は、ストレージシステム100内の全フラッシュパッケージグループ280のフラッシュパッケージグループ情報2300を保持するが、実施例3に係るフラッシュパッケージ230は、仮想ストレージシステム1000内の各実ストレージシステム100が管理する、全フラッシュパッケージグループ280のフラッシュパッケージグループ情報2300を保持する。
続いて、実施例3に係る仮想ストレージシステム1000において、ストレージコントローラ200とフラッシュパッケージ230が実行する処理の説明を行う。まず、ストレージコントローラ200で行われる処理について説明する。
実施例3に係るストレージコントローラ200が実行する主なプログラムは、リード処理実行部4000’、ライト要求受付部4100、ライトアフタ処理実行部4200、重複排除スケジュール部4300’’、外部パッケージリード実行部4400を有する(図示は略す)。ライト要求受付部4100とライトアフタ処理実行部4200は、実施例1で説明したものと同じなので、ここでの説明は略す。
リード処理実行部4000’は実施例1で説明したリード処理実行部4000と同様、ホスト110からリード要求を受領した時に実行されるプログラムである。重複排除スケジュール部4300’’は実施例1で説明した重複排除スケジュール部4300と同様の処理を行うプログラムである。
外部パッケージリード実行部4400は、実ストレージシステム100が他の実ストレージシステムから要求(外部パッケージリード要求)を受領した時に実行されるプログラムである。以下では、リード処理実行部4000’と重複排除スケジュール部4300’’と外部パッケージリード実行部4400が実行する処理の流れについて説明する。
まず実施例3におけるリード処理実行部4000’の処理フローについて、図41を参照しながら説明する。実施例3に係る仮想ストレージシステム1000では、ホスト110からリード要求を受領した実ストレージシステム100が、仮想ストレージシステム1000内の他の実ストレージシステム100に要求(外部パッケージリード要求)を発行することがある。以下の説明では、ホスト110からリード要求を受領した実ストレージシステム100のことを“実ストレージA”と呼び、また実ストレージAが外部パッケージリード要求を発行する先の実ストレージシステム100のことを“実ストレージB”と呼ぶ。
なお、図41に記載の各ステップは、ホスト110からリード要求を受領した実ストレージシステム100(つまり実ストレージA)のリード処理実行部4000’によって実行される処理である。そのため以下の説明で、リード処理実行部4000’を主語として説明している箇所は、実ストレージAが実行する処理であることを意味する。
リード処理実行部4000’は、実施例1におけるリード処理実行部4000で行われていたステップ5009の代わりに、ステップ50091〜50093を実行する。それ以外の処理(ステップ5000〜ステップ5007、ステップ5008、ステップ5010、ステップ5011)は、実施例1で説明した処理と同じである。以下、主にステップ50091〜50093について説明する。
ステップ5006において、実ストレージAの有するフラッシュパッケージ230から実ストレージAのストレージコントローラ200に、データが重複排除されている旨の応答が返された場合(ステップ5007:Yes)、リード処理実行部4000’はステップ50091を実行する。実施例1で説明したとおり、データが重複排除されている旨の応答には、仮想セグメントアドレスとハッシュ値のセットが含まれている。
ステップ50091でリード処理実行部4000’はストレージシステム情報2700を参照することにより、データが重複排除されている旨の応答に含まれている仮想セグメントアドレスが、実ストレージAの有するフラッシュパッケージ230の仮想セグメントアドレスか、他の実ストレージシステム100が有するフラッシュパッケージ230の仮想セグメントアドレスか、判定する。仮想セグメントアドレスにはフラッシュパッケージ230のパッケージIDが含まれているので、リード処理実行部4000’は応答に含まれている仮想セグメントアドレス内のパッケージIDが、ストレージシステム情報2700のどの実ストレージシステム情報2710に含まれているかを判定することにより、どの実ストレージシステム100が有するフラッシュパッケージ230の仮想セグメントアドレスであるかを判定することができる。
応答に含まれている仮想セグメントアドレスが、実ストレージAの有するフラッシュパッケージ230の仮想セグメントアドレスである場合(ステップ50091:No)、リード処理実行部4000’は実ストレージAの有するフラッシュパッケージ230に対してハッシュ指定型リード要求を発行する(ステップ50092)。ステップ50092は実施例1で説明したステップ5009と同じ処理である。その後リード処理実行部4000’は、ステップ5010、ステップ5008、ステップ5011を実行し、処理を終了する。
応答に含まれている仮想セグメントアドレスが、実ストレージA以外の実ストレージシステム100(たとえば実ストレージB)の有するフラッシュパッケージ230の仮想セグメントアドレスである場合(ステップ50091:Yes)、リード処理実行部4000’は実ストレージBに対して、フラッシュパッケージ230内のデータの取得を要求する(ステップ50093)。なおここで発行される要求のことを、「外部パッケージリード要求」と呼ぶ。
ステップ50093では、リード処理実行部4000’はSAN120を介して、実ストレージBに対して外部パッケージリード要求を発行する。外部パッケージリード要求に含まれる情報は、仮想セグメントアドレス、ハッシュ値、そして実ストレージシステム100(実ストレージB)のポートアドレスである。
ステップ50093で行われる処理について詳述する。以下の説明では、データが重複排除されている旨の応答に含まれているパッケージID(仮想セグメントアドレス内に含まれている)が“p”であった場合の例を説明する。リード処理実行部4000’は、ストレージシステム情報2700内の実ストレージシステム情報2710のうち、フラッシュパッケージID2713が“p”である実ストレージシステム情報2710を特定する。
続いてリード処理実行部4000’は、特定された実ストレージシステム情報2710に含まれるポートアドレス2712を取得する。さらにリード処理実行部4000’は、取得したポートアドレス2712と、データが重複排除されている旨の応答に含まれている仮想セグメントアドレス及びハッシュ値を用いて、外部パッケージリード要求を作成し、SAN120経由で実ストレージBに外部パッケージリード要求を送信する。外部パッケージリード要求を受領した実ストレージシステム100(実ストレージB)で行われる処理の詳細は後述する。
その後リード処理実行部4000’は、実ストレージBから応答(リードデータを含む応答)が返却されるまで待機する(ステップ5010)。応答が返却されると、リード処理実行部4000’はステップ5008とステップ5011を実行し、処理を終了する。
続いて、外部パッケージリード要求を受領した実ストレージシステム100で行われる処理の流れを、図42を用いて説明する。外部パッケージリード要求を受領した実ストレージシステム100は、外部パッケージリード実行部4400の実行を開始する。
ステップ8001:外部パッケージリード実行部4400は、外部パッケージリード要求で指定されているリード対象データが、キャッシュメモリ210に格納されているか(ヒットしているか)をチェックする。これは、公知の技術である。ヒットしている場合(ステップ8001:Yes)、外部パッケージリード実行部4400はキャッシュメモリ210に格納されているデータを、要求元の実ストレージシステム100に返送し(ステップ8005)、処理を終了する。ヒットしていない場合(ステップ5001:No)、次にステップ8002が行われる。
ステップ8002:この処理は実施例1で説明したステップ5009と類似した処理である。外部パッケージリード実行部4400は、外部パッケージリード要求で指定されている仮想セグメントアドレスとハッシュ値を用いて、ハッシュ指定型リード要求を作成し、リード対象データの格納されているフラッシュパッケージ230に、作成されたハッシュ指定型リード要求を発行する。外部パッケージリード要求で指定されている仮想セグメントアドレスには、リード対象データの格納されているフラッシュパッケージ230のパッケージIDが格納されているので、外部パッケージリード実行部4400はこれにより要求発行先のフラッシュパッケージ230を特定できる。
ステップ8003:外部パッケージリード実行部4400は、フラッシュパッケージ230からデータが送られてくるのを待つ。
ステップ8004:外部パッケージリード実行部4400は、キャッシュメモリ210に、リード対象データを格納するための領域を確保し、フラッシュパッケージ230から送られてきたデータを、確保された領域に格納する。
ステップ8005:外部パッケージリード実行部4400はキャッシュメモリ210に格納されているデータを、要求元の実ストレージシステム100に返送し、処理を終了する。
次に、重複排除スケジュール部4300’’の処理フローを説明する。重複排除スケジュール部4300’’は、仮想ストレージシステム1000に含まれる全ての実ストレージシステム100で実行されるプログラムである。実施例3では、仮想ストレージシステム1000に含まれる各実ストレージシステム100において、同時に重複排除スケジュール部4300’’の実行が開始される。たとえばストレージ管理サーバ180が定期的に、仮想ストレージシステム1000内の全実ストレージシステム100に対して、重複排除スケジュール部4300’’の実行開始を指示する命令を送信し、各実ストレージシステム100は、ストレージ管理サーバ180からの指示に応じて、重複排除スケジュール部4300’’の実行を開始するとよい。あるいは特定の1つの実ストレージシステム100が定期的に、仮想ストレージシステム1000内の全実ストレージシステム100に対して、重複排除スケジュール部4300’’の実行開始を指示する命令を送信してもよい。
図43は、仮想ストレージシステム1000内の特定の1台の実ストレージシステム100(以下では仮にこれを「実ストレージA」と呼ぶ)で実行される、重複排除スケジュール部4300’’の処理フローを示している。ステップ12000〜ステップ12002は、実施例1で説明した重複排除スケジュール部4300の処理(図26)と同じであるため、説明を略す。
ステップ12021:実ストレージAの重複排除スケジュール部4300’’は、ステップ12001〜12002で作成、分割されたリスト1、リスト2のうち、他の実ストレージシステム100に送信すべきものを、他の実ストレージシステム100に送信する。以下の説明では実施例1と同じく、リスト1内のレコードのうちフラッシュパッケージ#fに送信すべきとステップ12002で判定されたレコードの集合を「リスト1−f」と表記し、同様に、リスト2内のレコードのうちフラッシュパッケージ#fに送信すべきとステップ12002で判定されたレコードの集合を「リスト2−f」と表記する。
また図43の説明において、ステップ12021で実ストレージAの重複排除スケジュール部4300’’が、リスト1−f及びリスト2−fをフラッシュパッケージ#fを有する実ストレージシステム100に送信する場合の例を説明する。実ストレージAの重複排除スケジュール部4300’’はストレージシステム情報2700を参照することで、フラッシュパッケージ#fを有する実ストレージシステム100のポートアドレス2712を特定し、特定された実ストレージシステム100のポートアドレス2712に対し、リスト1−f及びリスト2−fの送信を行う。リスト1−f及びリスト2−fの送信は、SAN120経由で行われる。ただし別の実施形態として、LAN130経由でリスト1−f及びリスト2−fが送信されてもよい。
なお、ステップ12002において、実ストレージAの重複排除スケジュール部4300’’が、分割されたリスト1、リスト2を作成した結果、たとえばある実ストレージシステム100(以下ではこれを仮に「実ストレージC」と呼ぶ)に送信すべきリスト1のレコード(またはリスト2のレコード)がないこともあり得る。このような場合には、実ストレージAの重複排除スケジュール部4300’’はステップ12021で、仮想セグメントアドレス3402と(更新前)ハッシュ値3403に無効値(NULL)の格納されたレコードを1つ作成し、この作成されたレコードを実ストレージCに送信する。
実ストレージCに送信すべきリスト1のレコード(またはリスト2のレコード)がない時に、もし実ストレージAが実ストレージCに何も送信しないと、実ストレージCは、実ストレージAから実ストレージCに送信すべきリスト1のレコード(またはリスト2のレコード)がないのか、あるいは障害等が原因で実ストレージAから送信したレコードが実ストレージCに届いていないためか、判断できない。そのため実ストレージAは、実ストレージCに送信すべきリスト1のレコード(またはリスト2のレコード)がない場合には、無効値(NULL)の格納されたレコードを作成して実ストレージCに送信する。
ステップ12022:実ストレージAの重複排除スケジュール部4300’’は、仮想ストレージシステム1000内の全ての実ストレージシステム100(ただし実ストレージAを除く)から、分割されたリスト1及びリスト2が送信されてくるまで待機する。そして実ストレージAの重複排除スケジュール部4300’’は、仮想ストレージシステム1000内の全ての実ストレージシステム100から、分割されたリスト1及びリスト2を受領した後、ステップ12003〜12005を実行する。ステップ12003〜12005は、実施例1で説明した処理と同じであるため、ここでの説明は略す。ただし実施例3では、実ストレージAの重複排除スケジュール部4300’’はステップ12003で分割されたリスト1及びリスト2を各フラッシュパッケージ230に送信する時、実ストレージAで作成されたリスト1及びリスト2(ステップ12001,12002で作成・分割されたリスト1、リスト2)に加えて、ステップ12022において他の実ストレージシステム100から受領したリスト1及びリスト2もフラッシュパッケージ230に送信する。
また以下の説明では実施例1と同じく、ステップ12003で各フラッシュパッケージ230から受領した消去候補に含まれるレコードのうち、フラッシュパッケージ#fに送信すべきレコードの集合を「消去候補−f」と呼ぶ。同様に、重複候補内のレコードのうちフラッシュパッケージ#fに送信すべきレコードの集合を「重複候補−f」と呼ぶ。
ステップ12051:実ストレージAの重複排除スケジュール部4300’’は、ステップ12004〜12005で分類された消去候補及び重複候補のうち、他の実ストレージシステム100に送信すべきものを、他の実ストレージシステム100に送信する。ステップ12021と同様に、実ストレージAの重複排除スケジュール部4300’’はストレージシステム情報2700を参照することで、フラッシュパッケージ#fを有する実ストレージシステム100のポートアドレス2712を特定し、特定された実ストレージシステム100に対し、消去候補−f及び重複候補−fの送信を行う。
なお、ある実ストレージシステム100(仮に“実ストレージC”と呼ぶ)に送信すべき消去候補のレコード(または重複候補のレコード)が存在しないこともあり得る。その場合重複排除スケジュール部4300’’は、ステップ12021で説明した方法と同じように、たとえば仮想セグメントアドレス3601(または仮想セグメントアドレス3701)に無効値(NULL)の格納されたレコードを1つ作成して、この無効値が格納されたレコードを実ストレージCに送信する。
ステップ12052:実ストレージAの重複排除スケジュール部4300’’は、仮想ストレージシステム1000内の他の実ストレージシステム100から、分類された消去候補及び重複候補を受領する。この後実ストレージAの重複排除スケジュール部4300’’は、ステップ12006〜12007を実行する。ステップ12006〜12007は、実施例1で説明した処理と殆ど同じである。ただし実施例3では、実ストレージAの重複排除スケジュール部4300’’はステップ12006で、実ストレージAで作成された消去候補と重複候補をフラッシュパッケージ230に送信することに加えて、他の実ストレージシステム100から受領した消去候補と重複候補もフラッシュパッケージ230に送信する。それ以外の点は実施例1で説明した処理と同じである。
なお、実施例3に係るフラッシュパッケージ230で実行される処理は実施例1で説明したものと同じであるため、フラッシュパッケージ230で実行される処理の説明は省略する。
以上が実施例3における仮想ストレージシステム1000で実行される処理の説明である。実施例3における仮想ストレージシステム1000では、上で述べた処理が行われることで、複数の実ストレージシステム100に跨った重複排除を可能にしている。
続いて実施例4の説明を行う。実施例4における情報システムのハードウェア構成は、実施例3における情報システムと同様であるので、図示は略す。また以下の説明では、実施例3に係る情報システムの構成物と同じ物を特定する際、実施例3で用いた参照番号を用いる。
実施例4に係る仮想ストレージシステムは、実施例3に係る仮想ストレージシステムと同様に、複数の実ストレージシステム100に跨った重複排除が行われる。ただし実施例4に係る仮想ストレージシステム(または実ストレージシステム)は、実施例3(または実施例1)に係るフラッシュパッケージで行われていた処理の一部を、ストレージコントローラ200が行う。
実施例1または3に係るフラッシュパッケージは、重複排除処理の可否を判定するプログラム(重複排除判定部12300)を有し、ストレージコントローラ200から送られてくる情報(リスト1、リスト2)をもとに、重複排除処理の可否の判定等を行っていた。一方、実施例4に係る仮想ストレージシステムは実施例2で説明したストレージシステムと同様、ストレージコントローラ200が重複排除処理の可否の判定を行う。そのため、ストレージコントローラ200が、実施例2で説明した重複排除判定部12300’と類似したプログラム(実施例4では、これを「重複排除判定部12300’’」と呼ぶ)を有する。逆に実施例4に係るフラッシュパッケージは、重複排除判定部12300を有さない。
実施例4に係るフラッシュパッケージ230は実施例2に係るフラッシュパッケージ230と同様、ハッシュインデックス情報3500を持たない。代わりに実施例4に係る仮想ストレージシステムでは、仮想ストレージシステム内の各実ストレージシステム100が、その共有メモリ220内にハッシュインデックス情報3500を有する。
また実施例4に係るフラッシュパッケージ230は、フラッシュパッケージグループ情報2300とハッシュ値格納情報2400を持っていなくて良い。一方実施例4に係る実ストレージシステム100は、共有メモリ220内にフラッシュパッケージグループ情報2300を有する。ただし実ストレージシステム100は、仮想ストレージシステム1000内の他の実ストレージシステム100が有するフラッシュパッケージグループ280のフラッシュパッケージグループ情報2300も保持する。
また実施例4に係る実ストレージシステム100は、実施例1等で述べたハッシュ値格納情報2400に代えて、ハッシュ値格納情報2400’を有する。ハッシュ値格納情報2400’のフォーマットについて、図44を用いて説明する。実施例1等で説明したハッシュ値格納情報2400には、各フラッシュパッケージ230が担当するハッシュ値の範囲についての情報が格納されていた。一方ハッシュ値格納情報2400’には、各実ストレージシステム100が担当するハッシュ値の範囲についての情報が格納される。
なお、「実ストレージシステム100が担当するハッシュ値」の意味(定義)は、「フラッシュパッケージが担当するハッシュ値」と同様である。たとえば実ストレージシステム#p(識別番号がpの実ストレージシステム100)が、ハッシュ値の範囲がa〜bの仮想セグメントについて、重複排除可否の判定を行う場合、「実ストレージシステム#pが担当するハッシュ値の範囲はa〜bと表現される。
ハッシュ値格納情報2400’は、ハッシュ範囲2401’と実ストレージシステムID2402’のセットを複数有する。ここでは、ハッシュ範囲2401’と実ストレージシステムID2402’のセットを、エクステント2410’と呼ぶ。たとえばあるエクステント2410’内のハッシュ範囲2401’に格納されているハッシュ値範囲がa〜bで、またそのエクステント2410’内の実ストレージシステムID2402’がpの場合、実ストレージシステム#pが担当するハッシュ値の範囲がa〜bであることを意味し、後述する重複排除可否の判定の際、実ストレージシステム#pは、ハッシュ値の範囲がa〜bの仮想セグメントについて重複排除可否の判定を行うことを意味する。またこの場合、実ストレージシステム#pが作成・管理するハッシュインデックス情報3500に格納されるハッシュ値の範囲は、a〜bになる。
ハッシュ値格納情報2400’は、仮想ストレージシステム1000内の全実ストレージシステム100の共有メモリ220に格納される情報である。また、各実ストレージシステム100が有するハッシュ値格納情報2400’の内容は同一である。
次に、実施例4に係るストレージコントローラ200が実行する処理の説明を行う。なお、実施例4に係るフラッシュパッケージは実施例2に係るフラッシュパッケージと同じものである。つまり実施例4に係るフラッシュパッケージは重複排除判定部12300を有さず、重複排除判定部12300を実行しない点だけが、実施例1または3におけるフラッシュパッケージと異なる。そのため、実施例4に係るフラッシュパッケージが実行する処理の説明は略す。
実施例4に係るストレージコントローラ200はそのメモリ270内に、少なくともリード処理実行部4000’、ライト要求受付部4100、ライトアフタ処理実行部4200、重複排除スケジュール部4300’’’、外部パッケージリード実行部4400、重複排除判定部12300’というプログラムを有する(図示は略す)。
リード処理実行部4000’と外部パッケージリード実行部4400はいずれも、実施例3で説明したものと同じである。またライト要求受付部4100、ライトアフタ処理実行部4200は、実施例1等で説明したものと同じである。重複排除判定部12300’は実施例2で説明したものと同じである。そのためここでは、これらについての説明は略す。
重複排除スケジュール部4300’’’の処理の流れを、図45を用いて説明する。ステップ12000とステップ12001は、図26のステップ12000〜ステップ12001と同じ処理であるので、ここでの説明は略す。
ステップ12002’:重複排除スケジュール部4300’’’はハッシュ値格納情報2400’を参照することで、リスト1とリスト2内の情報を、各実ストレージシステム100に送信すべき情報に分割する。ハッシュ値格納情報2400’を用いた、情報の分割方法の一例を以下に説明する。たとえばハッシュ値格納情報2400’の中に、実ストレージシステムID2402’が“f”、ハッシュ範囲2401’がa〜bであるエクステント2410’があった場合を想定する。この場合、リスト1のレコードの中で、(更新前)ハッシュ値3403がa〜bの範囲に含まれるレコードを抽出したものが、実ストレージシステム#fに送信すべき情報と決定される。リスト2内の各レコードについても同様の方法で、分割される。以下の説明では、リスト1内のレコードのうち、ステップ12002’において実ストレージシステム#fに送信すべきと判定されたレコードの集合を「リスト1−f」と表記する。同様に、リスト2内のレコードのうち実ストレージシステム#fに送信すべきと判定されたレコードの集合を「リスト2−f」と表記する。
ステップ12021’:重複排除スケジュール部4300’’’は、ステップ12002’で分割されたリスト1、リスト2のうち、他の実ストレージシステム100に送信すべきものを、他の実ストレージシステム100に送信する。この処理は、実施例3で説明した処理(ステップ12021)と同様である。なお、実施例3と同様、もしも他の実ストレージシステム100に送信すべき、分割されたリスト1(またはリスト2)がなかった場合には、重複排除スケジュール部4300’’’は無効値(NULL)の格納されたレコードを作成して、他の実ストレージシステム100に送信する。
ステップ12022’:重複排除スケジュール部4300’’’は、他の実ストレージシステム100から、分割されたリスト1及びリスト2を受領する。仮想ストレージシステム内の全実ストレージシステム100から、分割されたリスト1及びリスト2を受領すると、重複排除スケジュール部4300’’’は次にステップ12003’’を実行する。
ステップ12003’’:このステップで行われる処理は、実施例2で説明したステップ12003’と同様の処理である。ステップ12003’’では重複排除スケジュール部4300’’’は、自身が作成したリスト1、リスト2、及び他の実ストレージシステム100から受領したリスト1、リスト2を用いて、重複排除可否の判定を行う。この時、重複排除スケジュール部4300’’’は重複排除判定部12300’をコールすることで、重複排除可否の判定を行う。重複排除判定部12300’が行う処理の内容は、実施例2で説明したものと同じであるので、ここでの説明は略す。
ステップ12004〜ステップ12005は、実施例1で説明した処理(図26のステップ12004〜12005)と同じであるため、説明を略す。
ステップ12051,ステップ12052:この処理は、実施例3で説明したステップ12051及びステップ12052と同じであるため、ここでは説明を略す。
ステップ12052の後、重複排除スケジュール部4300’’’はステップ12006、ステップ12007を実行し、処理を終了する。ステップ12006、ステップ12007は、実施例1等で説明したものと同じであるため、説明を略す。以上が、重複排除スケジュール部4300’’’の処理の流れである。
以上、本発明の実施例を説明したが、これらは、本発明の説明のための例示であって、本発明の範囲をこれらの実施例にのみ限定する趣旨ではない。すなわち、本発明は、他の種々の形態でも実施する事が可能である。たとえば上で説明したいくつかの実施例では、フラッシュパッケージが重複排除処理などを行う機能を有する例を説明したが、フラッシュパッケージに代えてHDDをストレージシステムに搭載し、上の実施例でフラッシュパッケージが実施していた各処理をHDDが行うようにしてもよい。
また、上で説明したいくつかの実施例では、あるフラッシュパッケージが担当するハッシュ値は、そのフラッシュパッケージ内(ハッシュインデックス情報)にのみ格納される例が説明された。しかし別の実施形態として、可用性を高めるために、あるフラッシュパッケージに作成されたハッシュインデックス情報の複製が、別のフラッシュパッケージにも格納されるようにしてもよい。たとえばフラッシュパッケージAが、自身の管理するハッシュインデックス情報を更新するたびに、その更新情報をフラッシュパッケージBに送信し、フラッシュパッケージBに、フラッシュパッケージAの管理するハッシュインデックス情報の複製を格納するようにしてもよい。
また、上で説明した実施例では、すべてのデータを重複排除の対象とする前提で説明が行われた。しかしRAIDの冗長データのように重複排除できる確率が低いデータについては、重複排除の判定を行わない方が望ましいので、上で説明した実施例の処理をそのように変形してもよい。たとえばストレージコントローラ200が冗長データをフラッシュパッケージ230に書き込む際、重複排除の必要がない旨を示す情報(以下これを単に「フラグ」と呼ぶ)をライト要求に付加する。フラッシュパッケージ230は仮想ブロックグループ情報3200に、フラグを受け取った旨を格納する領域を、仮想セグメントごとに用意しておく。フラッシュパッケージ230はライト要求受領時にフラグを受領すると、フラグを仮想ブロックグループ情報3200内の仮想セグメント管理情報に記録し、またステップ14001の実行時にデータのハッシュ値の計算を行わなくて良い。そして重複排除判定部12300、重複排除実行部12400は、フラグが格納された仮想セグメントについては、重複排除の判定等を行わないようにすればよい。
100:ストレージシステム, 110:ホスト, 120:ストレージエリアネットワーク(SAN), 200:ストレージコントローラ, 210:キャッシュメモリ, 220:共有メモリ, 230:フラッシュパッケージ, 250:接続装置, 260:プロセッサ, 270:メモリ, 280:フラッシュパッケージグループ, 300:フラッシュチップ, 310:パッケージプロセッサ, 320:パッケージメモリ, 330:バッファ, 340:パッケージバス, 350:パッケージバス転送装置, 370:ハッシュ回路, 2000:論理ボリューム情報, 2100:実ページ情報, 2300:フラッシュパッケージグループ情報, 2400:ハッシュ値格納情報, 2500:フラッシュパッケージ情報, 3000:パッケージ情報, 3100:チップ情報, 3200:仮想ブロックグループ情報, 3300:実ブロック情報, 3400:履歴情報, 3500:ハッシュインデックス情報, 3600:空き実ブロック情報ポインタ, 4000:リード処理実行部, 4100:ライト要求受付部, 4200:ライトアフタ処理実行部, 4300:重複排除スケジュール部, 12100:データライト処理実行部, 12200:履歴情報送信部, 12300:重複排除判定部, 12400:重複排除実行部, 12500:ハッシュ指定型リード実行部, 12600:データリード処理実行部

Claims (15)

  1. 複数の不揮発性記憶媒体を有する複数のフラッシュパッケージと、
    ホストと前記フラッシュパッケージとの間でリード・ライト処理を実行するストレージコントローラを有するストレージシステムであって、
    前記ストレージシステムは、前記複数のフラッシュパッケージのうち第1フラッシュパッケージの第1アドレスに、前記複数のフラッシュパッケージのうち第2フラッシュパッケージの第2アドレスに書き込まれているデータと同一データが書き込まれている場合に、前記第1フラッシュパッケージに、前記第1アドレスに対応付けて前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを記憶させるよう、構成されており、
    前記フラッシュパッケージは、同じアドレスに、その特徴量が異なる複数のデータを格納可能であり、
    前記第1フラッシュパッケージは、前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを前記第1アドレスに対応付けて記憶している場合、前記ストレージコントローラから前記第1アドレスに対するリード要求を受領したことに応じて、前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを前記ストレージコントローラに返送し、
    前記ストレージコントローラは前記第1フラッシュパッケージから前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを受領すると、前記第2フラッシュパッケージに前記第2アドレスと前記特徴量とを含むリード要求を発行し、前記第2フラッシュパッケージから前記第2アドレスに記憶されその特徴量が前記第1アドレスにかかるデータの特徴量と一致するリード対象データを受領する、
    ことを特徴とするストレージシステム。
  2. 前記フラッシュパッケージは、
    前記ストレージコントローラからライトデータのライト要求を受領すると、
    前記ライトデータの特徴量を算出し、
    前記ライト要求に含まれる前記フラッシュパッケージのアドレスと、前記ライトデータの特徴量と、前記ライトデータの更新前データの特徴量を含む履歴情報を作成し、
    前記ライトデータを前記不揮発性記憶媒体に格納し、
    前記履歴情報を前記ストレージコントローラに送信し、
    前記ストレージコントローラは、
    受領した前記履歴情報に含まれる前記更新前データの特徴量を他のフラッシュパッケージに送信してその返信を受け取り前記ライト要求の対象のフラッシュパッケージに転送することで前記更新前データの特徴量と同一の特徴量を持つデータが他の前記複数のフラッシュパッケージに格納されていない場合には前記ライト要求の対象のフラッシュパッケージが前記更新前データを削除し、格納されている場合には前記ライト要求の対象のフラッシュパッケージが前記更新前データを残すように制御する
    ことを特徴とする、請求項1に記載のストレージシステム。
  3. 前記ストレージコントローラは、
    受領した前記履歴情報に含まれる前記ライトデータの特徴量を他のフラッシュパッケージに送信してその返信を受け取り前記ライト要求の対象のフラッシュパッケージに転送することで前記ライトデータの特徴量と同一の特徴量を持つデータが他の前記複数のフラッシュパッケージに格納されている場合には前記ライト要求の対象のフラッシュパッケージがライト要求の対象である第1アドレスに対応付けて前記ライトデータの特徴量と同一の特徴量を持つデータが格納されている第2アドレスと、前記ライトデータの特徴量とを格納するように制御する
    ことを特徴とする、請求項2に記載のストレージシステム。
  4. 前記ストレージコントローラは、
    前記複数のフラッシュパッケージから、前記フラッシュパッケージが受け付けたライト要求の履歴情報を受領し、
    受領した前記履歴情報に基づいて、前記複数のフラッシュパッケージの複数の領域に同一のデータが書き込まれていることを検出する、
    ことを特徴とする、請求項1に記載のストレージシステム。
  5. 前記履歴情報は、前記ストレージコントローラからライト要求のあった前記フラッシュパッケージのアドレスと、前記ライト要求で指定されたライトデータの特徴量を含み、
    前記ストレージコントローラは、
    前記第1フラッシュパッケージで作成された前記履歴情報に含まれる前記特徴量と、前記第2フラッシュパッケージに格納されているデータの特徴量が同一の場合、前記第2フラッシュパッケージに前記第1フラッシュパッケージと同一データが書き込まれていると判定する、
    ことを特徴とする、請求項4に記載のストレージシステム。
  6. 前記複数のフラッシュパッケージはそれぞれ、あらかじめ定められた範囲の値の前記特徴量及び前記特徴量を持つデータの格納された前記フラッシュパッケージのアドレスの情報を管理するよう構成されており、
    前記履歴情報を受領した前記ストレージコントローラは、前記複数のフラッシュパッケージの中から、前記履歴情報に含まれる特徴量を管理する前記フラッシュパッケージを特定し、前記特定されたフラッシュパッケージに前記履歴情報を送信し、
    前記履歴情報を受領した前記フラッシュパッケージは、
    前記履歴情報に含まれる前記ライトデータの特徴量と同一の特徴量を持つデータが前記複数のフラッシュパッケージのいずれかに格納されているかどうか応答し、
    前記第2フラッシュパッケージが、前記第2アドレスに前記ライトデータの特徴量と同一の特徴量を持つデータを格納していると応答する場合、前記ストレージコントローラを介して前記第1フラッシュパッケージに対し、前記第2アドレスを前記第1アドレスに対応付けて送信する、
    ことを特徴とする、請求項3に記載のストレージシステム。
  7. 前記第1フラッシュパッケージと前記第2フラッシュパッケージは、同一RAIDグループに属しており、
    前記履歴情報を受領した前記フラッシュパッケージは、
    前記ライトデータの書き込まれた前記第1フラッシュパッケージのアドレスと、前記ライトデータの特徴量と同一の特徴量を持つデータの格納されている前記第2フラッシュパッケージのアドレスとが同一である時、
    前記第1フラッシュパッケージに、前記同一データの格納されている前記第2フラッシュパッケージ内のアドレスを送信しない、
    ことを特徴とする、請求項6に記載のストレージシステム。
  8. 前記ストレージシステムは、前記ストレージコントローラ及び前記ストレージコントローラに接続された複数の前記フラッシュパッケージを含む実ストレージシステムを複数有し、
    前記第1フラッシュパッケージは、複数の前記実ストレージシステムのうち第1実ストレージシステム内の第1ストレージコントローラに接続され、前記第2フラッシュパッケージは、複数の前記実ストレージシステムのうち第2実ストレージシステム内の第2ストレージコントローラに接続されており、
    前記第1フラッシュパッケージは、前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを前記第1アドレスに対応付けて記憶している場合、前記第1ストレージコントローラから前記第1アドレスに対するリード要求を受領したことに応じて、前記第1ストレージコントローラに前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを返送し、
    前記第1ストレージコントローラは前記第1フラッシュパッケージから前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを受領すると、前記第2ストレージコントローラに対して、前記第2フラッシュパッケージからデータをリードする前記第2アドレスと前記特徴量とを含む要求を発行し、
    前記第2ストレージコントローラは、前記第2フラッシュパッケージから前記第2アドレスに記憶されその特徴量が前記第1アドレスにかかるデータの特徴量と一致するリード対象データを読み出した後、前記第1ストレージコントローラに返送する、
    ことを特徴とする、請求項5に記載のストレージシステム。
  9. 複数の前記ストレージコントローラはそれぞれ、あらかじめ定められた範囲の値の前記特徴量及び前記特徴量を持つデータの格納された前記フラッシュパッケージのアドレスの情報を管理するよう構成されており、
    前記第1フラッシュパッケージは、
    前記ライト要求と前記ライトデータを受領すると、
    受領した前記ライトデータの特徴量を算出し、
    前記ライトデータのライト先アドレスと前記特徴量を含む前記履歴情報を作成して、前記第1ストレージコントローラに送信し、
    前記第1ストレージコントローラは、
    前記履歴情報に含まれる特徴量を管理する前記ストレージコントローラが前記第2ストレージコントローラであった場合、前記第2ストレージコントローラに前記履歴情報を送信し、
    前記履歴情報を受領した前記第2ストレージコントローラは、
    前記履歴情報に含まれる前記ライトデータの特徴量と同一の特徴量を持つデータが前記複数のフラッシュパッケージのいずれかに格納されているかどうか判定する、
    ことを特徴とする、請求項8に記載のストレージシステム。
  10. 前記ストレージシステムは、前記ストレージコントローラ及び前記ストレージコントローラに接続された複数の前記フラッシュパッケージを含む実ストレージシステムを複数有し、
    前記第1フラッシュパッケージは、複数の前記実ストレージシステムのうち第1実ストレージシステム内の第1ストレージコントローラに接続され、前記第2フラッシュパッケージは、複数の前記実ストレージシステムのうち第2実ストレージシステム内の第2ストレージコントローラに接続されており、
    前記第1フラッシュパッケージは、前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを前記第1アドレスに対応付けて記憶している場合、前記第1ストレージコントローラから前記第1アドレスに対するリード要求を受領したことに応じて、前記第1ストレージコントローラに前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを返送し、
    前記第1ストレージコントローラは前記第1フラッシュパッケージから前記第2アドレスと前記第1アドレスにかかるデータの特徴量とを受領すると、前記第2ストレージコントローラに対して、前記第2フラッシュパッケージからデータをリードする前記第2アドレスと前記特徴量とを含む要求を発行し、
    前記第2ストレージコントローラは、前記第2フラッシュパッケージから前記第2アドレスに記憶されその特徴量が前記第1アドレスにかかるデータの特徴量と一致するリード対象データを読み出した後、前記第1ストレージコントローラに返送する、
    ことを特徴とする、請求項3に記載のストレージシステム。
  11. 前記複数のフラッシュパッケージはそれぞれ、あらかじめ定められた範囲の値の前記特徴量及び前記特徴量を持つデータの格納された前記フラッシュパッケージのアドレスの情報を管理するよう構成されており、
    前記第1フラッシュパッケージは、
    前記ライト要求と前記ライトデータを受領すると、
    受領した前記ライトデータの特徴量を算出し、
    前記ライトデータのライト先アドレスと前記特徴量を含む前記履歴情報を作成して、前記第1ストレージコントローラに送信し、
    前記履歴情報を受領した前記第1ストレージコントローラは、
    前記履歴情報に含まれる特徴量を管理する前記フラッシュパッケージが、前記第2ストレージコントローラに接続されている場合、前記第2ストレージコントローラに前記履歴情報を送信し、
    前記履歴情報を受領した前記第2ストレージコントローラが、
    前記履歴情報に含まれる特徴量を管理する前記フラッシュパッケージに前記履歴情報を送信する、
    ことを特徴とする、請求項10に記載のストレージシステム。
  12. ホストからのデータアクセス要求を処理するストレージコントローラに接続されるフラッシュパッケージであって、
    前記フラッシュパッケージは、あらかじめ定められた範囲の値の特徴量及び前記特徴量を持つデータの格納された前記フラッシュパッケージのアドレスの情報を管理するよう構成されており、
    前記フラッシュパッケージは、前記ストレージコントローラからライト要求とライトデータを受領すると、
    受領した前記ライトデータの特徴量を算出し、
    前記ライトデータのライト先アドレスと前記特徴量を含む履歴情報を作成して前記ストレージコントローラに送信し、
    前記フラッシュパッケージはまた、前記ストレージコントローラから、前記フラッシュパッケージが管理する範囲に含まれる前記特徴量を有する前記履歴情報を受領すると、
    前記履歴情報に基づいて、前記ストレージコントローラに接続される複数の前記フラッシュパッケージのうち、第1フラッシュパッケージに書き込まれたライトデータと同一データを有する前記フラッシュパッケージが存在するか応答し、
    前記複数のフラッシュパッケージのうち第2フラッシュパッケージが、前記ライトデータと同一データを有すると応答する場合、前記ストレージコントローラを介して、前記第1フラッシュパッケージに前記同一データの格納されている前記第2フラッシュパッケージ内のアドレスを前記ライトデータのライト先アドレスに対応付けて送信する、
    ことを特徴とするフラッシュパッケージ。
  13. 前記フラッシュパッケージは、前記ストレージコントローラにボリュームを提供し、
    前記ストレージコントローラから、前記ボリューム上のアドレスに書き込まれたライトデータと同一データを有する、前記複数のフラッシュパッケージのうち第3フラッシュパッケージ内のアドレスを、前記フラッシュパッケージ内の前記ライトデータのライト先アドレスに対応付けて送信された場合に、前記ライト先アドレスに対応付けて、前記第3フラッシュパッケージ内のアドレスと、前記ライト先アドレスにかかるデータの特徴量とを記憶し、
    その後、前記ボリューム上のアドレスに対するリード要求を受領すると、
    前記第3フラッシュパッケージのアドレスと前記ライト先アドレスにかかるデータの特徴量を、前記ストレージコントローラに返送する、
    ことを特徴とする、請求項12に記載のフラッシュパッケージ。
  14. 前記フラッシュパッケージは、前記ストレージコントローラから前記履歴情報を受領すると、
    前記履歴情報に含まれる前記特徴量と、前記あらかじめ定められた範囲の値の特徴量及び前記特徴量を持つデータの格納された前記フラッシュパッケージのアドレスを含む情報に含まれる前記第2フラッシュパッケージに格納されているデータの特徴量が同一の場合、前記第2フラッシュパッケージが前記ライトデータと同一データを有すると応答する、
    ことを特徴とする、請求項12に記載のフラッシュパッケージ。
  15. 前記フラッシュパッケージは、前記ストレージコントローラから前記ライト要求と前記ライトデータを受領すると、前記ライトデータから前記ライトデータの特徴量を算出し、
    前記ライト要求に含まれる前記フラッシュパッケージのアドレスと、前記ライトデータの特徴量と、前記ライトデータの更新前データの特徴量を含む前記履歴情報を作成する、
    ことを特徴とする、請求項12に記載のフラッシュパッケージ。
JP2017546459A 2015-10-19 2016-09-21 ストレージシステム Active JP6677740B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
PCT/JP2015/079395 WO2017068617A1 (ja) 2015-10-19 2015-10-19 ストレージシステム
JPPCT/JP2015/079395 2015-10-19
PCT/JP2016/077807 WO2017068904A1 (ja) 2015-10-19 2016-09-21 ストレージシステム

Publications (2)

Publication Number Publication Date
JPWO2017068904A1 JPWO2017068904A1 (ja) 2018-07-05
JP6677740B2 true JP6677740B2 (ja) 2020-04-08

Family

ID=58556823

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017546459A Active JP6677740B2 (ja) 2015-10-19 2016-09-21 ストレージシステム

Country Status (4)

Country Link
US (1) US10503424B2 (ja)
JP (1) JP6677740B2 (ja)
CN (1) CN107924291B (ja)
WO (2) WO2017068617A1 (ja)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2018181213A (ja) * 2017-04-20 2018-11-15 富士通株式会社 ストレージ制御装置、ストレージ制御方法及びストレージ制御プログラム
CN107357687A (zh) * 2017-07-21 2017-11-17 长沙曙通信息科技有限公司 一种容灾备份新型重复数据删除实现方法
CN109491598A (zh) * 2018-10-19 2019-03-19 浪潮电子信息产业股份有限公司 一种逻辑卷的删除方法和装置
JP2020086477A (ja) * 2018-11-15 2020-06-04 株式会社日立製作所 大規模ストレージシステム及び大規模ストレージシステムにおけるデータ配置方法
CN109739776B (zh) * 2018-12-06 2023-06-30 天津津航计算技术研究所 用于NAND Flash主控芯片的Greedy垃圾回收系统
CN109710541B (zh) * 2018-12-06 2023-06-09 天津津航计算技术研究所 针对NAND Flash主控芯片Greedy垃圾回收的优化方法
KR102231722B1 (ko) * 2019-03-28 2021-03-25 네이버클라우드 주식회사 취약점 중복판단방법 및 이를 이용하는 진단장치
US12014052B2 (en) * 2021-03-22 2024-06-18 Google Llc Cooperative storage architecture
CN114063931B (zh) * 2021-11-26 2023-04-25 重庆科创职业学院 一种基于大数据的数据存储方法
US20230267003A1 (en) * 2022-02-23 2023-08-24 International Business Machines Corporation Padding input data for artificial intelligence accelerators

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5026213B2 (ja) * 2007-09-28 2012-09-12 株式会社日立製作所 ストレージ装置及びデータ重複排除方法
US7992037B2 (en) * 2008-09-11 2011-08-02 Nec Laboratories America, Inc. Scalable secondary storage systems and methods
US9256368B2 (en) * 2010-09-30 2016-02-09 Nec Corporation System and method for deduplication of distributed data
EP2652587B1 (en) 2011-06-07 2017-11-15 Hitachi, Ltd. Storage system comprising flash memory, and storage control method
KR101826047B1 (ko) * 2011-09-28 2018-02-07 삼성전자주식회사 저장 장치 및 그 구동 방법
WO2013095381A1 (en) * 2011-12-20 2013-06-27 Intel Corporation Method and system for data de-duplication
JP6021680B2 (ja) 2013-02-19 2016-11-09 株式会社日立製作所 自律分散重複排除ファイルシステム、記憶装置ユニット及びデータアクセス方法
US20140281155A1 (en) 2013-03-14 2014-09-18 Lsi Corporation Storage device assisted data de-duplication
CN104598161B (zh) * 2013-10-31 2018-10-30 腾讯科技(深圳)有限公司 数据读取、写入方法和装置及数据存储结构
US20150317083A1 (en) * 2014-05-05 2015-11-05 Virtium Technology, Inc. Synergetic deduplication
US10013169B2 (en) * 2014-12-19 2018-07-03 International Business Machines Corporation Cooperative data deduplication in a solid state storage array
US9626121B2 (en) * 2014-12-19 2017-04-18 International Business Machines Corporation De-duplication as part of other routinely performed processes
CN104503705B (zh) * 2014-12-22 2017-08-08 吴剀劼 利用闪存设备构建可信存储系统的方法及构建的可信存储系统

Also Published As

Publication number Publication date
WO2017068617A1 (ja) 2017-04-27
WO2017068904A1 (ja) 2017-04-27
US20180253252A1 (en) 2018-09-06
JPWO2017068904A1 (ja) 2018-07-05
CN107924291A (zh) 2018-04-17
CN107924291B (zh) 2020-10-09
US10503424B2 (en) 2019-12-10

Similar Documents

Publication Publication Date Title
JP6677740B2 (ja) ストレージシステム
US20180173632A1 (en) Storage device and method for controlling storage device
US9606914B2 (en) Apparatus, system, and method for allocating storage
US9442844B2 (en) Apparatus, system, and method for a storage layer
US9323465B2 (en) Systems and methods for persistent atomic storage operations
US9563555B2 (en) Systems and methods for storage allocation
US10089033B2 (en) Storage system
JP6429963B2 (ja) ストレージ装置及びストレージ装置の制御方法
WO2018029820A1 (ja) 計算機システム
WO2016056104A1 (ja) ストレージ装置、及び、記憶制御方法
US11079956B2 (en) Storage system and storage control method
JP6817340B2 (ja) 計算機
WO2018051446A1 (ja) オプショナルなデータ処理機能を有するストレージシステムを含んだ計算機システム、および、記憶制御方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180314

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190528

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20190723

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190823

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20200128

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20200217

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20200303

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20200313

R150 Certificate of patent or registration of utility model

Ref document number: 6677740

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150