【実施例】
【0012】
まず、重複除去について説明する。
図1は、重複除去を説明するための図である。
図1は、サーバX〜サーバZが記憶するデータをストレージ装置にバックアップする場合を示す。各サーバが記憶するデータは、ブロックに分割され、内容の同じブロックがあれば、ストレージ装置は1個所にのみデータを記憶する。
【0013】
図1では、サーバXが記憶するデータは、A〜Eのブロックに分割され、サーバYが記憶するデータは、A、B、D、E、Fに分割され、サーバZが記憶するデータは、A〜D、Gのブロックに分割される。A、B、Dは各サーバに記憶され重複するため、ストレージ装置はA、B、Dを1個所にだけ記憶する。C、Eは2つのサーバZに記憶され重複するため、ストレージ装置はC、Eを1個所にだけ記憶する。
【0014】
このように、重複除去を行うことによって、ストレージ装置のデータ容量を削減することができる。なお、
図1では、複数のサーバのデータをバックアップする場合について説明したが、ストレージ装置は、1台のサーバのデータを重複除去してもよい。また、ストレージ装置は、サーバ以外の装置のデータを重複除去してもよい。
【0015】
次に、実施例に係る情報処理システムの構成について説明する。
図2は、実施例に係る情報処理システムの構成を示す図である。
図2に示すように、情報処理システム1は、ストレージ装置2とクライアント3を有する。
【0016】
ストレージ装置2は、データを記憶する装置であり、磁気ディスクにデータを記憶する。なお、ストレージ装置2は、NANDフラッシュメモリ等の他の不揮発性記憶媒体にデータを記憶してもよい。
【0017】
クライアント3は、ストレージ装置2にデータを格納する装置であり、例えばサーバである。なお、
図2では、説明の便宜上、1台のクライアント3のみを示したが、ストレージ装置2は、複数のクライアント3のデータを格納してもよい。
【0018】
ストレージ装置2は、データ記憶部10とストレージ制御部20とを有する。データ記憶部10は、クライアント3が利用するデータを記憶するとともに、データの管理に用いられる情報を記憶する。
【0019】
ストレージ制御部20は、ストレージ装置2の制御を行う。ストレージ制御部20は、書込部21と、世代交代部22と、現在情報記憶部23と、過去情報記憶部24と、GC部25とを有する。
【0020】
書込部21は、クライアント3からの指示に基づいてデータ記憶部10にデータを書き込む。
図3は、書込部21による書き込み処理を説明するための図である。書込部21は、データを所定の大きさの書込ブロックに分割してデータ記憶部10に書き込む。
【0021】
書込部21は、書込ブロックのデータからハッシュ値を計算し、計算したハッシュ値がtop−kカウンタ31に登録されていれば、top−kカウンタ31のカウンタを1増加させる。
【0022】
top−kカウンタ31は、ハッシュ値とカウンタを対応付けるテーブルである。ハッシュ値は、ブロックのデータにハッシュ関数を適用して計算される値である。カウンタは、対応するハッシュ値がハッシュ関数を適用して計算されるデータがデータ記憶部10に書き込まれた数である。書き込まれたデータは使用されなくなる場合がある。したがって、カウンタは、ハッシュ値がハッシュ関数を適用して計算されるデータがデータ記憶部10にある数を示すものではない。top−kカウンタ31は、カウンタの値が大きい方からk個のエントリを有する。
【0023】
書込部21は、カウンタの値が閾値を超えると重複除去処理を行う。すなわち、データ記憶部10には、データが同じブロックが閾値の数まで記憶される。なお、以下では、top−kカウンタ31に登録され、カウンタの値が閾値を超えているハッシュ値を、重複除去中のハッシュ値と呼ぶ。
【0024】
重複処理が行われたブロックは、ディスク領域の重複データ領域43に記憶され、重複処理が行われていないブロックは、ディスク領域の通常データ領域42に記憶される。ブロックのアドレスに重複データ領域43へのポインタ又は通常データ領域42へのポインタを対応付けるポインタ領域41を介してブロックはアクセスされる。ポインタの値は、ブロックのデータのハッシュ値に基づく値である。ポインタ領域41はディスク領域に含まれる。ディスク領域は磁気ディスクの領域である。
【0025】
書込部21は、ブルームフィルタ(BF:Bloom Filter)32に重複除去したブロックのアドレスを登録する。
図4は、ブルームフィルタ32を説明するための図である。ブルームフィルタ32は、空間効率の良い確率的データ構造であり、要素が集合のメンバーであるかどうかのテストに使われる。
【0026】
ブルームフィルタ32は、偽陽性による誤検出の可能性があるが偽陰性はない、要素を集合に追加することができるが削除することはできない、集合に要素が追加されればされるほど偽陽性の可能性が高くなるという特性を有する。ここで、偽陽性とは、要素が集合のメンバーでないのにメンバーであると判定することであり、偽陰性とは、要素が集合のメンバーであるのにメンバーでないと判定することである。
【0027】
ブルームフィルタ32はm(mは正の整数)ビットの配列であり、全ビットの初期値は0である。ブルームフィルタ32は、i(iは正の整数)個のハッシュ関数とともに用いられる。各ハッシュ関数は、キー値をm個の配列位置にマッピングする。
【0028】
重複除去したブロックのアドレスをブルームフィルタ32に登録する場合には、書込部21は、アドレスをi個のハッシュ関数に入力して、i個の配列位置を得て、ブルームフィルタ32のi個の配列位置のビットを1にする。
図4では、アドレスx、y、zに対してそれぞれ3つのハッシュ関数を用いて計算された配列位置のビットが1にセットされている。
【0029】
ブロックのアドレスがブルームフィルタ32に登録されているかを調べるために、後述するGC部25は、アドレスをi個のハッシュ関数に入力して、i個の配列位置を得る。そして、GC部25は、i個の配列位置のビット群の1つでも0である場合、アドレスがブルームフィルタ32に登録されていない、すなわち、ブロックに重複除去処理が行われていないと判定する。
【0030】
一方、i個の配列位置の全ビットが1である場合、GC部25は、アドレスがブルームフィルタ32に登録されているか、i個のビットは他のアドレスを登録した時に偶然全部1になった(偽陽性)と判定する。すなわち、i個の配列位置の全ビットが1である場合、GC部25は、ブロックに重複除去処理が行われている可能性が高いと判定する。
図4では、wは偽陽性の場合を示す。
【0031】
なお、top−kカウンタ31及びブルームフィルタ32はメインメモリに記憶される。したがって、top−kカウンタ31及びブルームフィルタ32の参照は、ディスク領域の参照に較べて高速に行うことができる。
【0032】
図2に戻って、世代交代部22は、定期的もしくはtop−kカウンタ31の状況に応じて世代交代を行う。ここで、世代交代とは、top−kカウンタ31の更新を行うことである。データが重複するブロックは時間とともに変化するが、top−kカウンタ31は上位k個のエントリしかなく、過去のデータの重複の影響を受け易い。このため、定期的もしくはtop−kカウンタ31の状況に応じて、世代交代部22は、top−kカウンタ31を更新する。
【0033】
図5は、世代交代を説明するための図である。
図5では、世代交代前の旧世代のtop−kカウンタ31はtop−kカウンタ31aで表され、旧世代のブルームフィルタ32はブルームフィルタ32aで表される。また、世代交代後の新世代のtop−kカウンタ31はtop−kカウンタ31bで表され、新世代のブルームフィルタ32はブルームフィルタ32bで表される。
【0034】
図5に示すように、世代交代部22は、旧世代のtop−kカウンタ31a及びブルームフィルタ32aと過去領域33のマージと、新世代のデータ準備を行う。過去領域33は、過去に重複除去が行われたブロックのハッシュ値を記憶するハッシュ値領域31cと、過去に重複除去が行われたブロックのアドレスが登録されたブルームフィルタ32cを有する。
【0035】
旧世代のtop−kカウンタ31a及びブルームフィルタ32aと過去領域33のマージでは、世代交代部22は、top−kカウンタ31aに含まれるハッシュ値のうちハッシュ値領域31cに含まれないハッシュ値をハッシュ値領域31cに追加する。また、世代交代部22は、ブルームフィルタ32aとブルームフィルタ32cの論理和(OR)をとってブルームフィルタ32cの値とする。
【0036】
新世代のデータ準備では、世代交代部22は、top−kカウンタ31aの状態を基にtop−kカウンタ31bを準備する。例えば、世代交代部22は、top−kカウンタ31aのカウンタの値を1/2にしてtop−kカウンタ31bを準備する。また、世代交代部22は、全ビットが0であるブルームフィルタ32bを準備する。
【0037】
現在情報記憶部23は、現在の世代のtop−kカウンタ31及びブルームフィルタ32を記憶する。過去情報記憶部24は、過去領域33を記憶する。すなわち、過去情報記憶部24は、ハッシュ値領域31cとブルームフィルタ32cを記憶する。
【0038】
GC部25は、重複処理が行われたブロックのデータ領域のうち、データの書き換え等により使用されなくなったデータ領域を特定して回収する。
図6は、GC部25によるGCを説明するための図である。
図6に示すように、GC部25は、過去領域33を一時領域34にコピーして、過去領域33をクリアする。
【0039】
そして、GC部25は、ディスク領域の各ブロックのアドレスが一時領域34のブルームフィルタ32dに登録されているか否かを判定する。そして、登録されている場合には、ブロックが重複除去されている可能性があるので、GC部25は、磁気ディスクにアクセスして、ブロックが重複除去されているか否かをチェックする。
【0040】
具体的には、GC部25は、磁気ディスクからポインタ領域41を読み出し、ブロックのアドレスに対応するポインタが通常データ領域42を指すか重複データ領域43を指すかに基づいて、ブロックが重複除去されているか否かをチェックする。なお、ブロックのデータを記憶するデータ領域が、通常データ領域42と重複データ領域43に分けられない場合には、GC部25は、ポインタ領域41に重複除去されているか否かを示すフラグを設けることで、ブロックが重複除去されているか否かをチェックする。
【0041】
そして、ブロックが重複除去されている場合には、GC部25は、ブロックのアドレスを過去領域33のブルームフィルタ32cにセットするとともに、ブロックのデータのハッシュ値が過去領域33のハッシュ値領域31cにあるか否かを判定する。そして、ブロックのデータのハッシュ値が過去領域33のハッシュ値領域31cにない場合には、GC部25は、ブロックのデータのハッシュ値をハッシュ値領域31cに追加する。
【0042】
すなわち、GC部25は、現時点で重複除去されているブロックのアドレスを過去領域33のブルームフィルタ32cに登録するとともに、現時点で重複除去されているブロックのハッシュ値を過去領域33のハッシュ値領域31cに追加する。
【0043】
そして、全ディスク領域について処理が終了すると、GC部25は、一時領域34にはあるが過去領域33にはないハッシュ値すなわち使用されていない可能性があるデータ領域を特定する。そして、GC部25は、ハッシュ値がtop−kカウンタ31に含まれているか否かすなわち重複除去中のハッシュ値であるか否かを判定し、top−kカウンタ31に含まれていない場合には、使用されていないデータ領域として特定し、回収する。
【0044】
GC部25は、現時点情報生成部25aと特定部25bを有する。現時点情報生成部25aは、現時点で重複除去されているブロックのアドレスを過去領域33のブルームフィルタ32cに登録するとともに、現時点で重複除去されているブロックのハッシュ値を過去領域33のハッシュ値領域31cに登録する。特定部25bは、使用されていないデータ領域を特定して、回収する。
【0045】
次に、書込部21による書き込み処理のフローについて説明する。
図7は、書込部21による書き込み処理のフローを示すフローチャートである。なお、
図7は、1つのブロックをデータ記憶部10に書き込む場合の処理を示す。
【0046】
図7に示すように、書込部21は、書込ブロックのデータのハッシュ値を計算し(ステップS1)、計算したハッシュ値がtop−kカウンタ31に存在するか否かを判定する(ステップS2)。そして、計算したハッシュ値がtop−kカウンタ31に存在する場合には、書込部21は、当該ハッシュ値に対応するカウンタをカウントアップする(ステップS3)。
【0047】
そして、書込部21は、カウンタの値が閾値を超えているか否かを判定する(ステップS4)。そして、カウンタの値が閾値を超えている場合には、書込部21は、書込ブロックのアドレスのハッシュ値を計算してブルームフィルタ32に登録し(ステップS5)、重複データとして書き込む(ステップS6)。
【0048】
一方、カウンタの値が閾値を超えていない場合、あるいは、計算したハッシュ値がtop−kカウンタ31に存在しない場合は、書込部21は、非重複データとして書き込む(ステップS7)。
【0049】
このように、書込部21が重複除去されるブロックのアドレスをブルームフィルタ32に登録することで、GC部25は使用されていない可能性が高いデータ領域を磁気ディスクにアクセスすることなくブルームフィルタ32を用いて効率良く見つけることができる。
【0050】
次に、世代交代部22による世代交代処理のフローについて説明する。
図8は、世代交代部22による世代交代処理のフローを示すフローチャートである。
図8に示すように、世代交代部22は、過去領域33のハッシュ値に重複除去対象のハッシュ値をマージする(ステップS11)。
【0051】
ここで、重複除去対象のハッシュ値とは、
図5に示した旧世代のtop−kカウンタ31aに含まれるハッシュ値である。また、マージするとは、top−kカウンタ31aに含まれるハッシュ値のうち、過去領域33に存在しないハッシュ値を過去領域33に追加することである。
【0052】
そして、世代交代部22は、過去領域33のブルームフィルタ32cに重複除去対象のブルームフィルタ32aをマージする(ステップS12)。すなわち、世代交代部22は、ブルームフィルタ32cとブルームフィルタ32aのビット毎のORをとり、ブルームフィルタ32cに格納する。
【0053】
そして、世代交代部22は、重複除去対象のtop−kカウンタ31aを調整し(ステップS13)、新世代のtop−kカウンタ31bとする。ここで、調整するとは、例えばカウンタの値を1/2にすることである。そして、世代交代部22は、重複除去対象のブルームフィルタ32aをクリアし(ステップS14)、新世代のブルームフィルタ32bとする。
【0054】
このように、世代交代部22がtop−kカウンタ31aを調整することによって、ストレージ装置2は重複するデータの時間変化に対応することができる。
【0055】
次に、GC部25によるGC処理のフローについて説明する。
図9は、GC部25によるGC処理のフローを示すフローチャートである。
図9に示すように、GC部25は、過去領域33を一時領域34にコピーして過去領域33をクリアする(ステップS21)。
【0056】
そして、GC部25は、ディスク領域の全ブロックに対してステップS21〜ステップS28の処理を行う。すなわち、GC部25は、ブロックのアドレスのハッシュ値を計算し(ステップS22)、ブルームフィルタ32にヒットするか否かを判定する(ステップS23)。そして、ブルームフィルタ32にヒットしない場合には、GC部25は、次のブロックを処理する。
【0057】
一方、ブルームフィルタ32にヒットした場合には、GC部25は、該当アドレスが重複除去されているか否かを判定し(ステップS24)、該当アドレスが重複除去されていない場合には、次のブロックを処理する。
【0058】
一方、該当アドレスが重複除去されている場合には、GC部25は、アドレスを過去領域33のブルームフィルタ32cに登録し(ステップS25)、データのハッシュ値を計算する(ステップS26)。そして、GC部25は、ハッシュ値が過去領域33に存在するか否かを判定し(ステップS27)、存在する場合には、次のブロックを処理する。一方、データのハッシュ値が過去領域33に存在しない場合には、GC部25は、ハッシュ値を過去領域33に追加し(ステップS28)、次のブロックを処理する。
【0059】
そして、GC部25は、ディスク領域の全ブロックに対して処理を完了すると、一時領域34にはあるが過去領域33にないハッシュ値に対して、ステップS29〜ステップS30の処理を行う。すなわち、GC部25は、一時領域34にはあるが過去領域33にないハッシュ値が重複除去中のハッシュ値に含まれるか否かを判定し(ステップS29)、含まれる場合には、次のハッシュ値を処理する。一方、重複除去中のハッシュ値に含まない場合には、GC部25は、該当領域を回収する(ステップS30)。ここで、該当領域とは、ハッシュ値に対応付けられたデータ領域である。
【0060】
そして、GC部25は、一時領域34にはあるが過去領域33にないハッシュ値の全てに対して処理を終了すると、GC処理を終了する。
【0061】
このように、GC部25は、過去領域33のブルームフィルタ32を用いて過去に重複除去の対象となった可能性の高いブロックを特定することで、ディスク領域へのアクセスを減らし、GC処理の効率を向上することができる。
【0062】
上述してきたように、実施例では、過去領域33のブルームフィルタ32cに、過去に重複除去が行われたブロックのアドレスを登録し、過去領域33のハッシュ値領域31cに、過去に重複除去が行われたブロックのデータのハッシュ値を記憶する。そして、GC部25が、ブルームフィルタ32cを用いて、現時点でデータの重複除去が行われた可能性があるブロックを特定し、特定したブロックについてデータ記憶部10を参照して、現時点でデータの重複除去が行われた状態にあるブロックを特定する。そして、GC部25は、特定したブロックのデータのハッシュ値とハッシュ値領域31cに含まれるハッシュ値とに基づいて、使用されなくなったデータ領域を特定し、GCの対象として回収する。したがって、ストレージ装置2は、GCを効率よく行うことができる。
【0063】
また、実施例では、世代交代部22が、旧世代のtop−kカウンタ31a及びブルームフィルタ32aを用いて過去領域33を更新する。また、世代交代部22は、top−kカウンタ31aを調整して新世代のtop−kカウンタ31bとするとともに、ブルームフィルタ32aをクリアして新世代のブルームフィルタ32bとする。したがって、ストレージ装置2は、重複するデータの時間変化に対応することができる。
【0064】
なお、実施例では、ストレージ制御部20について説明したが、ストレージ制御部20が有する構成をソフトウェアによって実現することで、同様の機能を有するストレージ制御プログラムを得ることができる。そこで、ストレージ制御プログラムを実行するコンピュータについて説明する。
【0065】
図10は、実施例に係るストレージ制御プログラムを実行するコンピュータのハードウェア構成を示す図である。
図10に示すように、コンピュータ50は、メインメモリ51と、CPU(Central Processing Unit)52と、LAN(Local Area Network)インタフェース53と、HDD(Hard Disk Drive)54とを有する。また、コンピュータ50は、スーパーIO(Input Output)55と、DVI(Digital Visual Interface)56と、ODD(Optical Disk Drive)57とを有する。
【0066】
メインメモリ51は、プログラムやプログラムの実行途中結果などを記憶するメモリである。
図2に示した現在情報記憶部23及び過去情報記憶部24は、メインメモリ51上の領域である。CPU52は、メインメモリ51からプログラムを読み出して実行する中央処理装置である。CPU52は、メモリコントローラを有するチップセットを含む。
【0067】
LANインタフェース53は、コンピュータ50をLAN経由で他のコンピュータに接続するためのインタフェースである。HDD54は、プログラムやデータを格納するディスク装置である。
図2に示したデータ記憶部10は、HDD54により実現される。スーパーIO55は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。DVI56は、液晶表示装置を接続するインタフェースであり、ODD57は、DVDの読み書きを行う装置である。
【0068】
LANインタフェース53は、PCIエクスプレス(PCIe)によりCPU52に接続され、HDD54及びODD57は、SATA(Serial Advanced Technology Attachment)によりCPU52に接続される。スーパーIO55は、LPC(Low Pin Count)によりCPU52に接続される。
【0069】
そして、コンピュータ50において実行されるストレージ制御プログラムは、DVDに記憶され、ODD57によってDVDから読み出されてコンピュータ50にインストールされる。あるいは、ストレージ制御プログラムは、LANインタフェース53を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ50にインストールされる。そして、インストールされたストレージ制御プログラムは、HDD54に記憶され、メインメモリ51に読み出されてCPU52によって実行される。
【0070】
また、実施例では、top−k重複除去の場合について説明したが、本発明はこれに限定されるものではなく、全データについて重複除去を行う場合にも同様に適用することができる。