(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024162442
(43)【公開日】2024-11-21
(54)【発明の名称】ストレージシステム及びメモリ管理方法
(51)【国際特許分類】
G06F 11/20 20060101AFI20241114BHJP
G06F 3/06 20060101ALI20241114BHJP
G06F 13/10 20060101ALI20241114BHJP
【FI】
G06F11/20 689
G06F3/06 306Z
G06F13/10 340A
【審査請求】未請求
【請求項の数】13
【出願形態】OL
(21)【出願番号】P 2023077946
(22)【出願日】2023-05-10
(71)【出願人】
【識別番号】524132520
【氏名又は名称】日立ヴァンタラ株式会社
(74)【代理人】
【識別番号】110002365
【氏名又は名称】弁理士法人サンネクスト国際特許事務所
(72)【発明者】
【氏名】伊藤 晋太郎
(72)【発明者】
【氏名】田島 幸恵
(72)【発明者】
【氏名】山本 貴大
(72)【発明者】
【氏名】大平 良徳
【テーマコード(参考)】
5B034
【Fターム(参考)】
5B034BB02
5B034CC02
(57)【要約】
【課題】性能と信頼性の高さを兼ね備えたストレージシステムを実現する。
【解決手段】ストレージシステムは、プロセッサとメモリとを有する複数のストレージノードと、記憶装置と、を備え、複数のストレージノードの各々は、プロセッサ上で稼働するストレージ制御部を有し、複数のストレージ制御部は、記憶装置に入出力されるデータを処理するアクティブのストレージ制御部と、アクティブのストレージ制御部からデータの処理を引き継ぐスタンバイのストレージ制御部と、が含まれ、アクティブのストレージ制御部と、スタンバイのストレージ制御部と、は、それぞれ、メモリの記憶領域が割り当てられており、ストレージノードは、ストレージ制御部の状態がスタンバイとアクティブとの間で切り替わる場合に、自ノードが有するストレージ制御部に対するメモリ容量の割り当て量を変更する。
【選択図】
図15
【特許請求の範囲】
【請求項1】
プロセッサとメモリとを有する複数のストレージノードと、記憶装置と、を備え、
前記複数のストレージノードの各々は、前記プロセッサ上で稼働するストレージ制御部を有し、
複数の前記ストレージ制御部は、前記記憶装置に入出力されるデータを処理するアクティブのストレージ制御部と、前記アクティブのストレージ制御部から前記データの処理を引き継ぐスタンバイのストレージ制御部と、が含まれ、
前記アクティブのストレージ制御部と、前記スタンバイのストレージ制御部と、は、それぞれ、前記メモリの記憶領域が割り当てられており、
前記ストレージノードは、前記ストレージ制御部の状態がスタンバイとアクティブとの間で切り替わる場合に、自ノードが有するストレージ制御部に対するメモリ容量の割り当て量を変更する
ことを特徴とするストレージシステム。
【請求項2】
請求項1に記載のストレージシステムであって、
前記ストレージ制御部の状態をスタンバイからアクティブに切り替える場合に、当該ストレージ制御部に割り当てるメモリ容量を増加させる
ことを特徴とするストレージシステム。
【請求項3】
請求項2に記載のストレージシステムにおいて、
前記メモリ容量を増加させた場合に、同じストレージノードの他のストレージ制御部へのメモリ割り当て量を減少させる
ことを特徴とするストレージシステム。
【請求項4】
請求項1に記載のストレージシステムであって、
前記ストレージ制御部の状態をアクティブからスタンバイに切り替える場合に、当該ストレージ制御部に割り当てるメモリ容量を減少させる
ことを特徴とするストレージシステム。
【請求項5】
請求項1に記載のストレージシステムであって、
前記アクティブのストレージ制御部と、その処理を引き継ぐ前記スタンバイのストレージ制御部とで、冗長化グループを構成し、
同じ冗長化グループ内の複数のストレージ制御部は、各々異なるノードに配置され、同じノード内に、異なる冗長化グループに属する複数のストレージ制御部が配置され、
前記冗長化グループ内の複数のストレージシステムで、前記データを冗長化して前記記憶装置に格納する
ことを特徴とするストレージシステム。
【請求項6】
請求項5に記載のストレージシステムにおいて、
前記ストレージ制御部に割り当てられるキャッシュには、前記記憶装置にライトするためのデータを格納するダーティキャッシュと、前記記憶装置から読み出されたデータを格納するクリーンキャッシュと、が格納され、
前記アクティブのストレージ制御部は、前記スタンバイのストレージ制御部よりもクリーンキャッシュの格納量が多い
ことを特徴とするストレージシステム。
【請求項7】
請求項6に記載のストレージシステムであって、
前記ストレージノードは、アクティブのストレージ制御部を1つとスタンバイのストレージ制御部を2つ有し、前記スタンバイのストレージ制御部の一方がアクティブに切り替わった場合には、他方のスタンバイのストレージ制御部がクリーンキャッシュの保持に使用するメモリの容量を少なくすることを特徴とするストレージシステム。
【請求項8】
請求項6に記載のストレージシステムであって、
前記ストレージノードは、自ノードの全ストレージ制御部が保持するキャッシュの容量の合計から、自ノードの全ストレージ制御部が保持するダーティキャッシュの容量の合計を減算し、自ノードのストレージ制御部の数で除算し、得られた値に各々のストレージ制御部のダーティキャッシュの容量を加えることで、各々のストレージ制御部の目標キャッシュ容量を算出することを特徴とするストレージシステム。
【請求項9】
請求項1に記載のストレージシステムであって、
前記ストレージノードは、ユーザデータの圧縮が可能であり、圧縮に関するメタデータをキャッシュデータに含むことを特徴とするストレージシステム。
【請求項10】
請求項6に記載のストレージシステムであって、
前記ストレージノードは、自ノードの全ストレージ制御部が保持するキャッシュの容量の合計から、自ノードの全ストレージ制御部が保持するダーティキャッシュの容量の合計を減算し、自ノードの全ストレージ制御部が保持するメタデータのクリーンキャッシュの容量の合計を減算し、自ノードのストレージ制御部の数で除算し、得られた値に各々のストレージ制御部のダーティキャッシュの容量とメタデータのクリーンキャッシュの容量を加えることで、各々のストレージ制御部の目標キャッシュ容量を算出することを特徴とするストレージシステム。
【請求項11】
請求項6に記載のストレージシステムであって、
前記ストレージノードは、自ノードの各々のストレージ制御部に目標キャッシュ容量を設定し、いずれかのストレージ制御部のキャッシュ容量が目標キャッシュ容量よりも大きい場合には当該ストレージ制御部のキャッシュの容量を削減することを特徴とするストレージシステム。
【請求項12】
請求項11に記載のストレージシステムであって、
前記ストレージノードは、クリーンキャッシュを優先的に減らしてキャッシュの容量を削減し、前記クリーンキャッシュを減らし切った後にさらにキャッシュの容量削減が必要であれば、ダーティキャッシュをデステージしてキャッシュの容量を削減することを特徴とするストレージシステム。
【請求項13】
プロセッサとメモリとを有する複数のストレージノードと、記憶装置と、を備え、前記複数のストレージノードの各々が、前記プロセッサ上で稼働するストレージ制御部を有するストレージシステムのメモリ管理方法であって、
複数の前記ストレージ制御部は、前記記憶装置に入出力されるデータを処理するアクティブのストレージ制御部と、前記アクティブのストレージ制御部から前記データの処理を引き継ぐスタンバイのストレージ制御部と、が含まれ、
前記アクティブのストレージ制御部と、前記スタンバイのストレージ制御部と、は、それぞれ、前記メモリの記憶領域が割り当てられており、
前記ストレージノードが、前記ストレージ制御部の状態をスタンバイとアクティブとの間で切り替えるステップと、
前記ストレージノードが、自ノードが有する複数のストレージ制御部に対するメモリ容量の割り当てを変更するステップと
を含むことを特徴とするメモリ管理方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ストレージシステム及びメモリ管理方法に関する。
【背景技術】
【0002】
従来、ストレージシステムにおいて、可用性及び信頼性向上のために冗長化構成が採用されている。
例えば、特許文献1にて、次のようなストレージシステムが提案されている。
複数のストレージノードを有する記憶システムにおいて、ストレージノードが、それぞれ記憶領域を提供する1又は複数の記憶装置と、上位装置からの要求に応じて、要求されたデータを対応する記憶装置に読み書きする1又は複数のストレージ制御部を設けている。各ストレージ制御部は、それぞれ上位装置からの要求に応じて要求されたデータを対応する記憶装置に読み書きするために必要な所定の構成情報を保持し、複数の制御ソフトウェアが冗長化グループとして管理され、同一の冗長化グループに属する各制御ソフトウェアがそれぞれ保持する構成情報は同期して更新され、冗長化グループを構成する複数の制御ソフトウェアを、各ストレージノードの負荷を分散するように、それぞれ異なる前記ストレージノードに配置する。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
特許文献1によれば、ソフトウェアによりストレージシステムを構築する技術(ソフトウェアデファインドストレージ:SDS)を用い、ノード障害時にも読み書きを継続できるストレージシステムを構築できる。特許文献1では、ある冗長化グループに属する現用系(アクティブ)のストレージ制御ソフトと、別の冗長化グループに属する待機系(スタンバイ)のストレージ制御ソフトとを同じサーバに配置することによって、サーバを効率よく利用しつつストレージ制御ソフトの可用性を高める技術が開示されている。
また、特許文献1にはアクティブストレージ制御ソフトとスタンバイストレージ制御ソフトの間でストレージ制御ソフトの制御に必要なメモリ上の情報を冗長化することが開示されている。メモリ上の情報にはキャッシュデータも含まれる。
しかし、キャッシュデータには、冗長化が必要なデータと必要でないデータが含まれており、その区別無しに全て冗長化し、またそのための容量をスタンバイ制御ソフト用にも確保していると、メモリの容量効率が悪くなる。
【課題を解決するための手段】
【0005】
上記目的を達成するために、代表的な本発明のストレージシステムの一つは、プロセッサとメモリとを有する複数のストレージノードと、記憶装置と、を備え、前記複数のストレージノードの各々は、前記プロセッサ上で稼働するストレージ制御部を有し、複数の前記ストレージ制御部は、前記記憶装置に入出力されるデータを処理するアクティブのストレージ制御部と、前記アクティブのストレージ制御部から前記データの処理を引き継ぐスタンバイのストレージ制御部と、が含まれ、前記アクティブのストレージ制御部と、前記スタンバイのストレージ制御部と、は、それぞれ、前記メモリの記憶領域が割り当てられており、前記ストレージノードは、前記ストレージ制御部の状態がスタンバイとアクティブとの間で切り替わる場合に、自ノードが有するストレージ制御部に対するメモリ容量の割り当て量を変更することを特徴とする。
また、代表的な本発明のメモリ管理方法の一つは、プロセッサとメモリとを有する複数のストレージノードと、記憶装置と、を備え、前記複数のストレージノードの各々が、前記プロセッサ上で稼働するストレージ制御部を有するストレージシステムのメモリ管理方法であって、複数の前記ストレージ制御部は、前記記憶装置に入出力されるデータを処理するアクティブのストレージ制御部と、前記アクティブのストレージ制御部から前記データの処理を引き継ぐスタンバイのストレージ制御部と、が含まれ、前記アクティブのストレージ制御部と、前記スタンバイのストレージ制御部と、は、それぞれ、前記メモリの記憶領域が割り当てられており、前記ストレージノードが、前記ストレージ制御部の状態をスタンバイとアクティブとの間で切り替えるステップと、前記ストレージノードが、自ノードが有する複数のストレージ制御部に対するメモリ容量の割り当てを変更するステップとを含むことを特徴とする。
【発明の効果】
【0006】
本発明によれば、性能と信頼性の高さを兼ね備えたストレージシステムを実現することができる。上記した以外の課題、構成及び効果は以下の実施の形態の説明により明らかにされる。
【図面の簡単な説明】
【0007】
【
図5】ストレージ制御部のソフトウェアモジュール構造
【
図13】キャッシュデータ更新処理のフローチャート
【
図14】フェイルオーバー時の処理のフローチャート
【
図15】フェイルオーバー時キャッシュ容量変更処理のフローチャート
【
図19】3重化時のキャッシュ割当容量管理テーブルの例
【
図20】3重化時のフェイルオーバー時キャッシュ容量変更処理
【
図22】メタデータを管理するキャッシュ割当容量管理テーブルの例
【
図23】メタデータを考慮するキャッシュ容量変更処理のフローチャート
【
図24】キャッシュヒット率を管理するキャッシュ割当容量管理テーブルの例
【
図25】キャッシュヒット率を考慮するキャッシュ容量変更処理のフローチャート
【
図27】フェイルバック時のキャッシュ容量変更処理のフローチャート
【発明を実施するための形態】
【0008】
以下、図面について、本発明の実施の形態を詳述する。実施の形態は、例えば、1以上のSDSが実装された複数のストレージノードを備えるストレージシステムに関するものである。
【0009】
開示する実施の形態においては、ストレージノードはメモリ上に制御情報やキャッシュデータを格納する。そしてストレージノードは不揮発デバイスを備える。ホストからの書き込み要求に応じて制御情報やデータを更新する際に、更新データをログ形式でこの不揮発デバイスに格納してホストに応答する。この時、制御情報やデータを追記書き形式で格納する。
【実施例0010】
(1)実施例1
(1-1)実施例1のストレージシステムの構成
図1において、全体として実施例1のストレージシステムを示す。
ストレージシステムは、例えば、複数のホスト装置(Host)100と、複数のストレージノード(Storage Node)300と、管理ノード(Management Node)200とを備える。ホスト装置100とストレージノード300と管理ノード200とは、ファイバーチャネル(Fibre Channel)、イーサネット(登録商標)、LAN(Local Area Network)等から構成されるネットワークを介して相互に接続される。
【0011】
ホスト装置100は、ユーザ操作、実装されたアプリケーションプログラム等からの要求に応じて、ストレージノード300に対してリード要求またはライト要求(以下、適宜、これらをまとめてI/O(Input/Output)要求と呼ぶ)を送信する汎用のコンピュータ装置である。なお、ホスト装置100は、仮想マシンのような仮想的なコンピュータ装置であってもよい。
【0012】
ストレージノード300は、データを読み書きするための記憶領域をホスト装置100に対して提供するコンピュータ装置である。ストレージノード300は、例えば、汎用のサーバ装置である。
【0013】
管理ノード200は、システム管理者が本ストレージシステム全体を管理するために利用するコンピュータ装置である。管理ノード200は、複数のストレージノード300をクラスタと呼ぶグループとして管理する。なお、
図1では、クラスタが1つのみ設けられた例を示しているが、ストレージシステム内に複数のクラスタを設けるようにしてもよい。
【0014】
図2は、ストレージノード300の物理構成の一例を示す図である。
ストレージノード300は、CPU(Central Processing Unit)303、メモリ302、複数の記憶デバイス(Drive)301および通信装置(NIC:Network Interface Card)304を備える。
CPU303は、ストレージノード300全体の動作制御を司るプロセッサである。メモリ302は、SRAM(Static RAM(Random Access Memory))、DRAM(Dynamic RAM)等の半導体メモリから構成される。メモリ302は、各種のプログラム、必要なデータを一時的に保持するために利用される。メモリ302に格納されたプログラムをCPU303が実行することにより、後述のようなストレージノード300全体としての各種の処理が実行される。
【0015】
記憶デバイス301は、SSD(SolID State Drive)、SAS(Serial Attached SCSI(Small Computer System Interface))ハードディスクドライブ、SATA(Serial ATA(Advanced TechNology Attachment))ハードディスクドライブ等の1または複数種類の大容量の不揮発性の記憶装置から構成される。記憶デバイス301は、ホスト装置100からのI/O要求に応じてデータをリードまたはライトするための物理的な記憶領域を提供する。
【0016】
通信装置304は、ストレージノード300がネットワークを介してホスト装置100、他のストレージノード300または管理ノード200と通信を行うためのインターフェースである。通信装置304は、例えば、NIC、FCカード等から構成される。通信装置304は、ホスト装置100、他のストレージノード300または管理ノード200との通信時におけるプロトコル制御を行う。
【0017】
図3は、ストレージノードの論理構成の一例を示す図である。
ストレージノード300は、フロントエンドドライバ(Front-end driver)510と、バックエンドドライバ(Back-end driver)540と、1または複数のストレージ制御部(Storage Controller)520と、データ保護制御部(Data Protection Controller)540と、を備える。
【0018】
フロントエンドドライバ510は、通信装置304を制御し、ストレージ制御部520に対してホスト装置100、他のストレージノード300または管理ノード200との通信時における抽象化したインターフェースをCPU303に提供する機能を有するソフトウェアである。
【0019】
バックエンドドライバ540は、自ストレージノード内の各記憶デバイスを制御し、各記憶デバイスとの通信時における抽象化したインターフェースをCPU303に提供する機能を有するソフトウェアである。
【0020】
ストレージ制御部520は、SDSのコントローラとして機能するソフトウェア、すなわち制御ソフトである。ストレージ制御部520は、ホスト装置100からのI/O要求を受け付け、当該I/O要求に応じたI/Oコマンドをデータ保護制御部に発行する。また、ストレージ制御部520は、論理ボリューム構成機能を有する。論理ボリューム構成機能は、データ保護制御部530が構成した論理チャンクとホスト装置100に提供する論理ボリュームを対応付ける。例えばストレートマッピング(論理チャンクと論理ボリュームを1:1で対応付け、論理チャンクのアドレスと論理ボリュームのアドレスを同じとする)方式でも良いし、仮想ボリューム機能(ThinProvisioning)方式(論理ボリュームと論理チャンクを小サイズの領域(ページ)に分け、ページ単位で論理ボリュームと論理チャンクのアドレス同士を対応付ける方式)を採っても良い。
【0021】
実施例1の場合、ストレージノード300に実装された各ストレージ制御部520は、別のストレージノード300に配置された他のストレージ制御部520と共に冗長構成を構成するペアとして管理される。以下においては、このペアをストレージ制御部グループと呼ぶものとする。
なお、
図3では、2つのストレージ制御部520により1つのストレージ制御部グループが構成される場合を示している。
【0022】
ストレージ制御部グループでは、一方のストレージ制御部520がホスト装置100からのI/O要求を受け付けることができる状態(現用系の状態であり、以下、アクティブモードと呼ぶ)に設定される。また、ストレージ制御部グループでは、他方のストレージ制御部520がホスト装置100からのI/O要求を受け付けない状態(待機系の状態であり、以下、スタンバイモードと呼ぶ)に設定される。
【0023】
そして、ストレージ制御部グループでは、アクティブモードに設定されたストレージ制御部(以下、アクティブストレージ制御部と呼ぶ)、アクティブストレージ制御部が配置されたストレージノードに障害が発生した場合等に、それまでスタンバイモードに設定されていたストレージ制御部(以下、スタンバイストレージ制御部と呼ぶ)の状態がアクティブモードに切り替えられる。これにより、アクティブストレージ制御部が稼働し得なくなった場合に、当該アクティブストレージ制御部が実行していたI/O処理を、スタンバイストレージ制御部により引き継ぐことができる。
【0024】
データ保護制御部530は、各ストレージ制御部グループに対して自ストレージノード内または他のストレージノード内の記憶デバイスが提供する物理的な記憶領域を割り当てると共に、ストレージ制御部から与えられる上述のI/Oコマンドに従って、指定されたデータを対応する記憶デバイスにリードまたはライトする機能を有するソフトウェアである。
この場合、データ保護制御部530は、ストレージ制御部グループに対して他のストレージノード内の記憶デバイスが提供する物理的な記憶領域を割り当てたときには、当該他のストレージノードに実装されたデータ保護制御部と協働して、そのデータ保護制御部530との間でネットワークを介してデータをやり取りすることにより、そのストレージ制御部グループのアクティブストレージ制御部から与えられたI/Oコマンドに従ってそのデータをその記憶領域にリードまたはライトする。
【0025】
図4は、メモリの構成図の一例である。メモリ内には、ストレージ制御情報410、キャッシュデータ領域420が格納される。
ストレージ制御情報410は、様々なストレージ機能を実現するための制御情報が格納される領域であり、一例として、キャッシュディレクトリ411、キャッシュ割当容量管理テーブル412、フリーキャッシュ容量管理テーブル413がある。キャッシュディレクトリ411は
図6にて、キャッシュ割当容量管理テーブル412は
図7にて、フリーキャッシュ容量管理テーブル413は
図8にて説明する。
【0026】
図5は、ストレージ制御部520のソフトウェアモジュール構造の一例を示す図である。
ストレージ制御部520は、制御情報更新処理524、キャッシュデータ更新処理525、リード処理521およびライト処理522、非同期デステージ処理523を実行する。各処理の詳細については後述する。
【0027】
以下、制御情報について説明する。
図6は、キャッシュディレクトリ411の一例を示す図である。キャッシュディレクトリ411はキャッシュエリアを細分化した領域(キャッシュセグメント)の管理情報であり、キャッシュセグメントそれぞれに対応するエントリを持つ。
【0028】
各エントリには、キャッシュアドレス、論理ボリューム番号、論理ボリュームアドレス、属性エントリがある。キャッシュアドレスは各エントリが対応するキャッシュセグメントのメモリ上のアドレスを指し、論理ボリューム番号と論理ボリュームアドレスは、当該キャッシュセグメントに格納されているデータが、どの論理ボリュームのどのアドレスのものであるかを指し示す。キャッシュセグメントにデータが格納されていない場合は「値無し」を示す「-」が格納される。キャッシュセグメントにデータが格納されている場合、属性フィールドにDirtyまたはCleanの値を持つ。Dirtyとは、当該データがまだデステージされておらず、記憶デバイスに書き込まれていないことを示し、Cleanは当該データがデステージ済であり記憶デバイスに書き込まれた値と一致することを示す。
【0029】
図7は、キャッシュ割当容量管理テーブル412を示す。キャッシュ割当容量管理テーブル412は全ノードの各冗長化グループを構成するストレージ制御部520毎にエントリを持ち、それぞれのエントリはノードID、冗長化グループID、Active/Standby状態、割当済キャッシュ容量、目標キャッシュ容量、クリーンキャッシュ使用量、ダーティキャッシュ使用量、未使用キャッシュ量のフィールドを持つ。ノードIDは当該ストレージ制御部520が配置されたノード、冗長化グループIDは当該ストレージ制御部520の所属する冗長化グループ、Active/Standby状態は各ストレージ制御部520のActive/Standby状態を示す。割当済キャッシュ容量は当該ストレージ制御部520にそのノード内のメモリから割り当てられた論理的な容量を示し、クリーンキャッシュ使用量及びダーティキャッシュ使用量は、それぞれ割り当てられたキャッシュ容量のうちクリーンデータ用・ダーティデータ用に使用している容量を示している。未使用キャッシュ量は、割当済キャッシュ容量のうち、クリーンキャッシュにもダーティキャッシュにも使用されていないフリーキャッシュ容量である。
ダーティキャッシュは、記憶装置(記憶デバイス301)にライトするためのデータを格納するキャッシュである。ストレージ制御部520は、ライト時に、ライトデータをキャッシュに一時保存してから、記憶装置に格納する。そのため、ダーティデータは、記憶装置内に同じデータがない(=ダーティ)。冗長化をおこなっているため、アクティブでもスタンバイでも同様にダーティキャッシュを格納する。
クリーンキャッシュは、記憶装置(記憶デバイス301)から読み出されたデータを格納するキャッシュである。ストレージ制御部520は、リード時に、リードデータを記憶装置から読み出し、キャッシュに格納し、それをリード要求元に転送する。所定期間キャッシュに格納し、再度のリードがあった場合には、キャッシュから読み出して転送する。そのため、クリーンキャッシュは、記憶装置内に同じデータが存在する(=クリーン)。
リードは原則としてアクティブのストレージ制御部の作業であるため、クリーンキャッシュはアクティブストレージ制御部の方が多いことが好適である。
【0030】
同一の冗長化グループに属するアクティブストレージ制御部とスタンバイストレージ制御部は、ダーティキャッシュを冗長化しているため、ダーティキャッシュ使用量が同一である。一方、クリーンキャッシュはアクティストレージ制御部の応答性能向上のために保持しているので、スタンバイストレージ制御部のクリーンキャッシュ使用量は、同一の冗長化グループに属するアクティブストレージ制御部のクリーンキャッシュ使用量よりも少なくて良い。例えば、冗長化グループID0のダーティキャッシュ使用量は、アクティブとスタンバイの双方で20GBである。一方、冗長化グループID0のクリーンキャッシュ使用量は、アクティブで40GBであるのに対し、スタンバイでは5GBである。
ダーティキャッシュ使用量とクリーンキャッシュ使用量は、目標キャッシュ容量に基づいて調整される。目標キャッシュ容量については後述のキャッシュ容量調整処理(
図17)にて説明する。
【0031】
アクティブストレージ制御部に割り当てているキャッシュ容量に対して、同じ冗長化グループを構成するスタンバイストレージ制御部に対してはキャッシュ割当容量を少なくしても良い。なぜなら、後述するようにクリーンキャッシュに関しては冗長化する必要性が必ずしも無く、スタンバイストレージ制御部側ではその容量を確保する必要が無いからである。このようにすることでメモリ容量効率を高められる。
【0032】
図8は、フリーキャッシュ容量管理テーブルを示す。フリーキャッシュ容量管理テーブル413は各ノードに対応するエントリを持ち、各エントリはノードID、トータルキャッシュ容量、割当済キャッシュ容量、フリーキャッシュ容量のフィールドを持つ。
【0033】
図9はリード処理のフローチャートの例である。リード処理521はホストからリードI/Oコマンドを受領した際に呼び出され、ストレージ制御部520が実行する。まずフロントエンドドライバ510を介してホスト装置100から送信されたリードコマンドを受け取り、これを解釈してリード対象の論理ボリューム番号と論理ボリュームアドレスを得る(ステップ4001)。次に、キャッシュヒットかどうかを判定する(ステップ4002)。具体的には、キャッシュディレクトリ411を参照し、キャッシュディレクトリ411に当該論理ボリューム番号と論理ボリュームアドレスに対応するエントリを探し、ある場合は(ヒット)、当該エントリからキャッシュアドレスを参照し、分岐をYesに進んでキャッシュエリアからデータをリードして(ステップ4006)、ホスト装置100にデータを応答する(ステップ4007)。
【0034】
キャッシュディレクトリ411に当該論理ボリューム番号と論理ボリュームアドレスに対応するエントリが無い場合(ミス)、分岐をNoへ進み、ステージング処理を呼び出す(ステップ4003)。ステージング処理はデータ保護制御部530によって実行される処理であり、記憶デバイス上の永続化領域から当該論理ボリューム番号/論理ボリュームアドレスに対応するデータを読み出す。読み出したデータはメモリ302上のキャッシュデータ領域420に格納する(ステップ4004)。この際、後述のキャッシュデータ更新処理を、冗長化要否を「不要」と設定して呼び出す。キャッシュディレクトリ411を更新する(ステップ4005)。この際、キャッシュディレクトリは制御情報の一つであるため、後述の制御情報更新処理を呼び出す。この時キャッシュデータ更新同様に冗長化要否を「不要」に設定して呼び出す。また、キャッシュ割当容量管理テーブル412の更新(リードによるクリーンキャッシュ使用量増加)を行う。そしてキャッシュヒットした場合と同様にキャッシュからデータをリードし(ステップ4006)、ホストにデータを応答する(ステップ4007)。
【0035】
図10はライト処理を示すフローチャートの例である。ライト処理522はストレージ制御部520が実行する。まずフロントエンドドライバ510を介してホスト装置100から送信されたライトコマンドを受け取り、これを解釈してライト対象の論理ボリューム番号と論理ボリュームアドレスを得る(ステップ4101)。次に、キャッシュヒットかどうかを判定する(ステップ4102)。具体的には、キャッシュディレクトリ411を参照し、キャッシュディレクトリ411に当該論理ボリューム番号と論理ボリュームアドレスに対応するエントリを探し、ある場合は(ヒット)、当該エントリからキャッシュアドレスを参照し、分岐をYesに進み、キャッシュにデータを格納する(ステップ4104)。この際、後述のキャッシュデータ更新処理を、冗長化要否を「要」と設定して呼び出す。次にそれぞれに対応するキャッシュディレクトリ411を更新する(ステップ4105)。この際、キャッシュディレクトリ411は制御情報の一つであるため、後述の制御情報更新処理を呼び出す。この時キャッシュデータ更新同様に冗長化要否を「要」に設定して呼び出す。また、キャッシュ割当容量管理テーブルの更新(ライトによるダーティキャッシュ使用量増加)を行う。次に後述の制御情報確定処理を呼び出す(ステップ4106)。そして最後にホストにライト成功を応答する(ステップ4107)。
【0036】
キャッシュミスの場合は分岐をNoに進み、キャッシュセグメントを確保する(4103)、キャッシュセグメント確保も制御情報更新処理を呼び出して行う。この際冗長化要否は要を設定する。その後はステップ4104に進み、以降はヒットした場合と同様である。
【0037】
図11は非同期デステージ処理のフローチャートである。非同期デステージ処理523は、キャッシュディレクトリ411から属性が「ダーティ」であるエントリを探し(ステップ4201)、このようなエントリが無ければ終了する(ステップ4202分岐No)。ダーティであるようなエントリがあれば(分岐Yes)、そのキャッシュセグメントを対象にデステージ処理を実行(ステップ4202ステップ4203)する。デステージ処理はデータ保護制御部530によって実行される処理であり、記憶デバイス上の永続化領域に当該論理ボリューム番号/論理ボリュームアドレスに対応するデータを書き出す。この際、ミラーリングやEC(Erasure Coding)といった技術を用いてデータを冗長化して格納しても良い。その後、キャッシュディレクトリ411からダーティキャッシュを削除する(ステップ4204)。この際、キャッシュディレクトリ更新であるため制御情報更新処理を冗長化要否を要に設定して呼び出して更新する。また、キャッシュ割当容量管理テーブル412を更新する。
【0038】
図12は制御情報更新処理のフローチャートである。制御情報更新処理524は、メモリ302上の制御情報を更新する際に呼び出される。呼び出される際に、更新対象の制御情報を特定するためのメモリアドレスとサイズ、更新値、および冗長化要否を示す情報が渡される。
まず、メモリ上の制御情報を更新する(ステップ4301)。次に渡された冗長化要否を参照し要否を判定する(ステップ4302)。要の場合のみ、メモリの制御情報を冗長化する(4303)。
【0039】
図13はキャッシュデータ更新処理のフローチャートである。更新対象が制御情報ではなくキャッシュデータである点を除いて、ステップ4401~4403はステップ4301~4303と同じである。
【0040】
図14はフェイルオーバー時の処理のフローチャートである。本処理はノード障害が起きた時に呼び出される。ノード障害を検出すると(ステップ4501)、まずActive/Standby切替処理を実行する(ステップ4502)。この処理は、障害を起こしたノードに配置されたアクティブストレージ制御部と同じ冗長化グループに属するスタンバイストレージ制御部のうち1つを新たにアクティブストレージ制御部へと変更する処理である。そして、新たにActiveになったストレージ制御部を含むノードを対象にフェイルオーバー時キャッシュ容量変更処理を実行する(ステップ4503)。フェイルオーバー時キャッシュ容量変更処理については
図15にて後述する。
【0041】
図15は、フェイルオーバー時キャッシュ容量変更処理のフローチャートである。まず、新たにActiveとなったストレージ制御部520を含むノードを調整対象として選定する(ステップ4601)。次に当該ノード内全ストレージ制御部520の割当済キャッシュ容量合計(A)の算出(ステップ4602)および当該ノード内全ストレージ制御部520のダーティキャッシュ使用量合計(B)の算出(ステップ4603)を行う。次に(A-B)÷2で目標クリーンキャッシュ使用量を算出する(ステップ4604)。当該ノードの各ストレージ制御部520について、自身のダーティキャッシュ使用量と目標クリーンキャッシュ使用量の合計を、目標キャッシュ容量として設定する(ステップ4605)。
最後に、このノード内の全ストレージ制御部520によってキャッシュ容量調整処理を実行させる(ステップ4606)。キャッシュ容量調整処理については
図17で説明する。
【0042】
図16は、上記キャッシュ容量調整処理における、キャッシュ容量管理テーブルの更新の仕方を示した例である。新たにActiveとなったノードID1に配置された冗長化グループID0のストレージ制御部520および元からノードID1に配置されてActive状態である冗長化グループID1のストレージ制御部520の両方について、目標キャッシュ容量フィールドが更新され、50GBに設定されている。
【0043】
図17は、キャッシュ容量調整処理のフローチャートである。目標キャッシュ容量と割り当て済キャッシュ容量に差がある場合は差を埋めるべくキャッシュ割当量を実際に調整する処理であり、各ストレージ制御部520によって実施される。この処理は、前述のフェイルオーバーの延長で実行され、また周期的に実行される。
【0044】
まず、キャッシュ割当容量管理テーブル412を参照し、目標キャッシュ容量と自ストレージ制御部への割当済キャッシュ容量を比較する(ステップ4701)。もし目標のほうが小さい場合、目標削減量を(割当済キャッシュ容量-目標キャッシュ容量)として設定し(ステップ4702)、ステップ4703に進む。
【0045】
ステップ4703では目標削減量に対し未使用キャッシュ量が小さくかつクリーンキャッシュ使用量があるかどうかをチェックする。YESなら、未使用キャッシュを減らしても目標キャッシュ容量まで下げられないので、自ストレージ制御部のクリーンキャッシュ使用量を減らす(ステップ4704)。次にまだ目標削減量に未使用キャッシュ量が達しなければ(ステップ4705)、自ストレージ制御部のダーティキャッシュ使用量を減らす(ステップ4706)。そしてステップ4702~ステップ4706にて増えた未使用キャッシュ量の分を解放し、自ストレージ制御部520のキャッシュ割当量を減らす(ステップ4707)。再びステップ4701に戻る。
【0046】
ステップ4701の分岐がNOの場合は、目標キャッシュ容量が割当済キャッシュ容量を上回るか否かを判定する(ステップ4708)。上回る場合、かつ当該ノードのフリーキャッシュ容量がゼロより大きい場合、自ストレージ制御部への割り当てキャッシュ容量を増やす(ステップ4709)。
【0047】
ステップ4704におけるクリーンキャッシュ使用量を減らす方法としては、キャッシュディレクトリテーブルのうちクリーン属性のエントリを削除すれば良い。クリーンキャッシュデータは失っても同じデータが既にデステージ済でありドライブから再度ステージングすれば読み出せることが保証されているため問題ない。
【0048】
ステップ4706におけるダーティキャッシュ使用量を減らす方法としては、例えば、ダーティデータのデステージを行ったうえでキャッシュディレクトリからエントリを削除する方法がある。または、デステージを行ってクリーンデータに変え、再びステップ4704にてクリーンキャッシュとして解放しても良い。
【0049】
本実施例では、ノード障害によってStandbyがActiveに変わる(フェイルオーバー)の契機で新たにActiveに変わったストレージ制御部520にキャッシュ割当容量を増やすことで、ノード障害のない正常時のキャッシュ利用効率を最大限高めると同時にノード障害時のヒット率低下を抑えることができ、性能が向上する。
【0050】
また、本実施例ではキャッシュデータやキャッシュディレクトリの更新の際に、リード処理では冗長化要否を「不要」に、ライト処理では冗長化要否を「要」に設定している。リード処理におけるキャッシュデータへ格納するデータは記憶デバイス上に同じデータがあるためノード障害で失っても再度ステージング可能であり、問題ない。そしてリード処理においてはメモリ冗長化のオーバヘッドが生じないため、性能が向上する。