IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 東芝メモリ株式会社の特許一覧

特開2022-137795ストレージ装置、ストレージクライアント装置および制御方法
<>
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図1
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図2
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図3
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図4
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図5
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図6
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図7
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図8
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図9
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図10
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図11
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図12
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図13
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図14
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図15
  • 特開-ストレージ装置、ストレージクライアント装置および制御方法 図16
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022137795
(43)【公開日】2022-09-22
(54)【発明の名称】ストレージ装置、ストレージクライアント装置および制御方法
(51)【国際特許分類】
   G06F 16/28 20190101AFI20220914BHJP
   G06F 13/10 20060101ALI20220914BHJP
【FI】
G06F16/28
G06F13/10 320Z
【審査請求】未請求
【請求項の数】15
【出願形態】OL
(21)【出願番号】P 2021037467
(22)【出願日】2021-03-09
(71)【出願人】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】特許業務法人スズエ国際特許事務所
(72)【発明者】
【氏名】大場 義洋
【テーマコード(参考)】
5B175
【Fターム(参考)】
5B175BA02
(57)【要約】
【課題】KVSに保持されるデータを共有する複数のノードのそれぞれにおいて、自ノードによるデータ操作とは別途行われ得る他のノードによるデータ操作の影響をなくすことができるストレージ装置を提供する。
【解決手段】実施形態によれば、ストレージ装置は、検索キーと値との組みを保持する第1テーブルと、検索キーとメンバーセットとの組みを保持する第2テーブルとを保持する。ストレージ装置は、第1検索キーと第1値とを含むset命令を受信したとき、第1検索キーに対応する第1テーブルのエントリの値と第1値とが一致する場合に、第1検索キーに対応する第2テーブルのエントリのメンバーセットにset命令を発行したメンバーを追加し、第2検索キーを含むget命令を受信したとき、第2検索キーに対応する第2テーブルのエントリのメンバーセットにget命令を発行したメンバーが含まれる場合に、第2検索キーに対応する第1テーブルのエントリの値を出力する。
【選択図】図2
【特許請求の範囲】
【請求項1】
記憶部と、
前記記憶部の入出力を制御する制御部と、
を具備し、
前記記憶部は、
検索キーと値との組みを保持する第1テーブルと、
前記検索キーと、前記検索キーに関連づけて前記値を前記第1テーブルに格納することを要求するset命令を発行したメンバーの集合体であるメンバーセットとの組みを保持する第2テーブルと、
を保持し、
前記制御部は、
第1検索キーと第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第1テーブルのエントリに保持されている値と前記第1値とが一致する場合に、前記第1検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットに前記set命令を発行したメンバーを追加し、
前記検索キーに基づいて前記検索キーに関連づけられている前記値を前記第1テーブルから取得することを要求するget命令であって、第2検索キーをパラメータに含む前記get命令を受信したとき、前記第2検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットに前記get命令を発行したメンバーが含まれる場合に、前記第2検索キーに対応する前記第1テーブルのエントリに保持されている値を前記第1テーブルから出力し、
前記検索キーに基づいて前記検索キーに関連づけられている前記値を前記第1テーブルから削除することを要求するdelete命令であって、第3検索キーをパラメータに含む前記delete命令を受信したとき、前記第3検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットから前記delete命令を発行したメンバーを削除し、前記メンバーセットに含まれるメンバーの数が0となった場合、前記第1テーブルから前記第3検索キーに対応するエントリを削除し、前記第2テーブルから前記第3検索キーに対応するエントリを削除する、
ストレージ装置。
【請求項2】
前記制御部は、
前記第1検索キーと前記第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第2テーブルのエントリが存在しない場合、前記第1検索キーに対応する前記第2テーブルのエントリを作成し、前記第1検索キーと前記第1値との組みを保持する前記第1テーブルのエントリを作成し、前記第1検索キーと前記set命令を発行したメンバーのみを含むメンバーセットとの組みを保持する前記第2テーブルのエントリを作成する、
請求項1に記載のストレージ装置。
【請求項3】
前記記憶部は、前記set命令、前記get命令および前記delete命令の発行を許可されたメンバーのメンバー識別子とメンバー情報との組みを保持する第3テーブルをさらに保持する請求項1または2に記載のストレージ装置。
【請求項4】
前記メンバー情報は、前記set命令、前記get命令および前記delete命令の発行を許可されたメンバーの公開鍵およびリプレイカウンタ値を含み、
前記set命令、前記get命令および前記delete命令は、カウンタ値とデジタル署名とをパラメータに含み、
前記制御部は、
前記set命令、前記get命令または前記delete命令を発行したメンバーのメンバー識別子に合致する前記第3テーブルのエントリが存在し、前記カウンタ値がメンバー識別子に合致する前記第3テーブルのエントリに保持されているリプレイカウンタ値以上であり、前記デジタル署名が、前記set命令、前記get命令または前記delete命令の前記デジタル署名以外のパラメータの並びに対して前記メンバー識別子に合致する前記第3テーブルのエントリに保持されている公開鍵を用いて計算されたデジタル署名と一致する場合に、前記set命令、前記get命令または前記delete命令に応じた処理を実行し、前記メンバー識別子に合致する前記第3テーブルのエントリに保持されているリプレイカウンタ値を前記リプレイカウンタ値に1を加えた値に更新する、
請求項3に記載のストレージ装置。
【請求項5】
前記記憶部は、1次記憶部と、2次記憶部とを含み、
前記第1テーブルは、前記1次記憶部に保持される1次第1テーブルと、前記2次記憶部に保持される2次第1テーブルとを含み、
前記第2テーブルは、各エントリにおいて、前記メンバーセットに含まれるいずれかのメンバーによって前記set命令が最後に実行された時刻を保持し、
前記制御部は、現在時刻から一定値を減じた値以上の時刻が保持されている前記第2テーブルのエントリに対応する前記第1テーブルのエントリを前記1次第1テーブルに保持し、現在時刻から一定値を減じた値未満の時刻が保持されている前記第2テーブルのエントリに対応する前記第1テーブルのエントリを前記2次第1テーブルに保持する、
請求項1~4のいずれか1項に記載のストレージ装置。
【請求項6】
前記制御部は、前記第1検索キーと前記第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第1テーブルのエントリが前記2次第1テーブルに保持されている場合、前記第1検索キーに対応する前記第1テーブルのエントリを、前記2次第1テーブルから前記1次第1テーブルに移動させる、
請求項5に記載のストレージ装置。
【請求項7】
ネットワークを介して前記記憶部にアクセスするネットワークインターフェース部をさらに具備し、
前記制御部は、前記ネットワークインターフェース部に設けられる、
請求項1~6のいずれか1項に記載のストレージ装置。
【請求項8】
検索キーと値との組みを保持する第1テーブルと、前記検索キーと、前記検索キーに関連づけて前記値を前記第1テーブルに格納することを要求するset命令を発行したメンバーの集合体であるメンバーセットとの組みを保持する第2テーブルとを保持する外部ストレージとネットワークを介して接続されるストレージクライアント装置であって、
前記ネットワークを介して接続される前記外部ストレージに関する、前記set命令に応じた処理、前記検索キーに基づいて前記検索キーに関連づけられている前記値を前記第1テーブルから取得することを要求するget命令に応じた処理、および、前記検索キーに基づいて前記検索キーに関連づけられている前記値を前記第1テーブルから削除することを要求するdelete命令に応じた処理を実行する制御部を具備し、
前記制御部は、
第1検索キーと第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第1テーブルのエントリに保持されている値と前記第1値とが一致する場合に、前記第1検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットに前記set命令を発行したメンバーを追加し、
第2検索キーをパラメータに含む前記get命令を受信したとき、前記第2検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットに前記get命令を発行したメンバーが含まれる場合に、前記第2検索キーに対応する前記第1テーブルのエントリに保持されている値を前記第1テーブルから出力し、
第3検索キーをパラメータに含む前記delete命令を受信したとき、前記第3検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットから前記delete命令を発行したメンバーを削除し、前記メンバーセットに含まれるメンバーの数が0となった場合、前記第1テーブルから前記第3検索キーに対応するエントリを削除し、前記第2テーブルから前記第3検索キーに対応するエントリを削除する、
ストレージクライアント装置。
【請求項9】
前記制御部は、
前記第1検索キーと前記第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第2テーブルのエントリが存在しない場合、前記第1検索キーに対応する前記第2テーブルのエントリを作成し、前記第1検索キーと前記第1値との組みを保持する前記第1テーブルのエントリを作成し、前記第1検索キーと前記set命令を発行したメンバーのみを含むメンバーセットとの組みを保持する前記第2テーブルのエントリを作成する、
請求項8に記載のストレージクライアント装置。
【請求項10】
前記制御部は、他の前記ストレージクライアント装置の前記制御部との間の前記set命令、前記get命令または前記delete命令の発行に関する排他制御を行う分散ロック部を具備する、
請求項8または9に記載のストレージクライアント装置。
【請求項11】
検索キーと値との組みを保持する第1テーブルと、前記検索キーと、前記検索キーに関連づけて前記値を前記第1テーブルに格納することを要求するset命令を発行したメンバーの集合体であるメンバーセットとの組みを保持する第2テーブルとを保持するストレージ装置の制御方法であって、
第1検索キーと第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第1テーブルのエントリに保持されている値と前記第1値とが一致する場合に、前記第1検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットに前記set命令を発行したメンバーを追加し、
前記検索キーに基づいて前記検索キーに関連づけられている前記値を前記第1テーブルから取得することを要求するget命令であって、第2検索キーをパラメータに含む前記get命令を受信したとき、前記第2検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットに前記get命令を発行したメンバーが含まれる場合に、前記第2検索キーに対応する前記第1テーブルのエントリに保持されている値を前記第1テーブルから出力し、
前記検索キーに基づいて前記検索キーに関連づけられている前記値を前記第1テーブルから削除することを要求するdelete命令であって、第3検索キーをパラメータに含む前記delete命令を受信したとき、前記第3検索キーに対応する前記第2テーブルのエントリに保持されているメンバーセットから前記delete命令を発行したメンバーを削除し、前記メンバーセットに含まれるメンバーの数が0となった場合、前記第1テーブルから前記第3検索キーに対応するエントリを削除し、前記第2テーブルから前記第3検索キーに対応するエントリを削除する、
制御方法。
【請求項12】
さらに、前記第1検索キーと前記第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第2テーブルのエントリが存在しない場合、前記第1検索キーに対応する前記第2テーブルのエントリを作成し、前記第1検索キーと前記第1値との組みを保持する前記第1テーブルのエントリを作成し、前記第1検索キーと前記set命令を発行したメンバーのみを含むメンバーセットとの組みを保持する前記第2テーブルのエントリを作成する請求項11に記載の制御方法。
【請求項13】
前記ストレージ装置は、前記set命令、前記get命令および前記delete命令の発行を許可されたメンバーのメンバー識別子とメンバー情報との組みを保持する第3テーブルをさらに保持し、
前記メンバー情報は、前記set命令、前記get命令および前記delete命令の発行を許可されたメンバーの公開鍵およびリプレイカウンタ値を含み、
前記set命令、前記get命令および前記delete命令は、カウンタ値とデジタル署名とをパラメータに含み、
さらに、前記set命令、前記get命令または前記delete命令を発行したメンバーのメンバー識別子に合致する前記第3テーブルのエントリが存在し、前記カウンタ値がメンバー識別子に合致する前記第3テーブルのエントリに保持されているリプレイカウンタ値以上であり、前記デジタル署名が、前記set命令、前記get命令または前記delete命令の前記デジタル署名以外のパラメータの並びに対して前記メンバー識別子に合致する前記第3テーブルのエントリに保持されている公開鍵を用いて計算されたデジタル署名と一致する場合に、前記set命令、前記get命令または前記delete命令に応じた処理を実行し、前記メンバー識別子に合致する前記第3テーブルのエントリに保持されているリプレイカウンタ値を前記リプレイカウンタ値に1を加えた値に更新する、
請求項12に記載の制御方法。
【請求項14】
前記ストレージ装置は、1次記憶部と、2次記憶部とを含み、
前記第1テーブルは、前記1次記憶部に保持される1次第1テーブルと、前記2次記憶部に保持される2次第1テーブルとを含み、
前記第2テーブルは、各エントリにおいて、前記メンバーの集合体に含まれるいずれかのメンバーによって前記set命令が最後に実行された時刻を保持し、
さらに、現在時刻から一定値を減じた値以上の時刻が保持されている前記第2テーブルのエントリに対応する前記第1テーブルのエントリを前記1次第1テーブルに保持し、現在時刻から一定値を減じた値未満の時刻が保持されている前記第2テーブルのエントリに対応する前記第1テーブルのエントリを前記2次第1テーブルに保持する、
請求項11~13のいずれか1項に記載の制御方法。
【請求項15】
さらに、前記第1検索キーと前記第1値とをパラメータに含む前記set命令を受信したとき、前記第1検索キーに対応する前記第1テーブルのエントリが前記2次第1テーブルに保持されている場合、前記第1検索キーに対応する前記第1テーブルのエントリを、前記2次第1テーブルから前記1次第1テーブルに移動させる、
請求項14に記載の制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、ストレージ装置、ストレージクライアント装置および制御方法に関する。
【背景技術】
【0002】
KVS(キーバリューストア)は、検索キーと検索キーに対応した値との組みを保持するデータストアの総称である。一般的に、KVSは、複数のクライアントにより共有される。従来のKVSは、共有が許可されている任意のクライアントが、KVSの操作コマンドであるgetコマンド、setコマンド、deleteコマンドを自由に発行できる。
【0003】
KVSの代表的な用途の一つにブロックチェーンシステムがある。ブロックチェーンシステムにおいては、ピアツーピア(P2P)ネットワークに参加する各ブロックチェーンノード(以下、ノード)が、(1)クライアントにより生成されたトランザクションをブロードキャストし、(2)受信したトランザクションを実行し、(3)実行済みトランザクションの実行履歴であるブロックを生成してブロードキャストし、(4)ブロック受信時には受信ブロックに対して合意形成アルゴリズムを各ノードで分散実行した上で、合意形成に成功したブロックを自身のブロックチェーンに追加する、という一連の手続きを繰り返し実行する。このとき、同一内容のブロックが各ノードで保持されることになる。つまり、N個のノードが参加するP2Pネットワークにおいては、各ブロックにつきN個のコピーがP2Pネットワーク上の分散ストレージに存在することになる。
【0004】
P2Pネットワーク上の分散ストレージとしてNVMe-oF対応のストレージサーバを使用する場合、ストレージサーバにN個のブロックのコピーを保持する代わりに、N個のノード間でブロックの実体を共有して保持すれば、ストレージ容量を1/Nに抑えることができると期待される。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】米国特許出願公開第2020/0081998号明細書
【発明の概要】
【発明が解決しようとする課題】
【0006】
本発明の1つの実施形態は、KVSに保持されるデータを複数のノードで共有する場合に、複数のノードのそれぞれにおいて、自ノードによるデータ操作とは別途行われ得る他のノードによるデータ操作の影響をなくすことができるストレージ装置、ストレージクライアント装置および制御方法を提供する。
【課題を解決するための手段】
【0007】
実施形態によれば、ストレージ装置は、記憶部と、制御部と、を具備する。制御部は、記憶部の入出力を制御する。記憶部は、第1テーブルと、第2テーブルと、を保持する。第1テーブルは、検索キーと値との組みを保持する。第2テーブルは、検索キーと、検索キーに関連づけて値を第1テーブルに格納することを要求するset命令を発行したメンバーの集合体であるメンバーセットの組みを保持する。制御部は、第1検索キーと第1値とをパラメータに含むset命令を受信したとき、第1検索キーに対応する第1テーブルのエントリに保持されている値と第1値とが一致する場合に、第1検索キーに対応する第2テーブルのエントリに保持されているメンバーセットにset命令を発行したメンバーを追加する。制御部は、検索キーに基づいて検索キーに関連づけられている値を第1テーブルから取得することを要求するget命令であって、第2検索キーをパラメータに含むget命令を受信したとき、第2検索キーに対応する第2テーブルのエントリに保持されているメンバーセットにget命令を発行したメンバーが含まれる場合に、第2検索キーに対応する第1テーブルのエントリに保持されている値を第1テーブルから出力する。制御部は、検索キーに基づいて検索キーに関連づけられている値を第1テーブルから削除することを要求するdelete命令であって、第3検索キーをパラメータに含むdelete命令を受信したとき、第3検索キーに対応する第2テーブルのエントリに保持されているメンバーセットからdelete命令を発行したメンバーを削除し、メンバーセットに含まれるメンバーの数が0となった場合、第1テーブルから第3検索キーに対応するエントリを削除し、第2テーブルから前記第3検索キーに対応するエントリを削除する。
【図面の簡単な説明】
【0008】
図1】第1実施形態の共有制御型KVSを適用する計算機のハードウェア構成例を示す図
図2】第1実施形態の共有制御型KVSの機能ブロック図
図3】第1実施形態の共有制御型KVSのset命令に係るフローチャート
図4】第1実施形態の共有制御型KVSのget命令に係るフローチャート
図5】第1実施形態の共有制御型KVSのdelete命令に係るフローチャート
図6】第1実施形態の共有制御型KVSを適用するネットワークストレージ装置のハードウェア構成例を示す図
図7】第2実施形態の共有制御型KVSを適用するネットワークストレージ装置のハードウェア構成例を示す図
図8】第2実施形態の共有制御型KVSの機能ブロック図
図9】第2実施形態の共有制御型KVSのset命令に係るフローチャート
図10】第2実施形態の共有制御型KVSのget命令に係るフローチャート
図11】第2実施形態の共有制御型KVSのdelete命令に係るフローチャート
図12】第3実施形態の分散ロックモジュールを使用しない場合の共有制御型KVSの機能ブロック図
図13】第3実施形態の分散ロックモジュールを使用する場合の共有制御型KVSの機能ブロック図
図14】第3実施形態の分散ロックモジュールを使用しない場合の共有制御型KVSのKVS操作命令に係るフローチャート
図15】第3実施形態の分散ロックモジュールを使用する場合の共有制御型KVSのKVS操作命令に係るフローチャート
図16】第4実施形態の共有制御型KVSにおけるメンバーセットKVおよびデータKVの一構成例を示す図
【発明を実施するための形態】
【0009】
以下、実施の形態について、図面を参照して説明する。
【0010】
(第1実施形態)
まず、第1実施形態について説明する。
【0011】
前述したように、P2Pネットワーク上の分散ストレージとしてNVMe-oF対応のストレージサーバを使用する場合、ストレージサーバにN個のブロックのコピーを保持する代わりに、N個のノード間でブロックの実体を共有して保持すれば、ストレージ容量を1/Nに抑えることができると期待される。しかしながら、ブロックの実体を従来のKVSを用いて複数のノード間で共有する場合には、以下の2つの問題がある。
【0012】
第1の問題は、あるノードが受信したブロックの実体がKVSに保持されている場合、別のノードは、このブロックを未受信であるにも関わらず、このブロックにアクセスできてしまうことである。
【0013】
第2の問題は、あるノードによりブロックが削除された場合、別のノードは、このブロックをまだ保持していているにも関わらず、このブロックにアクセスできなくなることである。
【0014】
上記第1の問題および第2の問題は、ともにブロックチェーンシステムの誤動作を起こす原因となる。
【0015】
第1実施形態は、KVSに保持されるデータを複数のノードで共有する場合に、複数のノードのそれぞれにおいて、自ノードによるデータ操作とは別途行われ得る他のノードによるデータ操作の影響をなくすことができる共有制御型KVSに関する。
【0016】
図1は、第1実施形態の共有制御型KVS10を適用する計算機(コンピュータ)100のハードウェア構成例を示す図である。なお、図1には、共有制御型KVS10(10-1~3)の3通りの実装例が示されている。
【0017】
計算機100は、サーバやパーソナルコンピュータなどである。計算機100は、CPU1と、メインメモリ2と、複数のストレージ3と、複数の非ストレージPCI Express(PCIe)(登録商標)デバイス4とを有する。また、計算機100は、メモリバス5と、PCIeバス6とを有する。複数のストレージ3のそれぞれには、ストレージ3の入出力を制御するIO制御モジュール3Aが外付けされ、または、ストレージ3の入出力を制御するIO制御モジュール3Bが内蔵される。
【0018】
CPU1は、メモリバス5によってメインメモリ2と接続されている。また、CPU1は、PCIeバス6によって複数のストレージ3や複数の非ストレージPCIeデバイス4と接続されている。CPU1は、メモリバス5によって接続されるメインメモリ2上のプログラムを実行する。CPU1は、プログラムの記述に従い、PCIeバス6によって接続される複数のストレージ3や複数の非ストレージPCIeデバイス4を制御する。
【0019】
第1実施形態の共有制御型KVS10は、KVS処理モジュール11と、データKV12と、メンバーセットKV13とによって構成される。KVS処理モジュール11は、たとえばIO制御モジュール3AやIO制御モジュール3Bに搭載され得る。KVS処理モジュール11は、電気回路などといったハードウェアによって実現されるものであってもよいし、プロセッサ(図示せず)によって実行されるプログラム(ソフトウェア)によって実現されるものであってもよい。データKV12とメンバーセットKV13とは、ストレージ3に保持される。
【0020】
前述したように、図1には、共有制御型KVS10(10-1~3)の3通りの実装例が示されている。共有制御型KVS10-1は、ストレージ3に対してKVS処理モジュール11が外付けされている。このKVS処理モジュール11は、たとえば図1に示すように、外付けのIO制御モジュール3A内に実装されるかもしれない。共有制御型KVS10-2は、1つのKVS処理モジュール11に対して複数のストレージ3が接続している。これは、たとえばRAIDコントローラのような部分にKVS処理モジュール11の機能が搭載されている場合や、PCIeスイッチなどのブリッジチップにストレージプロトコルを処理する機能とともにKVS処理モジュール11の機能が搭載されている場合を想定している。このKVS処理モジュール11は、たとえば図1に示すように、外付けのIO制御モジュール3A内に実装されるかもしれない。共有制御型KVS10-3は、ストレージ3内にKVS処理モジュール11が統合されている。このKVS処理モジュール11は、たとえば図1に示すように、ストレージ3内のIO制御モジュール3B内に実装されるかもしれない。なお、ストレージ3の外部か内部かによってKVS処理モジュールの本質的な機能は制限されない。図2は、このように様々な様態で実装され得る第1実施形態の共有制御型KVS10の機能ブロック図である。
【0021】
前述したように、共有制御型KVS10は、KVS処理モジュール11と、データKV12と、メンバーセットKV13とによって構成される。
【0022】
KVS処理モジュール11は、たとえば図1に示されるCPU1などの外部からKVS操作命令を受信し、KVS操作命令の内容に応じて、メンバーセットKV13を参照または更新しつつ、データKV12の所定のKVエントリに対する操作を実行し、KVS操作命令の実行結果を外部に出力する。KVS操作命令は、たとえば、set命令、get命令、delete命令である。
【0023】
set命令は、検索キーに関連づけて値(value)をデータKV12に格納することを要求する命令である。get命令は、検索キーに基づいて当該検索キーに関連づけられている値をデータKV12から取得することを要求する命令である。delete命令は、検索キーに基づいて当該検索キーに関連づけられている値をデータKV12から削除することを要求する命令である。
【0024】
データKV12は、set命令で関連づけられた、検索キーと値との組みを保持するテーブル(第1テーブル)である。図2のデータKV12は、L個のエントリを持ち、検索キーK(i=1, ..., L)に対する値はVで表される。
【0025】
メンバーセットKV13は、データKV12に保持されている検索キーのそれぞれに対し、検索キーとメンバーセットとの組みを保持するテーブル(第2テーブル)である。メンバーセットは、同一の検索キーおよび値を指定してset命令を発行したメンバーの集合体である。図2のメンバーセットKV13は、L個のエントリを持ち、検索キーK(i=1, ..., L)に対するメンバーセットはmsetで表される。
【0026】
次に、図3図4図5を用いて、図2に示した第1実施形態における共有制御型KVS10のKVS操作命令の動作を説明する。以下、KVS操作命令呼出し元のメンバーにはKVS操作命令実行に必要なメンバー個別の属性や状態を保持する構造体(コンテキストと呼ぶ)が割り当てられており、呼出し元メンバーのコンテキストに付随してKVS操作命令が呼び出されるものとする。また、コンテキストの属性にはメンバー識別子が含まれるとする。以降の説明では、ホストとの接続関係や不揮発性メモリとの接続関係を特定せずに汎用的な表現で情報の入出力を述べるが、実際には各種プロトコルに基づく命令を用いることができる。
【0027】
図3は、第1実施形態における共有制御型KVS10のset命令に係るフローチャートである。
【0028】
本動作は、メンバー(たとえばノード上のアプリケーションプログラム)が発行したset命令をKVS処理モジュール11が外部から受信することで開始される。set命令は、検索キー(key)および値(value)を入力引数(パラメータ)に持つ。ここでは、set命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0029】
KVS処理モジュール11は、まず、getMemberSetKv(key)でメンバーセットKV13からkeyに対応するメンバーセット(member_set)を取得する(S101)。getMemberSetKvは、検索キー(key)を入力引数に持つ命令であって、メンバーセットKV13からkeyに対応するメンバーセットを取得することを要求する命令である。もし、メンバーセットが存在しなければ(S102:Yes)、KVS処理モジュール11は、newMemberSet()で新しいメンバーセットを生成してこれをmember_setとし、setDataKv(key, value)により、データKV12のkeyに対応するエントリの値にvalueを設定する(S104)。メンバーセットが存在しない場合とは、対象の検索キー(key)を入力引数に含むset命令が最初に受信された場合である。newMemberSet()は、メンバーセットKV13に新しいメンバーセットを生成することを要求する命令である。setDataKvは、検索キー(key)と値(value)とを入力引数に持つ命令であって、データKV12のkeyに対応するエントリの値にvalueを設定することを要求する命令である。
【0030】
続いて、KVS処理モジュール11は、member_set.add(memberID)により、memberIDに対応するメンバーをmember_setに追加し、setMemberSetKv(key, member_set)により、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定する(S105)。member_set.addは、メンバー識別子(memberID)を入力引数に持つ命令であって、memberIDに対応するメンバーをmember_setに追加することを要求する命令である。setMemberSetKvは、検索キー(key)とメンバーセット(member_set)とを入力引数に持つ命令であって、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定することを要求する命令である。ステップS105を終えると、KVS処理モジュール11は、set命令に係る処理を終了する。
【0031】
一方、もし、メンバーセットが存在すれば(S102:No)、KVS処理モジュール11は、getDataKv(key)でデータKV12を検索する(S103)。メンバーセットが存在する場合とは、対象の検索キー(key)を入力引数に含むset命令が過去に受信されている場合である。getDataKvは、検索キー(key)を入力引数に持つ命令であって、データKV12からkeyに対応する値を取得することを要求する命令である。データKV12のkeyに対応するエントリの値がvalueと一致していれば(S103:Yes)、KVS処理モジュール11は、member_set.add(memberID)により、memberIDに対応するメンバーをmember_setに追加し、setMemberSetKv(key, member_set)により、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定する(S105)。ステップS105を終えると、KVS処理モジュール11は、set命令に係る処理を終了する。
【0032】
データKV12のkeyに対応するエントリの値がvalueと一致していない場合には(S103:No)、KVS処理モジュール11は、エラーを出力して(S106)、set命令に係る処理を終了する。
【0033】
図4は、第1実施形態における共有制御型KVS10のget命令に係るフローチャートである。
【0034】
本動作は、メンバーが発行したget命令をKVS処理モジュール11が外部から受信することで開始される。get命令は、検索キー(key)を入力引数に持つ。ここでは、get命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0035】
KVS処理モジュール11は、まず、getMemberSetKv(key)でメンバーセットKV13からkeyに対応するエントリのメンバーセット(member_set)を取得する(S201)。もし、keyに対応するエントリが存在しなければ(S202:Yes)、KVS処理モジュール11は、値無し(None)を出力する(S205)。keyに対応するエントリが存在しない場合とは、対象の検索キー(key)を入力引数に含むset命令が受信されていない場合である。KVS処理モジュール11は、ステップS205を終えると、get命令に係る処理を終了する。
【0036】
一方、もし、keyに対応するエントリが存在すれば(S202:No)、KVS処理モジュール11は、member_set.contains(memberID)により、memberIDに対応するメンバーがmember_setに含まれるかどうかを調べる(S203)。member_set.containsは、メンバー識別子(memberID)を入力引数に持つ命令であって、memberIDに対応するメンバーがmember_setに含まれるかどうかを調べることを要求する命令である。member_setに含まれる場合(S203:Yes)、KVS処理モジュール11は、getDataKv(key)により、データKV12からkeyに対応する値(value)を取得し、この値(value)を出力する(S204)。member_setに含まれる場合とは、memberIDに対応するメンバーが対象の検索キー(key)を入力引数に含むset命令を発行している場合である。ステップS204を終えると、KVS処理モジュール11は、get命令に係る処理を終了する。
【0037】
member_setに含まれない場合(S203:No)、KVS処理モジュール11は、値無し(None)を出力する(S205)。member_setに含まれない場合とは、memberIDに対応するメンバーが対象の検索キー(key)を入力引数に含むset命令を発行していない場合である。つまり、データKV12の値(value)は、その値に関するset命令を発行したメンバーに限り取得することができる。ステップS205を終えると、KVS処理モジュール11は、get命令に係る処理を終了する。
【0038】
図5は、第1実施形態における共有制御型KVS10のdelete命令に係るフローチャートである。
【0039】
本動作は、メンバーが発行したdelete命令をKVS処理モジュール11が外部から受信することで開始される。delete命令は、検索キー(key)を入力引数に持つ。ここでは、delete命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0040】
KVS処理モジュール11は、まず、getMemberSetKv(key)でメンバーセットKV13からkeyに対応するエントリのメンバーセット(member_set)を取得する(S301)。もし、keyに対応するエントリが存在しなければ(S302:Yes)、KVS処理モジュール11は、エラーを出力して(S307)、delete命令に係る処理を終了する。
【0041】
一方、もし、keyに対応するエントリが存在すれば(S302:No)、KVS処理モジュール11は、member_set.delete(memberID)により、member_setからmemberIDに対応するメンバーを削除する(S303)。member_set.deleteは、メンバー識別子(memberID)を入力引数に持つ命令であって、member_setからmemberIDに対応するメンバーを削除することを要求する命令である。member_setが空の場合(S304:YES)、KVS処理モジュール11は、deleteDataKv(key)により、データKV12からkeyに対応するエントリを削除する(S305)。member_setが空の場合とは、対象の検索キー(key)を入力引数に含むset命令を発行したすべてのメンバーが当該検索キー(key)を入力引数に含むdelete命令を発行している場合である。deleteDataKvは、検索キー(key)を入力引数に持つ命令であって、データKV12からkeyに対応するエントリを削除することを要求する命令である。つまり、データKV12の値(value)は、その値に関するset命令を発行したすべてのメンバーがdelete命令を発行した場合に限り削除される。ステップS305を終えると、KVS処理モジュール11は、delete命令に係る処理を終了する。
【0042】
member_setが空でない場合(S304:No)、KVS処理モジュール11は、setMemberSetKv(key, member_set)により、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定する(S306)。このmember_setは、ステップS303でmemberIDに対応するメンバーが削除されたmember_setである。ステップS306を終えると、KVS処理モジュール11は、delete命令に係る処理を終了する。
【0043】
以上が第1実施形態における共有制御型KVS10の動作である。これにより、同一のKVSを共有するメンバー間で、あるメンバーが自らset命令を発行していないKVエントリに誤ってget命令やdelete命令を実行してしまうことに起因したKVS利用アプリケーションの誤動作を防げるという効果を奏する。
【0044】
ところで、図1には、第1実施形態の共有制御型KVS10が計算機100に適用されている例を示した。KVS操作命令は、たとえば図1に示されるCPU1上で動作するソフトウェアで生成する場合に限定されない。たとえば、ネットワークを介して接続する別の計算機上で実行されるソフトウェアによって生成されてもよい。図6は、第1実施形態の共有制御型KVS10を適用するネットワークストレージ装置200のハードウェア構成例を示す図である。図6には、KVS処理モジュール11がネットワークストレージ装置200に付随する形でシステムに取り付けられている例が示されている。
【0045】
ネットワークストレージ装置200は、ネットワークインターフェース部(NIC)7を有する。ネットワークインターフェース部7は、ストレージクライアント装置300とのネットワークを介した通信を制御する。図6では、ネットワークインターフェース部7にKVS処理モジュール11が統合されている。
【0046】
ネットワークには、TCP/IPを用いたネットワークの他、任意のネットワークを用いて良い。KVS操作命令はストレージクライアント装置300が発行する。また、図6では、ネットワークストレージ装置200が、物理的に外部に設置されたサーバのように記載されているが、論理的に分かれた計算機(仮想計算機等)であってもよい。
【0047】
図6に示すネットワークストレージ装置200においても、同一のKVSを共有するメンバー間で、あるメンバーが自らset命令を発行していないKVエントリに誤ってget命令やdelete命令を実行してしまうことに起因したKVS利用アプリケーションの誤動作を防ぐことができる。
【0048】
以上のように、第1実施形態の共有制御型KVS10は、データ(データKV12の検索キーおよび値)を複数のノードで共有する場合に、複数のノードのそれぞれにおいて、自ノードによるデータ操作とは別途行われ得る他のノードによるデータ操作の影響をなくすことができる。
【0049】
(第2実施形態)
次に、第2実施形態について説明する。第2実施形態は、複数のKVS処理モジュール11がネットワーク上に分散して存在する共有制御型KVSに関する。特に、KVSのストレージにNVMe-oFやネットワークファイルシステムなどを用いることによりネットワークを通じてアクセスする場合に有効な実施形態である。
【0050】
図7は、第2実施形態の共有制御型KVS10を適用するネットワークストレージ装置200のハードウェア構成例を示す図である。第1実施形態では、ネットワークインターフェース部7にKVS処理モジュール11が統合されている例を示した(図6参照)。ここでは、ストレージクライアント装置300内に後述する分散ロックモジュール111を有するKVS処理モジュール11が統合されている例を示す。第2実施形態においても、KVS処理モジュール11は、電気回路などといったハードウェアによって実現されるものであってもよいし、プロセッサ(図示せず)によって実行されるプログラム(ソフトウェア)によって実現されるものであってもよい。データKV12とメンバーセットKV13とは、ストレージ3に保持される。
【0051】
なお、図7では、ネットワークストレージ装置200が、物理的に外部に設置されたサーバのように記載されているが、第1実施形態と同様、論理的に分かれた計算機(仮想計算機等)であってもよい。図7に示す構成の場合、KVS処理モジュール11には通信機能が必要である。具体的には、ネットワークを介してKVS操作命令を実行する機能であり、物理的にネットワークに接続するためのネットワークインターフェース部やTCP/IPなどの通信プロトコルやiSCSIやNVMe-oFなどストレージプロトコルを処理するプロトコル処理部を具備する。それらを介して、データKV12およびメンバーセットKV13にアクセスするためのコマンドがKVS処理モジュール11で入出力されるようにすればよい。
【0052】
図8は、第2実施形態の共有制御型KVS10の機能ブロック図である。
【0053】
第2実施形態の共有制御型KVS10は、1以上の各ストレージクライアント装置300上のKVS処理モジュール11と、ネットワークストレージ装置200上のデータKV12およびメンバーセットKV13とで構成される。
【0054】
各KVS処理モジュール11は、分散ロックモジュール111を有する。分散ロックモジュール111は、複数のKVS処理モジュール11間でKVS操作命令の排他制御を行うために使用される。分散ロックモジュール111の一例として、分散アプリケーション補助ツールであるZooKeeperの分散ロック機構が挙げられる。各KVS処理モジュール11の分散ロックモジュール111以外の構成は、第1実施形態のKVS処理モジュール11と同じである。また、データKV12およびメンバーセットKV13の構成は、第1実施形態で説明されたものと同じである。
【0055】
次に、図9図10図11を用いて、図8に示した第2実施形態における共有制御型KVS10のKVS操作命令の動作を説明する。以下、KVS操作命令呼出し元のメンバーにはKVS操作命令実行に必要なメンバー個別の属性や状態を保持する構造体(コンテキストと呼ぶ)が割り当てられており、呼出し元メンバーのコンテキストに付随してKVS操作命令が呼び出されるものとする。また、コンテキストの属性にはメンバー識別子が含まれるとする。以降の説明では、ホストとの接続関係や不揮発性メモリとの接続関係を特定せずに汎用的な表現で情報の入出力を述べるが、実際には各種プロトコルに基づく命令を用いることができる。
【0056】
図9は、第2実施形態における共有制御型KVS10のset命令に係るフローチャートである。
【0057】
本動作は、メンバーが発行したset命令をKVS処理モジュール11が外部から受信することで開始される。set命令は、検索キー(key)および値(value)を入力引数に持つ。ここでは、set命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0058】
KVS処理モジュール11は、まず、L=DistributedLock("write")で書込み用の分散ロックを獲得するまで待つ(S401)。DistributedLockは、分散ロックを獲得することを要求する命令である。次に、KVS処理モジュール11は、getMemberSetKv(key)でメンバーセットKV13からkeyに対応するエントリのメンバーセット(member_set)を取得する(S402)。もし、keyに対応するエントリが存在しなければ(S403:Yes)、KVS処理モジュール11は、newMemberSet()で新しいメンバーセットを生成してこれをmember_setとし、setDataKv(key, value)により、データKV12のkeyに対応するエントリの値にvalueを設定する(S407)。また、KVS処理モジュール11は、member_set.add(memberID)により、memberIDに対応するメンバーをmember_setに追加し、setMemberSetKv(key, member_set)により、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定する(S405)。そして、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放して(S406)、set命令に係る処理を終了する。DistributedUnLockは、DistributedLockで獲得した分散ロックを解放することを要求する命令である。
【0059】
一方、もし、keyに対応するエントリが存在すれば(S403:No)、KVS処理モジュール11は、getDataKv(key)でデータKV12を検索する(S404)。データKV12のkeyに対応するエントリの値がvalueと一致していれば(S404:Yes)、KVS処理モジュール11は、member_set.add(memberID)により、メンバー識別子に対応するメンバーをmember_setに追加し、setMemberSetKv(key, member_set)により、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定する(S405)。そして、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放して(S406)、set命令に係る処理を終了する。
【0060】
データKV12のkeyに対応するエントリの値がvalueと一致していない場合には(S404:No)、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S408)、エラーを出力して(S409)、set命令に係る処理を終了する。
【0061】
図10は、第2実施形態における共有制御型KVS10のget命令に係るフローチャートである。
【0062】
本動作は、メンバーが発行したget命令をKVS処理モジュール11が外部から受信することで開始される。get命令は、検索キー(key)を入力引数に持つ。ここでは、get命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0063】
KVS処理モジュール11は、L=DistributedLock("read")で読出し用の分散ロックを獲得するまで待つ(S501)。次に、KVS処理モジュール11は、getMemberSetKv(key)でメンバーセットKV13からkeyに対応するエントリのメンバーセット(member_set)を取得する(S502)。もし、メンバーセットが存在しなければ(S503:Yes)、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S508)、値無し(None)を出力して(S509)、get命令に係る処理を終了する。
【0064】
一方、もし、keyに対応するエントリが存在すれば(S503:No)、KVS処理モジュール11は、member_set.contains(memberID)により、メンバー識別子に対応するメンバーがmember_setに含まれるかどうかを調べる(S504)。member_setに含まれる場合(S504:Yes)、KVS処理モジュール11は、getDataKv(key)により、データKV12からkeyに対応する値(value)を取得する(S505)。KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S506)、その値(value)を出力して(S507)、get命令に係る終了する。
【0065】
member_setに含まれない場合(S504:No)、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S508)、値無し(None)を出力して(S509)、get命令に係る処理を終了する。
【0066】
図11は、第2実施形態における共有制御型KVS10のdelete命令に係るフローチャートである。
【0067】
本動作は、メンバーが発行したdelete命令をKVS処理モジュール11が外部から受信することで開始される。delete命令は、検索キー(key)を入力引数に持つ。ここでは、delete命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0068】
KVS処理モジュール11は、まず、L=DistributedLock("write")で書込み用の分散ロックを獲得するまで待つ(S601)。次に、KVS処理モジュール11は、getMemberSetKv(key)でメンバーセットKV13からkeyに対応するエントリのメンバーセット(member_set)を取得する(S602)。もし、keyに対応するエントリが存在しなければ(S603:Yes)、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S609)、エラーを出力して(S610)、delete命令に係る処理を終了する。
【0069】
一方、もし、keyに対応するエントリが存在すれば(S603:No)、KVS処理モジュール11は、member_set.delete(memberID)により、member_setからmemberIDに対応するメンバーを削除する(S604)。member_setが空の場合(S605:Yes)、KVS処理モジュール11は、deleteDataKv(key)により、データKV12からkeyに対応するエントリを削除し(S606)、DistributedUnLock(L)で分散ロックを解放して(S607)、delete命令に係る処理を終了する。
【0070】
member_setが空でない場合(S605:No)、KVS処理モジュール11は、setMemberSetKv(key, member_set)により、メンバーセットKV13のkeyに対応するエントリのメンバーセットにmember_setを設定し(S608)、DistributedUnLock(L)で分散ロックを解放して(S607)、delete命令に係る処理を終了する。
【0071】
以上が第2実施形態における共有制御型KVS10の動作である。これにより、複数のKVS処理モジュール11がネットワーク上に分散して存在する場合にも第1実施形態と同じ効果を奏する。つまり、同一のKVSを共有するメンバー間で、あるメンバーが自らset命令を発行していないKVエントリに誤ってget命令やdelete命令を実行してしまうことに起因したKVS利用アプリケーションの誤動作を防げるという効果を奏する。
【0072】
(第3実施形態)
次に、第3実施形態について説明する。第3実施形態は、KVS操作命令およびKVS管理命令のセキュリティ検証機能を有する共有制御型KVSに関する。特に、攻撃者を含む不特定多数の外部エンティティがKVS操作命令およびKVS管理命令を発行する可能性がある場合に有効な実施形態である。KVS管理命令は、たとえば、register命令やderegister命令などである。第3実施形態の共有制御型KVSは、たとえばネットワークストレージ装置に適用される。当該ネットワークストレージ装置の構成は、第2実施形態と同様であり(図7参照)、ここでは、その説明を省略する。
【0073】
図12に、第3実施形態の、(第2実施形態で説明した)分散ロックモジュール111を使用しない場合の共有制御型KVS10の機能ブロックを示す。また、図13に、第3実施形態の、分散ロックモジュール111を使用する場合の共有制御型KVS10の機能ブロックを示す。図12図13の共有制御型KVS10の構成は、それぞれ、図2(第1実施形態)、図8(第2実施形態)の共有制御型KVS10の構成にメンバーテーブル14を追加したものとなるため、メンバーテーブル14の構成についてのみ説明する。
【0074】
メンバーテーブル14は、KVS操作命令を発行可能なメンバーのそれぞれについて、メンバー識別子とメンバー情報との組みを保持するテーブルである。
【0075】
メンバー識別子は、共有制御型KVS10内で一意な値である。メンバー識別子として、たとえばブロックチェーンノードのIDが使用されるかもしれない。
【0076】
メンバーテーブル14のメンバー情報は、公開鍵、リプレイカウンタおよび追加情報を含む。
【0077】
公開鍵は、当該メンバーが発行したKVS操作命令またはKVS管理命令に対して付与されるデジタル署名の検証に使用される公開鍵である。公開鍵は、信頼される認証局が発行するデジタル証明書に含まれるものとする。
【0078】
リプレイカウンタは、当該メンバーが発行したKVS操作命令またはKVS管理命令に対して付与されるリプレイ攻撃防止用カウンタである。リプレイカウンタの値は、KVS操作命令またはKVS管理命令が正しく検証された場合に1だけインクリメントされる。リプレイカウンタの初期値は0である。
【0079】
追加情報は、当該メンバーに関する任意の情報である。追加情報の使用例については後述する。
【0080】
メンバーテーブル14は、M個のエントリを持ち、メンバー識別子midi(i=1, ..., M)に対するメンバー情報は(pubkeyi, ctri, auxi)で表される。pubkeyiは公開鍵、ctriはリプレイカウンタ、auxiは追加情報を表す。
【0081】
KVS処理モジュール11は、外部からKVS管理命令を受信し、メンバーテーブル14を更新するかもしれない。第3実施形態は、KVS管理命令として、register命令とderegister命令とを定義する。
【0082】
register命令は、メンバーテーブル14のエントリ生成に使用する命令である。register命令は、メンバー識別子(memberID)、メンバーの公開鍵(pubkey)を含むデジタル証明書(cert)、リプレイカウンタ(ctr)およびデジタル署名(sig)を入力引数に持ち、かつ、オプション引数として追加情報(aux)を入力引数に持つ。
【0083】
deregister命令は、メンバーテーブル14のエントリ削除に使用する命令である。deregister命令は、メンバー識別子(memberID)、リプレイカウンタ(ctr)およびデジタル署名(sig)を入力引数に持つ。
【0084】
また、第3実施形態におけるKVS操作命令は、第1実施形態および第2実施形態におけるKVS操作命令での入力引数に加え、リプレイカウンタ値(ctr)およびデジタル署名(sig)を入力引数に持つ。デジタル署名(sig)には、sig以外のすべての入力引数のバイト列を入力引数が指定された順番に連結したバイト列に対してメンバーの秘密鍵を用いて計算した署名の値が入る。
【0085】
図14に、第3実施形態の、分散ロックモジュール111を使用しない場合の共有制御型KVS10のKVS操作命令(set命令、get命令またはdelete命令)に対するセキュリティ検証手順のフローチャートを示す。KVS操作命令の呼出し元のメンバーには、命令実行に必要なメンバー個別の属性や状態を保持する構造体(コンテキストと呼ぶ)が割り当てられており、呼出し元メンバーのコンテキストに付随してKVS操作命令が呼び出されるものとする。コンテキストの格納先としてメンバーテーブル14を使用してもよい。ここでは、KVS操作命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0086】
KVS操作命令を受信したKVS処理モジュール11は、まず、validate_ctr(memberID, ctr)でリプレイカウンタの検証を行う(S701)。Validateは、リプレイカウンタの検証を要求する命令である。また、ctrは、受信命令が入力引数として含むctrの値である。リプレイカウンタの検証は、ctrの値がmemberIDに対応するメンバーのメンバーテーブル14内のリプレイカウンタ値以上であれば成功し、そうでなければ失敗する。リプレイカウンタの検証が失敗した場合(S701:No)、KVS処理モジュール11は、エラーを返し(S704)、処理を終了する。
【0087】
一方、リプレイカウンタの検証が成功した場合(S701:Yes)、KVS処理モジュール11は、validate_sig(memberID, args, sig)で署名の検証を行う(S702)。argsは、受信命令のsig以外の入力引数の並びであり、sigは、受信命令が入力引数として含むsigの値である。署名の検証は、argsに対してmemberIDに対応するメンバーのメンバーテーブル14内の公開鍵を用いて署名計算を行い、計算した署名がsigに一致した場合に成功し、一致しなかった場合に失敗する。署名の検証が失敗した場合(S702:No)、KVS処理モジュール11は、エラーを返し(S704:No)、処理を終了する。
【0088】
署名の検証が成功した場合(S702:Yes)、KVS処理モジュール11は、set_ctr(memberID, ctr+1)でmemberIDに対応するメンバーのメンバーテーブル14内のリプレイカウンタを、ctrの値を1つインクリメントした値(ctr+1)に更新し(S703)、受信したKVS操作命令のセキュリティ検証後の処理を引続き行う。set_ctrは、リプレイカウンタの値を指定値に設定することを要求する命令である。KVS操作命令のセキュリティ検証後の処理は、第1実施形態の図3図4図5のフローチャートで示される。
【0089】
続いて、図15に、第3実施形態の、分散ロックモジュール111を使用する場合の共有制御型KVS10のKVS操作命令(set命令、get命令またはdelete命令)に対するセキュリティ検証手順のフローチャートを示す。KVS操作命令の呼出し元のメンバーには、命令実行に必要なメンバー個別の属性や状態を保持する構造体(コンテキストと呼ぶ)が割り当てられており、呼出し元メンバーのコンテキストに付随してKVS操作命令が呼び出されるものとする。コンテキストの格納先としてメンバーテーブル14を使用してもよい。ここでは、KVS操作命令呼出し元コンテキストのメンバー識別子をmemberIDとする。
【0090】
KVS操作命令またはKVS管理命令を受信したKVS処理モジュール11は、まず、L=DistributedLock("write")で分散ロックを獲得するまで待つ(S801)。その後、KVS処理モジュール11は、validate_ctr(memberID, ctr)でリプレイカウンタの検証を行う(S802)。リプレイカウンタの検証方法は、図14のステップS701の場合と同じである。リプレイカウンタの検証が失敗した場合(S701:No)、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S806)、エラーを返して(S807)、処理を終了する。
【0091】
一方、リプレイカウンタの検証が成功した場合(S802:Yes)、KVS処理モジュール11は、署名の検証を行う(S803)。リプレイカウンタの検証方法は、図14のステップ702の場合と同じである。署名の検証が失敗した場合(S803:No)、KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S806)、エラーを返して(S807)、処理を終了する。
【0092】
署名の検証が成功した場合(S803:Yes)、KVS処理モジュール11は、set_ctr(memberID, ctr+1)でmemberIDに対応するメンバーのメンバーテーブル14内のリプレイカウンタを、ctrの値を1つインクリメントした値(ctr+1)に更新する(S804)。KVS処理モジュール11は、DistributedUnLock(L)で分散ロックを解放し(S805)、受信したKVS操作命令のセキュリティ検証後の処理を引続き行う。KVS操作命令のセキュリティ検証後の処理は、第2実施形態の図9図10図11のフローチャートで示される。
【0093】
以上が第3実施形態における共有制御型KVS10の動作である。これにより、所定の認証局が発行したデジタル証明書の秘密鍵を持たないような攻撃者が発行したKVS操作命令を排除することが可能となり、第1実施形態および第2実施形態と同様の効果を奏しつつ、さらに、セキュリティが向上する効果を奏する。
【0094】
(第4実施形態)
次に、第4実施形態について説明する。第4実施形態は、データKV用ストレージの階層構成に関する。
【0095】
第4実施形態における共有制御型KVS10の構成は、メンバーセットKV13とデータKV12との構成を除けば、第1実施形態、第2実施形態または第3実施形態の共有制御型KVS10の構成と同じである。
【0096】
図16に、第4実施形態におけるメンバーセットKV13およびデータKV12(12-1,12-2)の一構成例を示す。
【0097】
メンバーセットKV13の各エントリの値には、(メンバーセット、タイムスタンプ)の組みが設定される。メンバーセットは、第1実施形態、第2実施形態または第3実施形態のメンバーセットと同じである。タイムスタンプには、このエントリに対して最後にset命令が実行された時刻が設定される。
【0098】
データKV12は、1次ストレージ3-1に格納されるデータKV12-1と、2次ストレージ3-2に格納されるデータKV12-2とに分かれる。
【0099】
KVS処理モジュール11は、メンバーセットKV13内の各検索キーKiについて、定期的に、または、検索キーKiに関するset命令が実行されたとき、以下のデータ移動処理を実行する。
【0100】
検索キーKiに対応するメンバーセットKV13のエントリのタイムスタンプTiが現在時刻Tnowから一定時間Tを減じた値以上(Tnow - T <= Ti)の場合には、KVS処理モジュール11は、検索キーKiに対して1次ストレージ3-1に格納されるデータKV12-1を使用する。その際、検索キーKiに対するデータKV12の現在の格納先が2次ストレージ3-2である場合には、KVS処理モジュール11は、格納先を2次ストレージ3-2から1次ストレージ3-1に移動する。一方、(Tnow - T >Ti)の場合には、KVS処理モジュール11は、検索キーKiに対して2次ストレージ3-2に格納されるデータKV-2を使用する。その際、検索キーKiに対するデータKV12の現在の格納先が1次ストレージ3-1である場合には、KVS処理モジュール11は、格納先を1次ストレージ3-1から2次ストレージ3-2に移動する。
【0101】
図16は、検索キーK1、K3、K6は、(Tnow - T <= Ti)のため、1次ストレージ3-1に格納されるデータKV12-1を使用し、一方、検索キーK2、K4、K5は、(Tnow - T >Ti)のため、2次ストレージ3-2に格納されるデータKV12-2を使用している状態を表している。
【0102】
以上が第4実施形態における共有制御型KVS10の動作である。これにより、set命令が長期間実行されないデータについては、このデータに対する更新頻度が低いとみなし、アクセス速度が小さいが低コストかつ大容量のストレージに格納することで、全体の処理性能を劣化させない範囲でストレージコストを削減する効果を奏する。
【0103】
なお、各実施形態におけるストレージ3は、ブロック型ストレージまたはKey-Value型ストレージのいずれであってもよく、また、SSD(Solid State Drive)、HDD(Hard Disk Drive)、SCM(Storage Class Memory)のいずれであってもよい。NVMe SSDにおいて、ブロック型ストレージの場合には、各実施形態のKVS処理モジュール11と外部モジュールとの間のI/Oコマンドとして、NVMeのReadコマンド、Writeコマンドをそれぞれ使用してもよい。NVMe SSDにおいて、Key-Value型ストレージの場合には、各実施形態のKVS処理モジュール11と外部モジュールとの間のI/Oコマンドとして、NVMeのRetrieveコマンド、Storeコマンドをそれぞれ使用してもよい。
【0104】
また、各実施形態において、メンバーセットのデータ構造は、ビットマップ、リスト、カウンタ付ブルームフィルタ、その他のデータ構造を使用するかもしれない。以下、メンバーセットのデータ構造が、ビットマップ、リストまたはカウンタ付ブルームフィルタの場合の一構成例をそれぞれ説明する。
【0105】
<ビットマップの場合>
ビットマップの各要素は、1か0のいずれかである。member_set.add(memberID)は、ビットマップ内のメンバー識別子(memberID)に対応するビットをオンにする処理を行う。member_set.delete(memberID)は、ビットマップ内のメンバー識別子(memberID)に対応するビットをオフにする処理を行う。member_set.contains(memberID)は、メンバー識別子(memberID)に対応するビットがオンであれば真を返し、オフであれば偽を返す。member_set.empty()は、ビットマップの全てのビットが0であれば真を返し、そうでなければ偽を返す。メンバー識別子とビットとの対応は、たとえばメンバー識別子のハッシュ値をビット番号としてもよく、メンバーテーブルを使用する場合には、各メンバー識別子に対して一意なビット番号を何らかの方法で割り当て、メンバーテーブルの追加情報に割り当てたビット番号を保持してもよい。
【0106】
<リストの場合>
リストの各要素は、メンバー識別子である。member_set.add(memberID)は、リストにメンバー識別子(memberID)を追加する処理を行う。member_set.delete(memberID)は、リストからメンバー識別子(memberID)を削除する処理を行う。member_set.contains(memberID)は、リストにメンバー識別子(memberID)が含まれれば真を返し、含まれなければ偽を返す。member_set.empty()は、リストに含まれる要素数が0であれば真を返し、そうでなければ偽を返す。
【0107】
<カウンタ付きブルームフィルタの場合>
カウンタ付きブルームフィルタは、固定長LCBFの配列で、配列先頭を0番目とし、各配列要素はカウンタ値である。カウンタ付きブルームフィルタは、0以上(LCBF-1)以下の整数値を出力するk個のハッシュ関数H1, ..., Hkを使用する。いま、メンバー識別子(memberID)に対するk個のハッシュ関数値をi1=H1(memberID), ..., ik=Hk(memberID)とする。member_set.add(memberID)は、カウンタ付きブルームフィルタ配列のi1番目、…、ik番目の値をそれぞれ1だけインクリメントする処理を行う。member_set.delete(memberID)は、カウンタ付きブルームフィルタ配列のi1番目、…、ik番目の値をそれぞれ1だけデクリメントする処理を行う。member_set.contains(memberID)は、カウンタ付きブルームフィルタ配列のi1番目、…、ik番目の値がすべて1以上であれば真を返し、そうでなければ偽を返す。member_set.empty()は、カウンタ付きブルームフィルタ配列内のすべての要素の値が0であれば真を返し、そうでなければ偽を返す。
【0108】
以上のように、各実施形態によれば、同一のKVSを共有するメンバー間で、あるメンバーが自らset命令を発行していないKVエントリに誤ってget命令やdelete命令を実行してしまうことに起因したKVS利用アプリケーションの誤動作を誘発することなく、メンバー間で同一のKVエントリの実体を共有することが可能となり、その結果、ストレージ容量を1/N(N:共有メンバー数)に抑えることが可能となる。
【0109】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0110】
1…CPU、2…メインメモリ、3…ストレージ、3A,3B…IO制御モジュール、4…非ストレージPCIeデバイス、5…メモリバス、6…PCIeバス、7…ネットワークインターフェース部、10…共有制御型KVS、11…KVS処理モジュール、12…データKV、13…メンバーセットKV、14…メンバーテーブル、100…計算機、111…分散ロックモジュール、200…ネットワークストレージ装置、300…ストレージクライアント装置。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16