GridDB 機能リファレンス

Revision: 4.5.0-236

1 はじめに

1.1 本書の目的と構成

本書では、GridDBの機能について説明します。

本書は、GridDBを用いたシステム設計・開発を行う設計・開発者およびGridDBの運用管理を行う管理者の方を対象としています。

本書は、以下のような構成となっています。

2 GridDBとは

GridDBは、キーと複数の値からなるデータ(ロウと呼ばれる)の集合を管理する、分散NoSQL型データベースです。 データをすべてメモリに配置するインメモリデータベースとしての構成に加え、ディスク(SSDも含む)とメモリの利用を併用したハイブリッド構成も取ることができます。ハイブリッド構成を用いることで、小規模、小メモリシステムでも活用可能です。

GridDBはビッグデータソリューションで必要となる3つのV(Volume,Variety,Velocity)に加え、データの信頼性/可用性を備えています。また、自律的なノード監視と負荷バランシング機能により、クラスタ運用の省力化が実現できます。

2.1 GridDBの特徴

2.1.1 大容量データ(Volume)

システムの規模拡大とともに扱うデータの容量は増大し、大容量データを素早く処理するためにはシステムの拡張が必要になります。

システムの拡張のアプローチには、大きく分けてスケールアップ(垂直スケーラビリティ)とスケールアウト(水平スケーラビリティ)の2つのアプローチがあります。

GridDBでは、動作するノードをスケールアップしてシステム増強する方法に加え、システムに新たなノードを追加し、稼働するクラスタに組み込むスケールアウトでシステムを拡張することもできます。

GridDBは、インメモリ処理データベースとしてもスケールアウトモデルで大容量化が可能です。GridDBでは、複数ノードで構成されるクラスタ内のノードにデータを分散配置します。複数ノードのメモリを1つの大きなメモリ空間として利用することで、大規模なメモリデータベースを提供できます。

また、メモリの利用だけでなく、ディスクを併用したハイブリッド構成のデータ管理も可能であるため、単体のノードで動作させた場合も、メモリサイズを超えたデータを保持して、アクセスができます。メモリサイズに制限されない大容量化も実現できます。

インメモリ/ディスクの併用
インメモリ/ディスクの併用

スケールアウトでのシステム拡張は、オンラインで行うことができます。そのため、運用中のシステムを停止することなく、システムの成長とともに増大するデータに対応できます。

スケールアウトでシステムに追加したノードには、システムの負荷に応じて適切にデータが配置されます。GridDBが負荷バランスを最適化するため、運用管理者がデータ配置を気にする必要はありません。このような運用を自動化する仕組みが組み込まれており、運用も容易です。

スケールアウトモデル
スケールアウトモデル

2.1.2 さまざまなデータ(Variety)

GridDBのデータは、Key-Valueを発展させたKey-Container型のデータモデルです。コンテナというRDBのテーブルに相当する器にデータを格納します。 (コンテナをRDBのテーブルとして考えるとわかりやすいです。)

GridDBのデータアクセスでは、Key-Valueデータベース構造のため、Keyで絞り込みができるモデルが最も高速に処理できます。管理する実体に対応して、キーとなるコンテナを用意するという設計が必要です。

データモデル
データモデル

コンテナには、センサ等の時々刻々発生する時間と値のペアになった大量の時系列のデータを扱うのに適したコンテナ(時系列コンテナ)に加え、位置情報などの空間データを登録し、空間固有の演算(空間の交差)を行うこともできます。配列型のデータやBLOBなどの非定型なデータにも対応しているため、さまざまなデータを扱うことができます。

時系列コンテナには、特有の圧縮機能や保持期限の切れたデータの解放機能などを提供しており、大量に発生するデータの管理に適しています。

2.1.3 高速処理(Velocity)

GridDBには、さまざまなアーキテクチャ上の工夫が組み込まれ、高速化を実現しています。

2.1.3.1 できるだけメモリ上で処理をする

全てのデータがメモリに配置されてインメモリで動作するシステムの場合、ディスクへのアクセスのオーバヘッドをあまり気にする必要がありません。しかし、メモリ上に保持できないほどの大量のデータを処理するためには、アプリケーションがアクセスするデータを局所化して、ディスクに配置されたデータへのアクセスをできるだけ少なくする必要があります。

GridDBでは、アプリケーションからのデータアクセスを局所化するために、関連のあるデータをできるだけ同じブロックに配置する機能を提供します。データにヒント情報を与えることで、ヒントに従ったデータブロックにデータを集約し、データアクセス時のメモリ内ヒット率を高め、データアクセス時間を高速化します。アプリケーションでのアクセス頻度やアクセスパターンに応じて、メモリ集約のヒントを設定することで、限られたメモリ領域を有効活用して動作させることができます(アフィニティ機能)。

2.1.3.2 オーバヘッドを減らす

データベースに対して並列にアクセスする時のロックやラッチなどによる、データベースの実行処理待ちとなる時間をできるだけ少なくするために、GridDBでは、CPUコア・スレッドごとに占有するメモリとデータベースファイルを割り当て、排他、同期処理の待ちをなくしています。

アーキテクチャ
アーキテクチャ

また、GridDBでは、クライアントライブラリ側で初回アクセス時にデータ配置をキャッシュすることで、クライアントとノード間は直接アクセス可能です。データ配置やクラスタの動作状況を管理するマスタノードを介さず、直接目的とするデータにアクセスできるので、マスタノードへのアクセス集中や、通信コストを大幅に削減できます。

クライアントからのアクセス
クライアントからのアクセス

2.1.3.3 並列に処理をする

GridDBでは、1つの巨大なデータを複数ノードに分散配置(パーティショニング)したノード間、およびノード内での並列処理と、少ないリソースで多くの要求を処理できるイベント駆動エンジンで、高速化を実現しています。

2.1.4 信頼性/可用性

クラスタ内ではデータを複製して、複数のノード上にデータ(レプリカ)を多重配置しています。レプリカの中で、マスタのデータをオーナ、複製したデータをバックアップと呼びます。クラスタを構成するいずれかのノードに障害が発生した場合でも、レプリカを使用することで処理を継続できます。ノード障害発生後のデータ再配置もシステムが自動的に行うため(自律的データ配置)、特別な運用操作は不要です。障害対象のノードに配置されていたデータはレプリカから復旧され、自動的に設定されたレプリカ数となるようにデータは再配置されます。

レプリカは、可用性の要求に応じて2重化、3重化など多重度の設定ができます。

各ノードはディスクを使用してデータ更新情報の永続化を行っています。クラスタシステムに障害が発生しても、ディスクに問題がなければ、それまで登録・更新したデータを失わずに復元することができます。

また、クライアントでもデータ配置管理情報のキャッシュを保有しているため、ノードの障害を検知すると自動的にフェイルオーバーし、レプリカを用いたデータアクセスを継続できます。

高可用性
高可用性

2.2 GridDBの製品

GridDBには、以下の製品があります。

上記製品はGridDBの特徴で説明した特徴で説明した特徴に加え、以下の2つの特徴を持ちます。

製品構成
製品構成

各インターフェースの特徴は以下のとおりです。

GridDBでは、NoSQL I/FとNewSQL I/Fの両方を用途によって使い分けることができます。

製品位置づけ
製品位置づけ

同一メジャーバージョン内(マイナーバージョンアップ時)では、GridDBのデータベースおよびNoSQL/NewSQLインターフェースの互換性があります。 バージョンの表記は、以下の通りです。

NoSQL I/FとNewSQL I/Fを併用する場合は以下の仕様をあらかじめ理解してください。

3 用語一覧

GridDBで利用する用語を一覧で解説します。

用語 意味
ノード GridDBでデータ管理を行う個々のサーバプロセスを指します。
クラスタ 一体となってデータ管理を行う、1つ、もしくは複数のノードの集合を指します。
マスタノード クラスタ管理処理を行うノードです。
フォロワノード クラスタに参加している、マスタノード以外のノードです。
構成ノード数 GridDBクラスタを構成するノード数を指定します。GridDBが初回に起動する際に、クラスタが成立する閾値として用いられます。(構成ノード数のノードがクラスタに参加することでクラスタサービスが開始されます。)
有効ノード数 GridDBクラスタを構成するノードの内、クラスタに組み込まれた稼働中のノードの数です。
ブロック ブロックとは、ディスクへのデータ永続化処理(以降、チェックポイントと呼びます)のデータ単位であり、GridDBの物理的なデータ管理の最小単位です。ブロックには複数のコンテナのデータが配置されます。ブロックサイズは、GridDBの初期起動前に定義ファイル(クラスタ定義ファイル)で設定します。
パーティション コンテナを配置するデータ管理の単位です。クラスタ間でのデータ配置の最小単位であり、ノード間の負荷バランスを調整するため(リバランス)や、障害発生時のデータ多重化(レプリカ)管理のためのデータ移動や複製の単位です。
パーティショングループ 複数のパーティションをまとめたグループであり、データをディスクに永続化する際のファイルシステム上のデータファイルに相当します。1つのパーティショングループに1つのチェックポイントファイルが対応します。パーティショングループは、ノード定義ファイルの並列度(/dataStore/concurrency)の数だけ作成されます。
ロウ コンテナ(テーブル)に登録される1行のデータを指します。コンテナ(テーブル)には複数のロウが登録されます。ロウは、コンテナ(テーブル)のスキーマ定義に対応したカラムの値から構成されます。
コンテナ(テーブル) ロウの集合を管理する入れ物です。NoSQL I/Fで操作する場合はコンテナ、NewSQL I/Fで操作する場合はテーブルと呼ぶ場合があります。呼び方が異なるだけで、実体は同じオブジェクトです。コンテナには、コレクションと時系列コンテナの2種類のデータタイプが存在します。
コレクション(テーブル) 一般の型のキーを持つロウを管理するコンテナ(テーブル)の1種です。
時系列コンテナ(時系列テーブル) 時刻型のキーを持つロウを管理するコンテナ(テーブル)の1種です。時系列のデータを扱う専用の機能を持ちます。
データベースファイル クラスタを構成するノードの保有するデータをディスクやSSDに書き込み、永続化したファイル群です。データベースファイルは、定期的にメモリ上のデータベースが書き込まれるチェックポイントファイルと、データ更新の都度保存されるトランザクションログファイルを総称します。
チェックポイントファイル パーティショングループがディスクに書き込まれたファイルです。 ノード定義ファイルのサイクル(/checkpoint/checkpointInterval)でメモリ上の更新情報が反映されます。
トランザクションログファイル トランザクションの更新情報がログとして逐次保存されるファイルです。
LSN(Log Sequence Number) パーティションごとに割り当てられる、トランザクションでの更新時の更新ログシーケンス番号です。クラスタ構成のマスタノードは、各ノードが保持している全パーティションのLSNのうちの最大数(MAXLSN)を保持しています。
レプリカ 複数のノードにパーティションを多重化配置することを指します。レプリカには更新されるマスタデータであるオーナと参照に利用されるバックアップがあります。
オーナノード パーティション内のコンテナに対して更新操作ができるノードです。複製されたコンテナのうち、マスタとなるコンテナを記録しているノードです。
バックアップノード 複製されたコンテナのうち、バックアップのためのデータを記録しているノードです。
定義ファイル クラスタを構成する際のパラメータファイル(gs_cluster.json:以降クラスタ定義ファイルと呼ぶ)とクラスタ内でのノードの動作やリソースを設定するパラメータファイル(gs_node.json:以降ノード定義ファイルと呼ぶ)の2つがあります。また、GridDBの管理ユーザのユーザ定義ファイルもあります。
イベントログファイル GridDBサーバのイベントログが保管されるファイルです。エラーや警告などのメッセージが含まれます。
OSユーザ(gsadm) GridDBの運用機能を実行できる権限を持つユーザです。GridDBインストール時にgsadmというOSのユーザが作成されます。
管理ユーザ GridDBの運用操作を行うために用意されたGridDBのユーザです。
一般ユーザ アプリケーションシステムで利用するユーザです。
ユーザ定義ファイル 管理ユーザが登録されるファイルです。初期インストールではsystem,adminの2つの管理ユーザが登録されています。
クラスタデータベース GridDBのクラスタシステムでアクセスできるデータベース全体を総称します。
データベース クラスタデータベースに作成される、論理的なデータ管理の単位です。クラスタデータベース内にデフォルトではpublicというデータベースが作成されています。新規にデータベースを作成し、一般ユーザに利用権限をあたえることで、ユーザ毎のデータ分離が実現できます。
フルバックアップ 現在利用中のクラスタデータベースをノード定義ファイルで指定したバックアップディレクトリにオンラインでバックアップします。
差分・増分バックアップ 現在利用中のクラスタデータベースをノード定義ファイルで指定したバックアップディレクトリにオンラインでバックアップし、以降のバックアップでは、バックアップ後の更新ブロックの差分増分のみをバックアップします。
自動ログバックアップ 現在利用中のクラスタデータベースをオンラインで指定したディレクトリにバックアップするとともに、トランザクションログファイルの書き込みと同じタイミングでトランザクションログも自動で採取します。トランザクションログファイルの書き込みタイミングは、ノード定義ファイルの/dataStore/logWriteModeの値に従います。
フェイルオーバ― 稼働中のクラスタに障害が発生した際に、バックアップノードがその機能を自動的に引き継ぎ、処理を続行する仕組みです。
クライアントフェイルオーバー 稼働中のクラスタに障害が発生した際、クライアント側のAPIで障害時のリトライ処理としてバックアップノードに自動的に接続し直し、処理を続行する仕組みです。
テーブルパーティショニング データ登録数が多い巨大なテーブルのデータを複数のノードに分散配置することで、複数ノードのメモリを有効に利用し、かつ複数ノードのプロセッサの並列実行を可能とし、巨大テーブルのアクセスを高速化するための機能です。
データパーティション テーブルパーティショニングによって分割されたデータを格納する入れ物を総称します。テーブルパーティショニングされた1つのテーブルに対して、データパーティションは複数作成されます。データパーティションは、通常のコンテナと同様に各ノードに分散配置されます。データパーティションの数や格納するデータの範囲は、テーブルパーティショニングの種類(ハッシュ、インターバル、インターバル-ハッシュ)によって異なります。
データアフィニティ 関連の強いコンテナのデータを同じブロックに配置し、データアクセスの局所化を図ることでメモリヒット率を高めるための機能です。
ノードアフィニティ 関連の強いコンテナを同じノードに配置し、データアクセス時のネットワーク負荷を減少させるための機能です。

4 GridDBの仕組み

GridDBのクラスタ動作の仕組みについて説明します。

4.1 クラスタの構成

GridDBは複数ノードで構成されるクラスタで動作します。アプリケーションシステムからデータベースにアクセスするにはノードが起動されており、かつクラスタが構成(クラスタサービスが実行)されている必要があります。

クラスタは、ユーザが指定した構成ノード数のノードがクラスタへ参加することで構成され、クラスタサービスが開始されます。構成ノード数のノードがクラスタに参加するまでクラスタサービスは開始されず、アプリケーションからはアクセスできません。

ノード1台で動作させる場合にも、クラスタを構成する必要があります。この場合構成ノード数を1台でクラスタを構成することになります。ノード1台で動作させる構成をシングル構成と呼びます。

クラスタ名と構成ノード数
クラスタ名と構成ノード数

ネットワーク上にあるGridDBの多数のノードを用いて、正しく(意図したノードを用いて)クラスタが構成できるよう、クラスタ名を使って複数のクラスタを区別します。これにより、同じネットワーク上に複数のGridDBクラスタが構成できます。クラスタは、クラスタ名、構成ノード数、接続方式の設定が等しいノードで構成されます。クラスタ名は、クラスタを構成するノード毎に保有するクラスタ定義ファイルに設定するとともに、クラスタ構成する際のパラメータでも指定します。

マルチキャストを用いてクラスタを構成する方式をマルチキャスト方式と呼びます。クラスタ構成方式については、クラスタ構成方式を参照してください。

以下にクラスタ構成の操作の流れを示します。

クラスタ構成の動作
クラスタ構成の動作

ノードの起動、クラスタの構成には、運用コマンドのgs_startnode/gs_joinclusterコマンドやgs_shを用います。また、OS起動と同時にノードを起動し、クラスタを構成するサービス制御機能もあります。

クラスタを構成するには、クラスタに参加させるノードの数(構成ノード数)とクラスタ名をすべての参加ノードで一致させる必要があります。

クラスタサービスは、クラスタでの運用開始後に構成するノードに障害がありクラスタからノードが切り離された場合でも、過半数のノードが参加している限りサービスは継続します。

過半数以上のノードさえ動作していればクラスタ運用は継続できるので、クラスタ運用中にメンテナンス等のために、オンラインでノード切り離したり、メンテナンス完了後にノードを組込む操作ができます。さらには、システムを増強するためにノードを追加することもオンラインでできます。

クラスタ内部の通信を行うネットワークとクライアント通信専用のネットワークを分離させることが可能です。詳細は『GridDB データベース管理者ガイド』(GridDB_AdministratorsGuide.html)を参照ください。

4.1.1 ノードのステータス

ノードには、ノードの状態を表す複数の種類のステータスがあります。ユーザのコマンド実行やノードの内部処理によってステータスが遷移します。クラスタのステータスは、クラスタに属する複数のノードのノードステータスによって決まります。

ノードステータスの種類と遷移、確認方法を説明します。

4.1.2 クラスタのステータス

クラスタの稼働ステータスは各ノードの状態で決まり、そのステータスには稼働/中断/停止の3つの種類があります。

クラスタのサービスは、システムの初回構築時においては、ユーザが指定したクラスタ構成するノード数(構成ノード数)のノードがすべてクラスタに参加した時点で開始されます。

初回のクラスタ構築時、クラスタを構成するノードがすべてクラスタに組み入れられておらず、クラスタ構成待ちの状態が【INIT_WAIT】状態です。構成ノード数のノードがクラスタに参加完了した時点で状態は自動遷移し稼働状態となります。

稼働状態には【STABLE】と【UNSTABLE】の2つの状態があります。

メンテナンスなどでノードをクラスタより切り離しても、構成ノード数の過半数が動作している限りクラスタは【UNSTABLE】状態で運用できます。

クラスタを構成するノードが、構成ノード数の半数以下となった場合、スプリットブレイン発生を防ぐためにクラスタは自動的にサービスを中断します。クラスタのステータスは【WAIT】状態となります。

【WAIT】状態からクラスタサービスを再開するには、エラーの回復したノードや新規のノードをノード追加操作でクラスタへ追加していきます。 再び構成ノード数のノードがクラスタに参加完了した時点で状態は【STABLE】状態となり、サービスが再開されます。

ノードの障害等でクラスタを構成するノード数が半数以下となり、クラスタのサービスが中断した場合でも、ノード追加操作でエラーの回復したノードや新規のノードをクラスタへ追加していき過半数のノードがクラスタに参加した時点で自動的にクラスタのサービスは再開されます。

クラスタステータス
クラスタステータス

STABLE状態はgs_statの示すjsonのパラメータである、/cluster/activeCountと/cluster/designatedCountの値が等しい状態です。

$ gs_stat -u admin/admin
{
    "checkpoint": {
        "archiveLog": 0,
     :
     :
    },
    "cluster": {
        "activeCount":4,            ★ クラスタ内で稼働中のノード
        "clusterName": "test-cluster",
        "clusterStatus": "MASTER",
        "designatedCount": 4,                  ★ 構成ノード数
        "loadBalancer": "ACTIVE",
        "master": {
            "address": "192.168.0.1",
            "port": 10040
        },
        "nodeList": [             ★ クラスタを構成するマシンリスト
            {
                "address": "192.168.0.1",
                "port": 10040
            },
            {
                "address": "192.168.0.2",
                "port": 10040
            },
            {
                "address": "192.168.0.3",
                "port": 10040
            },
            {
                "address": "192.168.0.4",
                "port": 10040
            },

        ],
        :
        :

クラスタのステータスは、gs_shgs_adminで確認できます。以下にgs_shでのクラスタステータスの確認例を示します。

$ gs_sh
gs> setuser admin admin gsadm                  //接続ユーザの設定
gs> setnode node1 192.168.0.1 10040            //クラスタを構成するノードの定義
gs> setnode node2 192.168.0.2 10040
gs> setnode node3 192.168.0.3 10040
gs> setnode node4 192.168.0.4 10040
gs> setcluster cluster1 test150 239.0.0.5 31999 $node1 $node2 $node3 $node4  //クラスタの定義
gs> startnode $cluster1                        //クラスタを構成する全ノードの起動
gs> startcluster $cluster1                     //クラスタ構成を指示
クラスタの開始を待っています。
クラスタが開始しました。
gs> configcluster  $cluster1                      ★クラスタのステータスを確認
Name                  : cluster1
ClusterName           : test-cluster
Designated Node Count : 4
Active Node Count     : 4
ClusterStatus         : SERVICE_STABLE      ★安定状態

Nodes:
  Name    Role Host:Port              Status
-------------------------------------------------
  node1     M  192.168.0.1:10040    SERVICING
  node2     F  192.168.0.2:10040    SERVICING
  node3     F  192.168.0.3:10040    SERVICING
  node4     F  192.168.0.4:10040    SERVICING

gs> leavecluster $node2
ノードがクラスタから離脱するのを待っています。
ノードがクラスタから離脱しました。
gs> configcluster  $cluster1
Name                  : cluster1
ClusterName           : test150
Designated Node Count : 4
Active Node Count     : 3
ClusterStatus         : SERVICE_UNSTABLE     ★不安定な状態

Nodes:
  Name    Role Host:Port              Status
-------------------------------------------------
  node1     M  192.168.0.1:10040    SERVICING    //マスタノード
  node2     -  192.168.0.2:10040    STARTED     
  node3     F  192.168.0.3:10040    SERVICING    //フォロワノード
  node4     F  192.168.0.4:10040    SERVICING    //フォロワノード

4.1.3 パーティションのステータス

パーティションステータスは、クラスタ上のパーティション全体の状態を表します。クラスタステータスが稼働状態の時に、パーティションにアクセスできる状態か、パーティションに偏りが無いかなどを表すステータスです。

パーティションステータス 説明
NORMAL すべてのパーティションがデータ配置目標と同一の正常な状態
NOT_BALANCE レプリカロスやオーナロスは発生していないが、パーティションの配置が偏っている状態
REPLICA_LOSS レプリカのデータが欠損しているパーティションが存在する状態
(該当パーティションの可用性が落ちている・ノード離脱できない)
OWNER_LOSS オーナのデータが欠損しているパーティションが存在する状態
(該当パーティションのデータにはアクセスできない)
INITIAL クラスタ構成に参加していない初期状態

パーティションステータスは、マスタノードへのgs_statコマンドの実行で確認できます。(/cluster/partitionStatusの値)

$ gs_stat -u admin/admin
{
  :
  :
"cluster": {
    :
    "nodeStatus": "ACTIVE",
    "notificationMode": "MULTICAST",
    "partitionStatus": "NORMAL",
    :

[メモ]

4.2 クラスタ構成方式

クラスタは、ネットワーク上に存在するノード同士がお互いを認識することで構成されます。 ノードは、認識した他のノードのアドレスをリストとして持ちます。

GridDBは、アドレスリストを構成する方法が異なる3つのクラスタ構成方式を提供します。環境や利用ケースによってクラスタ構成方式を使い分けることができます。クラスタ構成方式によって、クライアントや運用ツールの接続方式も異なります。

クラスタ構成方式には、マルチキャスト方式と固定リスト方式とプロバイダ方式の3つがあります。推奨はマルチキャスト方式です。

固定リスト方式かプロバイダ方式を用いることで、マルチキャストが利用不可能な環境でのクラスタ構成、クライアント接続が可能になります。

クラスタ構成方式の比較は以下のとおりです。

項目 マルチキャスト方式(推奨) 固定リスト方式 プロバイダ方式
設定 ・マルチキャストアドレス、ポート ・全ノードのIPアドレス:ポートのリスト ・プロバイダURL
利用ケース ・マルチキャストが利用できる ・マルチキャストが利用できない
・正確にシステム規模の見積りが行える
・マルチキャストが利用できない
・システム規模が見積もれない
クラスタ動作 ・一定時間間隔でノードの自動ディスカバリを行う。 ・全ノードに同一のアドレスリストを設定する
・ノード起動時に1度だけそのリストを読み込む
・アドレスプロバイダから一定時間間隔でアドレスリストを取得
メリット ・ノード追加のためのクラスタ再起動不要 ・リストの整合性チェックが行われるため、間違いが無い ・ノード追加のためのクラスタ再起動不要
デメリット ・クライアント接続にマルチキャストを要する ・ノード追加にクラスタ再起動が必要
・アプリ側の接続設定の更新も必要
・アドレスプロバイダの可用性確保が必要

4.2.1 クラスタ構成方式の設定

マルチキャスト方式が利用できない環境では、固定リスト方式またはプロバイダ方式でクラスタを構成します。 以下では、固定リスト方式とプロバイダ方式それぞれのネットワーク設定について説明します。

4.2.1.1 固定リスト方式

固定のアドレスリストを与えてノードを起動することで、そのリストを利用してクラスタを構成します。

固定リスト方式でクラスタを構成する場合は、クラスタ定義ファイルのパラメータを設定します。

クラスタ定義ファイル

パラメータ データ型 意味
/cluster/notificationMember string クラスタ構成方式を固定リスト方式にする際に、アドレスリストを指定します。

クラスタ定義ファイルの設定例は以下のとおりです。

{
                             :
                             :
    "cluster":{
        "clusterName":"yourClusterName",
        "replicationNum":2,
        "heartbeatInterval":"5s",
        "loadbalanceCheckInterval":"180s",
        "notificationMember": [
            {
                "cluster": {"address":"172.17.0.44", "port":10010},
                "sync": {"address":"172.17.0.44", "port":10020},
                "system": {"address":"172.17.0.44", "port":10040},
                "transaction": {"address":"172.17.0.44", "port":10001},
                "sql": {"address":"172.17.0.44", "port":20001}
            },
            {
                "cluster": {"address":"172.17.0.45", "port":10010},
                "sync": {"address":"172.17.0.45", "port":10020},
                "system": {"address":"172.17.0.45", "port":10040},
                "transaction": {"address":"172.17.0.45", "port":10001},
                "sql": {"address":"172.17.0.45", "port":20001}
            },
            {
                "cluster": {"address":"172.17.0.46", "port":10010},
                "sync": {"address":"172.17.0.46", "port":10020},
                "system": {"address":"172.17.0.46", "port":10040},
                "transaction": {"address":"172.17.0.46", "port":10001},
                "sql": {"address":"172.17.0.46", "port":20001}
            }
        ]
    },
                             :
                             :
}

4.2.1.2 プロバイダ方式

アドレスプロバイダが提供するアドレスリストを取得してクラスタ構成を行います。

プロバイダ方式でクラスタを構成する場合は、クラスタ定義ファイルのパラメータを設定します。

クラスタ定義ファイル

パラメータ データ型 意味
/cluster/notificationProvider/url string クラスタ構成方式をプロバイダ方式にする際に、アドレスプロバイダのURLを指定します。
/cluster/notificationProvider/updateInterval string アドレスプロバイダからリストを取得する間隔を指定します。1s以上、231s未満の値を指定します。

クラスタ定義ファイルの設定例は以下のとおりです。

{
                             :
                             :
    "cluster":{
        "clusterName":"yourClusterName",
        "replicationNum":2,
        "heartbeatInterval":"5s",
        "loadbalanceCheckInterval":"180s",
        "notificationProvider":{
            "url":"http://example.com/notification/provider",
            "updateInterval":"30s"
        }
    },
                             :
                             :
}

アドレスプロバイダはWebサービスとして構成するか、静的コンテンツとして構成することができます。 アドレスプロバイダは以下の仕様を満たす必要があります。

アドレスプロバイダからのレスポンスの例は以下のとおりです。

$ curl http://example.com/notification/provider
[
    {
        "cluster": {"address":"172.17.0.44", "port":10010},
        "sync": {"address":"172.17.0.44", "port":10020},
        "system": {"address":"172.17.0.44", "port":10040},
        "transaction": {"address":"172.17.0.44", "port":10001},
        "sql": {"address":"172.17.0.44", "port":20001}
    },
    {
        "cluster": {"address":"172.17.0.45", "port":10010},
        "sync": {"address":"172.17.0.45", "port":10020},
        "system": {"address":"172.17.0.45", "port":10040},
        "transaction": {"address":"172.17.0.45", "port":10001},
        "sql": {"address":"172.17.0.45", "port":20001}
    },
    {
        "cluster": {"address":"172.17.0.46", "port":10010},
        "sync": {"address":"172.17.0.46", "port":10020},
        "system": {"address":"172.17.0.46", "port":10040},
        "transaction": {"address":"172.17.0.46", "port":10001},
        "sql": {"address":"172.17.0.46", "port":20001}
    }
]

【メモ】

5 データモデル

GridDBは、Key-Valueに似た独自のKey-Container型データモデルです。以下の特徴があります。

データモデル
データモデル

GridDBのデータは、ブロック、コンテナ、テーブル、ロウ、パーティション、パーティショングループという単位でデータ管理されています。

データ管理の単位
データ管理の単位

 

5.1 コンテナ

GridDBにデータを登録し、検索するには、データを格納するコンテナ(テーブル)を作成する必要があります。 NoSQL I/Fで操作する場合はコンテナ、NewSQL I/Fで操作する場合はテーブルと呼びます。

コンテナ(テーブル)もデータベースと同様の命名規則があります。

[メモ]

5.1.1 種別

コンテナ(テーブル)には、2つのデータタイプがあります。時々刻々発生するデータを発生した時刻とともに管理するのに適したデータタイプである 時系列コンテナ(時系列テーブル) とさまざまなデータを管理する コレクション(テーブル) です。

5.1.2 データ型

コンテナ(テーブル)にはスキーマを設定できます。登録できるデータ型には、基本的なデータ型である 基本型配列型 があります。

5.1.2.1 基本型

登録できる基本型のデータを説明します。基本型とは、他の型の組み合わせで表現できない、基本的な型です。

データ型 説明
BOOL型 真または偽のいずれかの値
STRING型 Unicodeコードポイントを文字とする、任意個数の文字の列より構成
BYTE型 -27から27-1 (8ビット)の整数値
SHORT型 -215から215-1 (16ビット)の整数値
INTEGER型 -231から231-1 (32ビット)の整数値
LONG型 -263から263-1 (64ビット) の整数値
FLOAT型 IEEE754で定められた単精度型(32ビット)浮動小数点数
DOUBLE型 IEEE754で定められた倍精度型(64ビット)浮動小数点数
TIMESTAMP型 年月日ならびに時分秒からなる時刻を表す型。データベースに保持されるデータ形式はUTCで、精度はミリ秒
GEOMETRY型 空間構造を表すためのデータ型
BLOB型 画像や音声などのバイナリデータのためのデータ型

STRING型、GEOMETRY型、BLOB型は管理できるデータのサイズに以下の制限があります。制限値は、GridDBの定義ファイル(gs_node.json)のデータベースの入出力単位であるブロックサイズに応じて値が異なります。

ブロックサイズ(64KB) ブロックサイズ (1MB~32MB)
STRING型 最大31KB (UTF-8エンコード相当) 最大128KB (UTF-8エンコード相当)
GEOMETRY型 最大31KB (内部格納形式相当) 最大128KB (内部格納形式相当)
BLOB型 最大1GB - 1Byte 最大1GB - 1Byte

GEOMETRY型(空間型)

GEOMETRY型(空間型)のデータは地図情報システムなどでよく利用されています。空間型のデータは、NoSQLインターフェースでのみ使用できます。NewSQLインターフェースでは未サポートです。

GEOMETRY型のデータは、WKT(Well-known text)を用いて記述します。WKTは、地理空間に関する情報の標準化などを推進している非営利団体OGC(Open Geospatial Consortium)にて策定されています。GridDBでは、コンテナのカラムをGEOMETRY型に設定することで、WKTで記述された空間情報をカラムに格納できます。

GEOMETRY型では以下のWKT形式をサポートします。

ただし、空間構造QUADRATICSURFACEはコンテナに登録することはできず、検索条件としてのみ使用できます。

GEOMETRY型を利用した演算は、APIやTQLで実行できます。

TQLでは2次元、3次元の空間を定義する空間生成関数と空間型データ間での演算の関数を提供します。TQLではコンテナ内のGEOMETRY型のカラムと指定した空間データで演算を行いその結果を以下のようにして得ることができます。

 SELECT * WHERE ST_MBRIntersects(geom, ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'))

TQLで提供する関数の詳細は『GridDB TQL リファレンス』(GridDB_TQL_Reference.html)を参照ください。

5.1.2.2 複合型

コンテナに登録できる、基本型の組み合わせで構成される型を定義します。 現バージョンでは配列型のみです。

【メモ】

配列型カラムでは、TQLでの操作に以下の制約があります。

5.1.3 主キー

コンテナ(テーブル)には、主キーを設定できます。主キーによって、コンテナ(テーブル)のロウの一意性を保証します。また主キーを設定したカラムには、NULL値を許容しません。

主キーは、コンテナではROWKEY(ロウキー)、テーブルではPRIMARY KEY(プライマリキー)と呼びます。

ROWKEY(PRIMARY KEY)に設定したカラムには、カラムの型に応じてあらかじめ既定された、デフォルトの索引が設定されます。

GridDBの現バージョンでは、ROWKEY(PRIMARY KEY)に指定できるSTRING、INTEGER、LONG、TIMESTAMPのすべての型のデフォルトの索引はTREE索引です。

[メモ]

  

5.2 ビュー

コンテナのデータを参照するためのビューを作成できます。

ビュー作成時に、コンテナに対する参照(SELECT文)を定義します。ビューはコンテナと似たオブジェクトですが実データを持ちません。ビューを含むクエリの実行時に、ビュー作成時に定義されたSELECT文を評価して結果を返します。

ビューは参照(SELECT)のみ可能です。ビューに対して、データの追加(INSERT)/更新(UPDATE)/削除(DELETE)を行うことはできません。

[メモ]

  

6 データベース機能

6.1 リソースの管理

GridDBのクラスタを構成するリソースには、メモリ上のデータベースのほかにディスク上に永続化されるリソースがあります。 永続化リソースには、以下のものがあります。

データベースファイル
データベースファイル

これらのリソースは、GridDBホーム(環境変数GS_HOMEで指定されるパス)で配置を定義します。 初期インストール状態では、/var/lib/gridstoreディレクトリがGridDBホームで、このディレクトリの下に各リソースの初期データが配置されます。

初期の配置状態は以下のとおりです。

/var/lib/gridstore/        # GridDBホームディレクトリ
     admin/                # 統合運用管理機能ホームディレクトリ
     backup/               # バックアップディレクトリ
     conf/                 # 定義ファイルディレクトリ
          gs_cluster.json  # クラスタ定義ファイル
          gs_node.json     # ノード定義ファイル
          password         # ユーザ定義ファイル
     data/                 # データベースファイルディレクトリ
     log/                  # サーバイベントログ・運用ツールログディレクトリ

GridDBホームは、OSユーザgsadmの.bash_profileファイルの設定で変更できます。GridDBホームを変更する場合は、上記ディレクトリのリソースも適宜移動してください。

.bash_profileファイルには、環境変数GS_HOMEとGSLOGの2つの環境変数の設定がされています。

vi .bash_profile

# GridStore specific environment variables
GS_LOG=/var/lib/gridstore/log
export GS_LOG
GS_HOME=/var/lib/gridstore          ★GridDBホームの変更
export GS_HOME

データベースディレクトリやバックアップディレクトリ、サーバイベントログディレクトリは、ノード定義ファイルの設定値を変更することで変更できます。

クラスタ定義ファイルやノード定義ファイルで設定できる内容に関しましてはパラメータを参照してください。

6.2 データアクセス機能

GridDBのデータにアクセスするには、NoSQLインターフェースもしくはNewSQLインターフェースを用いてアプリケーションを開発する必要があります。データアクセスでは、コンテナやテーブルがクラスタデータベースのどこに配置されているかの位置情報を意識する必要はなく、GridDBのクラスタデータベースに接続するだけでアクセスができます。コンテナがクラスタを構成するどのノードに配置されているのかをアプリケーションシステムが意識する必要はありません。

GridDBのAPIでは、クラスタデータベースへの初期接続時に、ノード情報(パーティション)とともにコンテナの配置ヒント情報をクライアント側に保持(キャッシュ)します。

アプリケーションが利用するコンテナが切り替わる度に、配置されているノードを探す処理のためクラスタにアクセスする必要はなく、コンテナを保持するノードに直に接続して処理をするため、通信のオーバヘッドを最小限としています。

GridDBではリバランス処理により、コンテナ配置は動的に変わりますが、クライアントキャッシュは定期的に更新されるため、コンテナの位置は透過です。タイミングによってクライアントからのアクセスでノードがミスヒットした時でも、自動的に再配置情報を取得して処理を継続します。

6.2.1 TQLとSQL

データベースのアクセス言語として、TQLとSQL-92準拠のSQLをサポートしています。

6.2.2 複数コンテナへの一括処理機能

GridDBが提供するNoSQL I/Fでは、時々刻々発生するイベント情報を高速に処理するためのインターフェースを用意しています。

大量に発生するイベントを発生の都度データベースサーバに送信していると、ネットワークへの負荷が高くなりシステムのスループットがあがりません。通信回線帯域が狭い場合特に顕著な影響がでます。NoSQL I/Fでは複数のコンテナに対する複数のロウの登録や、複数のコンテナへの複数の問い合わせ(TQL)を1リクエストで処理するためのマルチ処理が用意されています。頻繁にデータベースサーバにアクセスしないため、システム全体のスループットがあがります。

以下に例を挙げます。

multiput処理
multiput処理
fetchAll処理
fetchAll処理
multiget処理
multiget処理

6.3 索引機能

コンテナ(テーブル)のカラムに対し索引を作成することで、条件付き検索が高速に処理できます。

索引タイプにはハッシュ索引(HASH)、ツリー索引(TREE)、空間索引(SPATIAL)の3種類があります。 ハッシュ索引は、コンテナ内のクエリでの検索時の等価検索で利用します。ツリー索引は、等価検索のほかに、範囲(より大きい/等しい、より小さい/等しいなど)を含む参照に利用します。

設定できる索引はコンテナ(テーブル)のタイプやカラムのデータ型に応じて異なります。

コンテナに作成できる索引の数に制限はありませんが、索引の作成は慎重に設計する必要があります。索引は、設定されたコンテナのロウに対して挿入、更新、または削除の各操作が実行されると更新されます。したがって、頻繁に更新されるロウのカラムに多数の索引を作成すると、挿入、更新、または削除の各操作でパフォーマンスに影響ができます。

索引は以下のようなカラムに作成します。

【メモ】

6.4 時系列データ特有の機能

GridDBでは、高頻度で発生するセンサなどのデータ管理のために、メモリを最大限有効利用するデータ配置アルゴリズム(TDPA:Time Series Data Placement Algorithm)に従いデータ配置処理します。時系列コンテナ(時系列テーブル)では、内部データを周期性で分類しながらメモリ配置します。アフィニティ機能でヒント情報を与えるとさらに配置効率が上がります。また、データは必要に応じてディスクに追い出しながら、ほぼゼロコストで有効期限切れのデータを解放しています。

時系列コンテナ(時系列テーブル)は、TIMESTAMP型のROWKEY(PRIMARY KEY)を持ちます。

6.4.1 圧縮機能

時系列コンテナ(時系列テーブル)は、データを圧縮して保持することができます。 圧縮オプションの指定は時系列コンテナ(時系列テーブル)作成時に指定します。データを圧縮することでメモリ使用効率を上げることができます。

ただし、圧縮オプションが設定されている時系列コンテナ(時系列テーブル)に対しては、以下に示すロウ操作を行えませんので注意してください。

圧縮オプションには次の指定ができます。

それぞれのオプションの内容は以下のとおりです。

6.4.1.1 誤差あり間引き圧縮(HI)

誤差あり間引き圧縮(HI)では、前回までおよび直後に登録したデータと同じ傾斜を表すロウは省かれます。同じ傾斜かを判定する条件はユーザが指定できます。

指定されたカラムが条件を満たし、それ以外のカラムの値が前回のデータと同じ場合のみロウデータは省かれます。条件は、誤差の幅(Width)で指定します。

時系列コンテナ(時系列テーブル)の圧縮
時系列コンテナ(時系列テーブル)の圧縮

圧縮の指定を設定できるデータタイプは以下です。

圧縮は不可逆圧縮のため、間引き圧縮で間引かれたデータをデータ登録時のままの値で復元することはできません。

省かれたデータはinterpolate(補完)やsample(サンプリング)処理の際に、指定された誤差の範囲内で復元できます。

6.4.1.2 誤差なし間引き圧縮(SS)

誤差なし間引き圧縮(SS)では、直前および直後に登録したロウと同じデータを持つロウは省かれます。省かれたデータはinterpolateやsample処理の際に、誤差を発生することなく復元できます。

6.4.2 TQLの演算機能

6.4.2.1 集計演算

採取したデータの時間間隔でデータに重みをつけて計算します。つまり、時間間隔が長い場合、長時間その値が続いたことを想定した計算となります。

集計演算には以下の関数があります。

重みづけの集計演算(TIME_AVG)
重みづけの集計演算(TIME_AVG)

6.4.2.2 選択・補間演算

時刻データは、収集されるデータの内容や収集タイミングにより想定した時刻より多少の時間のずれが発生することがあります。したがって時刻データをキーにして検索する際にも、指定した時刻周辺のデータが取得できる機能が必要です。

時系列コンテナ(時系列テーブル)を検索し、指定したロウを取得するための以下のような関数があります。

また、実体のロウのカラムの値を補間演算で計算するための以下のような関数があります。

6.4.3 期限解放機能

期限解放とは、設定した保持期間を超えたロウデータを、検索や削除などの操作対象から外して参照不可とした後、DBから物理的に削除する機能です。 利用されなくなった古いデータを操作の対象から外して削除することで、DBサイズを一定に保ち、データベースサイズ肥大化によるパフォーマンス低下を防ぐことができます。

期限解放
期限解放

保持期間はコンテナ単位に設定します。保持期間を越えたロウを「期限切れデータ」と呼びます。期限切れデータは参照不可となってAPIから操作できなくなるので、アプリケーションからはそのロウは存在しない状態になります。期限切れデータは、一定期間が経過すると、DBから物理的に削除する対象のデータになります。この削除対象となった期限切れデータを「コールドデータ」と呼びます。コールドデータは、そのまま自動的にDBから削除することも可能ですし、データを残しておく必要がある場合は外部ファイルに保存してから自動削除することもできます。

6.4.3.1 期限解放の種類

保持期間の設定には次の2種類があります。 時系列コンテナにはロウ期限解放、パーティショニングされたテーブルにはパーティション期限解放をご利用ください。

ロウ期限解放
ロウ期限解放
パーティション期限解放
パーティション期限解放

ロウ期限解放とパーティション期限解放のまとめです。

ロウ期限解放 パーティション期限解放
コンテナ種別 時系列コンテナ インターバル、インターバルハッシュでパーティショニングされたテーブル(コレクションの場合はパーティショニングキーが時刻型の場合のみ)
設定項目 保持期間と単位、分割数 保持期間と単位
保持期限 ロウキーに格納された日時に保持期間を足した日時 データパーティションのデータ格納期間の最終日時に保持期間を足した日時
期限切れデータになる単位 ロウ データパーティション
コールドデータになる単位 '保持期間÷分割数'の期間のロウ群 データパーティション

【メモ】

6.4.3.2 コールドデータの自動削除またはアーカイブ保存

コールドデータとなったロウの削除方法は、自動削除、または、アーカイブ保存後に自動削除のいずれかを選択できます。

データを保存する必要がない場合は自動削除の設定を行ってください。参照や再利用のためにデータを保存しておく必要がある場合は、長期アーカイブ機能による保存を実行してください。

【メモ】

6.5 テーブルパーティショニング機能

複数ノードで動作するGridDBのアプリケーションを高速化するには、処理するデータをできるだけメモリに配置することが重要です。 データ登録数が多い巨大なテーブルでは、テーブルのデータを分割してノードに分散配置することで、複数ノードのCPUやメモリリソースを効率的に活用した処理が可能です。分割したデータは、「データパーティション」という複数の内部コンテナに格納します。データをどのデータパーティションに格納するかは、テーブル作成時に指定された「パーティショニングキー」のカラムの値を基に決定します。

GridDBではテーブルパーティショニングの方法として、ハッシュパーティショニング、インターバルパーティショニング、インターバル-ハッシュパーティショニングの3種類があります。

テーブルの作成・削除はNewSQLインターフェースのみ、データの登録・更新・検索はNewSQL/NoSQLインターフェースで実行できます。(一部制限があります。詳細はTQLとSQLを参照ください)

テーブルパーティショニング
テーブルパーティショニング

6.5.1 テーブルパーティショニングの利点

テーブルパーティショニングを利用して、大規模なデータを分割することで、メモリの効率的な利用や検索の処理対象データの絞込みによる性能向上の効果があります。

上記の点について、テーブルパーティショニングを利用しない場合と利用する場合の特徴を説明します。

テーブルパーティショニングを利用せずに大規模データをひとつのテーブルに格納する場合、処理に必要なデータをすべてメモリ上に載せることができず、メモリとデータベースファイル間でのスワップイン/スワップアウトが頻繁に発生してパフォーマンスが低下します。特に大規模テーブルのデータ量よりもGridDBノードのメモリが小さい場合に低下が顕著になります。また、テーブルに対するアクセスが1ノードに集中するため、並列度が低くなります。

テーブルパーティショニングを使用しない場合
テーブルパーティショニングを使用しない場合

テーブルパーティショニングを利用した場合、大規模データを各データパーティションに分割して、複数ノードに分散配置します。

登録や検索などの処理の際には、処理に必要なデータパーティションがメモリに読み込まれます。処理対象外のデータパーティションは読み込まれないため、テーブルパーティショニングを使わない大規模テーブルと比較すると必要なデータ量は小さくなる場合が多く、メモリへのスワップイン/スワップアウトの頻度が低減します。各データパーティションにデータを偏りなく均等に分割した方が各ノードのCPUやメモリリソースを有効に活用することができます。

また、データパーティションはノードに分散配置されるため、データへの並列アクセスが可能になります。

テーブルパーティショニングを使用する場合
テーブルパーティショニングを使用する場合

6.5.2 ハッシュパーティショニング

ハッシュパーティショニングでは、ハッシュ値 (HASH) に基づいてテーブルパーティションに均等にデータを分割して格納します。

高い頻度でデータ登録を行うアプリケーションシステムでの利用においては、テーブルの末尾にアクセスが集中し、待ち時間が発生する場合があります。ハッシュ分割を使用すると複数のテーブルが用意されるため、アクセス分散できます。

ハッシュパーティショニング
ハッシュパーティショニング

6.5.3 インターバルパーティショニング

インターバルパーティショニングでは、指定された一定の値間隔でデータを分割して、データパーティションに格納します。各データパーティションに格納するデータの区間(下限値から上限値)は、指定された値間隔を基に自動的に決定します。

ある一定の範囲の値を持つデータを同じデータパーティション上に格納するので、登録するデータが連続値の場合や、特定期間の範囲の検索を行う場合などに、より少ないメモリで処理できます。

インターバルパーティショニング
インターバルパーティショニング
インターバルパーティションテーブル作成・削除の例
インターバルパーティションテーブル作成・削除の例

6.5.4 インターバル-ハッシュパーティショニング

インターバル-ハッシュパーティショニングは、インターバルパーティショニングとハッシュパーティショニングを組み合わせたものです。まずインターバルパーティショニングでデータを分割し、その分割されたデータに対して、さらにハッシュパーティショニングが行われます。 データパーティショニングの数は、インターバルパーティションニングによって分割した区間の数×ハッシュの分割数になります。

インターバル-ハッシュパーティショニング
インターバル-ハッシュパーティショニング

インターバルパーティショニングで分割したデータパーティションを、さらにハッシュによって適切にノードに分散することができます。一方で、データパーティション数が多くなることで、検索時のオーバヘッドが発生します。ノード分散と処理のオーバヘッドを考慮してご利用ください。

インターバル-ハッシュパーティショニングは、インターバルパーティショニングとハッシュパーティショニングを組み合わせたものなので、基本的な機能はそれぞれのパーティショニングの機能と同等です。インターバル-ハッシュパーティショニングに特有の点のみ説明します。

6.5.5 テーブルパーティショニング種別の選択基準

GridDBでは、テーブルパーティショニングの分割の種別として、ハッシュ、インターバル、インターバルハッシュをサポートします。

検索やデータアクセスの条件となるようなカラムを、テーブルを分割するためのパーティショニングキーとします。そのパーティショニングキーの値に対して、大量データを均等に分割するための範囲が決定できる場合にはインターバルパーティショニングもしくはインターバル-ハッシュパーティショニング、決定が困難な場合にはハッシュを選択します。

データの範囲
データの範囲

6.6 トランザクション機能

GridDBではコンテナ単位のトランザクション処理をサポートし、トランザクションの特性として一般的に言われるACID特性をサポートしています。以下にトランザクション処理でサポートしている機能の詳細を説明していきます。

6.6.1 トランザクションの開始と終了

コンテナに対して、ロウの検索・更新などの操作を行ったときに新たなトランザクションが開始され、データの更新結果を確定(コミット)または破棄(アボート)した時にトランザクションが終了します。

【メモ】

トランザクションの初期の動作はautocommit(自動コミット)に設定されています。

autocommitでは、アプリケーションからのコンテナに対する更新(データの追加、削除、変更)操作開始毎に新たなトランザクションが開始され、操作終了とともに自動的にコミットされます。 autocommitをオフにすることで、アプリケーションからの要求に応じたタイミングでトランザクションのコミット、アボートを指示できます。

トランザクションのライフサイクルは、トランザクションのコミットやアボートによる完了とともにタイムアウトによるエラー終了があります。トランザクションがタイムアウトによりエラー終了した場合、そのトランザクションはアボートされます。トランザクションのタイムアウトは、トランザクションが開始してからの経過時間です。 トランザクションのタイムアウト時間は、アプリケーション単位にGridDBに接続する際のパラメータとして指定することができます。また、タイムアウト時間の上限値はノード定義ファイル(gs_node.json)に設定できます。

6.6.2 トランザクションの一貫性レベル

トランザクションの一貫性レベルにはimmediate consistencyとeventual consistencyの2種類があります。この指定はアプリケーションごとにGridDBに接続する際のパラメータとして指定することもできます。 デフォルトはimmediate consistencyです。

immediate consistencyは更新操作、読み取り操作で有効です。 eventual consistencyは読み取り操作でのみ有効です。 常に最新の結果を読み取る必要のないアプリケーションではeventual consistencyを指定すると読み取り性能が向上します。

6.6.3 トランザクションの隔離レベル

データベースの内容は常に整合性が保たれている必要があります。 複数のトランザクションを同時実行させたとき、一般に以下の現象が課題として挙がります。

GridDBでは、トランザクションの隔離レベルとして「READ_COMMITTED」をサポートしています。 READ_COMMITTEDでは、確定した最新データを常に読み取ります。

トランザクションを実行する場合、他のトランザクションからの影響を受けないように配慮する必要があります。隔離レベルは、実行トランザクションを他のトランザクションからどの程度隔離するか(どの程度整合性を保てるか)を示す指標であり、4つのレベルがあります。

4つの隔離レベルおよび、それに対して同時実行時の課題であげた現象が起こる可能性は以下のとおりです。

隔離レベル ダーティリード 反復不能読み取り ファントムリード
READ_UNCOMMITTED 発生の可能性あり 発生の可能性あり 発生の可能性あり
READ_COMMITTED 安全 発生の可能性あり 発生の可能性あり
REPEATABLE_READ 安全 安全 発生の可能性あり
SERIALIZABLE 安全 安全 安全

READ_COMMITEDでは、以前読み込んだデータを再度読み込んだ場合に、以前のデータとは異なるデータを得たり、問い合わせを再実行した場合に、同じ検索条件で問い合わせを実行しても異なる結果を得てしまうことがあります。これは前回の読み込み後に、別のトランザクションによって更新、コミットが行われ、データが更新されたためです。

GridDBでは、MVCCによって、更新中のデータを隔離しています。

6.6.4 MVCC

GridDBでは、READ_COMMITTEDを実現するために「MVCC(Multi-Version Concurrency Control:多版型同時実行制御方式)」を採用しています。

MVCCとは、各トランザクションがデータベースに対して問い合わせるときに、別のトランザクションが更新中の最新のデータでなく、更新前のデータを参照して処理を行う方式です。更新前のデータを参照してトランザクションを並行実行できるため、システムのスルー プットが向上します。

実行中のトランザクションの処理がコミットすると、他のトランザクションも最新のデータを参照できます。

MVCC
MVCC

6.6.5 ロック

コンテナに対する複数トランザクションからの更新処理要求競合時の一貫性を保つため、データのロック機構があります。

ロックの粒度は、コンテナの種別に応じて異なります。またロックの範囲は、データベースへの操作の種別に応じて異なります。

6.6.5.1 ロックの粒度

コンテナの種別ごとのロックの粒度は次のとおりです。

これらは、コンテナの種別ごとのユースケースの分析に基づいています。

6.6.5.2 データベース操作によるロック範囲

コンテナへの操作にはデータの登録、削除のみならず、データ構造の変更に伴うスキーマ変更や、アクセス高速化のための索引作成などの操作があります。ロック範囲は、コンテナ全体への操作、またはコンテナのロウ単位の操作のいずれかによって異なります。

ロック確保で競合した場合、先行したトランザクションがコミットもしくはロールバック処理で実行が完了しロックを解放するまで、後続のトランザクションはロック確保待ちとなります。

ロック確保待ちは、トランザクションの実行完了以外では、タイムアウトでも解消されます。

6.6.6 データ永続化

コンテナやテーブルに登録・更新されたデータは、ディスクやSSDに永続化され、ノード障害発生時のデータ消失から保護されます。メモリ上の更新データをブロック単位にデータベースファイルに定期的に保存するチェックポイント処理と、データ更新に同期して更新データをシーケンシャルにトランザクションログファイルに書き込むトランザクションログ処理の2つの処理があります。

トランザクションログの書き込みには、以下のいずれかをノード定義ファイルに設定できます。

"SYNC"では、更新トランザクションのコミット・アボートごとに、ログ書き込みを同期的に行います。"DELAYED_SYNC"では、更新時のログ書き込みを、更新タイミングとは関係なく、指定秒数毎に遅延して行います。デフォルト値は"1(DELAYED_SYNC 1秒)"です。

"SYNC"を指定するとノード障害発生時に最新の更新内容を消失する可能性が低くなりますが更新が多いシステムでは性能に影響します。

一方、"DELAYED_SYNC"を指定すると、更新性能は向上しますが、ノード障害発生時ディスクに書き込まれていない更新内容があるとそれらが失われます。

クラスタ構成でレプリカ数が2以上の場合は、他のノードにレプリカを持つため、"DELAYED_SYNC"設定でも1ノード障害時に最新の更新内容を失う可能性は低くなります。 更新頻度が高く、性能が要求される場合には、"DELAYED_SYNC"を設定することも考慮してください。

チェックポイントでは、更新ブロックをデータベースファイルに更新します。 チェックポイント処理は、ノード単位に設定したサイクルで動作します。チェックポイントのサイクルはノード定義ファイルのパラメータで設定します。初期値は、60秒です。

チェックポイントの実行サイクルの数値を上げることで、ディスクへの永続化を夜間に実施するなど比較的時間に余裕がある時間帯に設定することができます。一方サイクルを長くした場合に、システム処理外でノードを再起動した際にロールフォワードすべきトランザクションログファイルが増え、リカバリ時間が増えるという欠点もあります。

チェックポイント実行時に更新のあったデータは、チェックポイントの書き込みブロックとは別のメモリにプールし、保持します。 チェックポイントを高速に行うにはチェックポイントの並列実行を設定します。並列実行を設定した場合、トランザクションの同時実行数と同じ数まで並列で処理されます。

チェックポイント
チェックポイント

6.6.7 タイムアウト処理

タイムアウト処理は、NoSQL I/F、NewSQL I/Fで設定できる内容が異なります。

6.6.7.1 NoSQL I/Fのタイムアウト処理

NoSQL I/Fでは、アプリケーション開発者に通知されるタイムアウトには2種類のタイムアウトがあります。アプリケーションの処理時間の制限に関するトランザクションタイムアウトと、障害発生時の回復処理のリトライ時間に関するフェイルオーバータイムアウトの2つです。

トランザクションタイムアウト、フェイルオーバータイムアウトともに、Java APIやC APIでGridStoreオブジェクトを用いてクラスタに接続する際に設定できます。詳細は『GridDB Java APIリファレンス』(GridDB_Java_API_Reference.html)や『GridDB C APIリファレンス』(GridDB_C_API_Reference.html)を参照ください。

 

6.6.7.2 NewSQL I/Fのタイムアウト処理

NewSQL I/Fでは、ログイン(接続)タイムアウト、ネットワーク応答タイムアウト、クエリタイムアウトの3種類のタイムアウトがあります。

6.7 レプリケーション機能

クラスタを構成する複数のノード間では、ユーザが設定したレプリケーション数に従って、パーティション単位にデータのレプリカが作成されます。

データのレプリカを分散ノード間で保持することで、ノード障害が発生しても、ノンストップで処理を継続できます。クライアントAPIでは、ノードの障害を検出すると、自動的にレプリカを保持する別ノードにアクセスを切り替えます。

レプリケーション数のデフォルト値は2で、複数ノードのクラスタ構成で動作した場合、データが2重化されます。

コンテナに更新があると、多重化されたパーティションのうちオーナノード(レプリカのマスタを持つノード)が更新されます。

その後オーナノードから更新内容がバックアップノードに反映されますが、その方法は2つあります。

可用性よりも性能を重視する場合は非同期レプリケーションに、可用性を重視する場合は準同期レプリケーションに設定してください。

【メモ】

6.8 アフィニティ機能

アフィニティ機能とは、関連のあるデータを結びつける機能です。GridDBではアフィニティ機能として、データアフィニティとノードアフィニティの2種類を提供します。

6.8.1 データアフィニティ

データアフィニティとは、同じパーティションに配置されたコンテナ(テーブル)を、ヒント情報を元にグルーピングして、それぞれ別ブロックに配置するための機能です。各ブロックに関連性の強いデータのみ格納することで、データアクセスの局所化を図り、メモリヒット率を高めることができます。

データアフィニティの設定はコンテナ(テーブル)作成時にプロパティとしてヒント情報を与えます。ヒント情報は、コンテナ(テーブル)名の命名規則と同様に指定できる文字に制限があります。同じヒント情報があるデータをできるだけ同じブロックに配置します。

データアフィニティのヒント情報は、データの更新頻度や参照頻度に応じて設定します。 たとえば、分単位、日単位、月単位、年単位にデータをサンプリングや参照する監視システムに対して、以下のような利用方法でシステムのデータが登録・参照・更新される場合のデータ構造を考えます。

  1. 監視機器から分単位のデータが送信され、監視機器単位に作成したコンテナにデータを保存
  2. 日単位のデータレポート作成のため、一日分のデータの集計を分単位データから行い、日単位コンテナ(テーブル)に保存
  3. 月単位のデータレポート作成のため、日単位コンテナ(テーブル)のデータの集計を行い、月単位コンテナ(テーブル)に保存
  4. 年単位のデータレポート作成のため、月単位コンテナ(テーブル)のデータの集計を行い、年単位コンテナ(テーブル)に保存
  5. カレントの使用量(分単位、日単位)は常に表示パネルに更新表示

GridDBでは、コンテナ単位にブロックを占有するのではなく、ブロックには時刻の近いデータが配置されます。したがって、2.の日単位コンテナ(テーブル)を参照し、月単位の集計を行い集計時間をROWKEY(PRIMARY KEY)とする3.のデータと、分単位の1.のデータが同一ブロックに保存される可能性があります。

メモリが小さく監視データがすべてメモリに収まらない大容量データで4.の年単位の集計処理を行う場合、ブロックが分断して配置された3.のデータをメモリに配置するために、常時必要な1.のデータがメモリから追い出されるなど、直近でないデータの読み込みにより監視したいデータがスワップアウトされる状況が発生します。

この場合データアフィニティで、分単位、日単位、月単位などコンテナ(テーブル)のアクセス頻度に沿ったヒントを与えることで、アクセス頻度の低いデータと高いデータをデータ配置時に別ブロックに分離します。

このように、データアフィニティによってアプリケーションの利用シーンに合わせたデータ配置ができます。

データアフィニティ
データアフィニティ

【注意】

6.8.2 ノードアフィニティ

ノードアフィニティとは、関連の強いコンテナやテーブルを同じノードに配置し、データアクセス時のネットワーク負荷を減少させるための機能です。GridDBのSQLではテーブルのJOIN操作が記述できます。テーブルのJOIN操作時にクラスタの別ノードに配置されたテーブルのネットワークアクセスでの負荷を減少させることができます。また、複数ノードを用いた並列処理ができなくなるため、ターンアラウンド時間の短縮には効果がない反面、ネットワーク負荷の減少によりスループットが上がる可能性があります。

ノードアフィニティによるコンテナ/テーブルの配置
ノードアフィニティによるコンテナ/テーブルの配置

ノードアフィニティを利用するには、コンテナ(テーブル)作成時にコンテナ(テーブル)名にヒント情報を与えます。ヒント情報が同一のコンテナ(テーブル)は同一のパーティションに配置されます。 以下のように指定します。

ノードアフィニティのヒント情報の命名もコンテナ(テーブル)名の命名規則と同様です。

【注意】

6.9 トリガ機能

トリガ機能とは、コンテナのロウデータへの操作(登録/更新もしくは削除)が行われた際に、Java Messaging Service(JMS)またはRESTを用いて自動的に通知する機能です。 アプリケーションシステムでデータベースの更新をポーリングして監視する必要はなく、事象の通知をうけることができます。

トリガ機能の動作
トリガ機能の動作

【注意】

6.10 コンテナ(テーブル)の定義変更

コンテナ作成後に、カラム追加などのコンテナ定義の変更を行うことができます。変更可能な操作と使用するAPIは以下の通りです。

操作 NoSQL API JDBC
カラム追加(末尾)
カラム追加(末尾以外) ○(※1) ×
カラム削除 ○(※1) ×

6.10.1 カラム追加

コンテナに新しいカラムを追加します。

カラムを追加した後に既存ロウを取得した場合、追加カラムの値はカラムのデータ型ごとに定義されている「空の値」が返ります。空の値の詳細は『GridDB Java APIリファレンス』(GridDB_Java_API_Reference.html)のContainer<K,R>をご参照ください。 (V4.1では、制限事項「カラム追加後に既存のロウを参照した時、NOT NULL制約が付いていないカラムはNULLが返る」があります。詳細は『GridDB リリースノート』(GridDB_ReleaseNotes.html)の制限事項の項目をご参照ください。)

カラム追加の例
カラム追加の例

6.10.2 カラム削除

コンテナのカラムを削除します。NoSQL APIのみで操作できます。

6.11 データベース圧縮/解放機能

6.11.1 データブロック圧縮

GridDBは、メモリ上のデータをデータベースファイルに書き込むことで、メモリサイズに依存しない大容量化を実現できますが、ストレージのコストは増加します。データブロック圧縮機能は、データベースファイル(チェックポイントファイル)を圧縮することで、データ量に伴って増加するストレージコストの削減を支援する機能です。 特に、HDDと比べ容量単価が高いフラッシュメモリをより効率的に活用できます。

圧縮方法

メモリ上のデータをデータベースファイル(チェックポイントファイル)に書き出す際に、GridDBの書き出し単位であるブロック毎に圧縮操作を行います。圧縮により空いた領域は、Linuxのファイルブロック割り当て解除処理を行うため、ディスク使用量を削減できます。

サポート環境

データブロック圧縮はLinuxの機能を利用しているため、Linuxカーネルバージョンとファイルシステムに依存します。データブロック圧縮のサポート環境は以下です。

 ※上記以外の環境でデータブロック圧縮を有効にした場合、GridDBノードの起動に失敗します。

設定方法

GridDBノードごとに圧縮機能を設定します。

【注意】

6.11.2 データブロック未使用領域解放

データブロック未使用領域解放機能は、データベースファイル(チェックポイントファイル)の使用されていないブロック領域に対して、Linuxのファイルブロック割り当て解除処理を行い、データベースファイルのサイズ(実ディスク割当量)を縮小することができる機能です。

以下のようなケースにおいて、ディスク使用量を削減したい場合にご利用ください。

未使用領域を解放する処理や、本機能のサポート環境、実行方法について説明します。

解放処理

GridDBノード起動時に、データベースファイル(チェックポイントファイル)の未使用領域を解放します。 解放された領域は、新たなデータ更新が発生しない限りディスク領域は割り当てられません。

サポート環境

サポート環境は、データブロック圧縮機能と同じです。

実行方法

GridDBノード起動時に、gs_startnodeコマンドでデータブロック未使用領域解放オプション(--releaseUnusedFileBlocks)を指定します。

データベースファイル(チェックポイントファイル)の未使用領域サイズとディスク割当サイズは、下記の方法で確認してください。

データブロック未使用領域解放機能の実施目安としては、データブロック未使用領域が多い(上記の値の比較で、storeTotalUse ≪ checkpointFileAllocateSize) 場合です。

【注意】

7 運用機能

7.1 サービス制御

OSの起動と同時にGridDBをサービスとして動作させるサービス制御機能があります。

GridDBのサービスは、RPMのインストール直後からサービスが有効となっています。サービスが有効となっているため、OS起動と同時にGridDBのサーバが起動され、OS停止時はサーバが停止されます。

OSの監視やデータベースソフトウェアの動作を含めたミドルウェアやアプリケーションの運用を統合化したインターフェースを用いる場合、サービス制御の機能を用いるのか、もしくは運用コマンドを利用するのか、サービスの起動停止の他ミドルウェアとの依存性も検討する必要があります。

GridDBのサービスは、OS起動時に自動的に実行され、GridDBノード(以下、ノード)を起動し、 GridDBクラスタ(以下、クラスタ)へ参加します。OSのシャットダウン時には、クラスタから離脱し、ノードを停止します。

サービスにより、次のことができます。

 

ノード3台のクラスタに対するサービス操作の手順は以下の通りです。

 

 

【注意】

 

なお、サービス制御を使用しない場合、以下のようにすべてのランレベルでサービスを無効にします。

# /sbin/chkconfig gridstore off

7.2 ユーザ管理機能

GridDBのユーザには、インストール時に作成されるOSユーザとGridDBの運用/開発を行うGridDBのユーザ(以降GridDBユーザと呼ぶ)の2種類があります。

7.2.1 OSユーザ

OSユーザは、GridDBの運用機能を実行できる権限を持つユーザであり、GridDBインストール時にgsadmというユーザが作成されます。以降このOSユーザをgsadmと呼びます。

GridDBのリソースはすべて、gsadmの所有物となります。また、GridDBの運用操作のコマンド実行はすべてgsadmで実行します。

運用操作では、GridDBサーバに接続し運用操作を実行できる権限を持ったユーザか否かの認証を行います。この認証は、GridDBユーザで行います。

7.2.2 GridDBユーザ 

GridDBのユーザ
GridDBのユーザ

7.2.3 利用できる機能

管理ユーザができる運用操作と一般ユーザが利用できる操作を以下に示します。運用操作のうちGridDBユーザを用いずに、gsadmで実行可能なコマンドは◎印で明記します。

操作 操作詳細 利用する運用ツール gsadm 管理ユーザ 一般ユーザ
ノード操作 ノードの起動 gs_startnode/gs_sh ×
ノードの停止 gs_stopnode/gs_sh ×
クラスタ操作 クラスタの構築 gs_joincluster/gs_sh ×
クラスタへのノード増設 gs_appendcluster/gs_sh ×
クラスタからのノード離脱 gs_leavecluster/gs_sh ×
クラスタの停止 gs_stopcluster/gs_sh ×
ユーザ管理 管理ユーザ登録 gs_adduser × ×
管理ユーザの削除 gs_deluser × ×
管理ユーザのパスワード変更 gs_passwd × ×
一般ユーザの作成 gs_sh ×
一般ユーザの削除 gs_sh ×
一般ユーザのパスワード変更 gs_sh ○:本人のみ
データベース管理 データベースの作成・削除 gs_sh ×
データベースへのユーザ割り当て/解除 gs_sh ×
データ操作 コンテナやテーブルの作成・削除 gs_sh ○:本人のDB内で更新操作が可能な場合のみ
コンテナやテーブルへのデータ登録 gs_sh ○:本人のDB内で更新操作が可能な場合のみ
コンテナやテーブルの検索 gs_sh ○:本人のDB内のみ
コンテナやテーブルへの索引操作 gs_sh ○:本人のDB内で更新操作が可能な場合のみ
バックアップ管理 バックアップ作成 gs_backup ×
バックアップ管理 バックアップリストア gs_restore × ×
バックアップリスト gs_backuplist ×
システムステータス管理 システム情報の取得 gs_stat ×
パラメータ変更 gs_paramconf ×
データインポート/ データのインポート gs_import ○:アクセスできる範囲
エクスポート データのエクスポート gs_export ○:アクセスできる範囲

7.2.4 データベースとユーザ

GridDBのクラスタデータベース(以降クラスタデータベースと呼びます)を利用ユーザ単位にアクセスを分離することができます。分離する単位を データベース と呼びます。 データベースは、クラスタデータベースの初期状態では以下のデータベースがあります。

データベースはクラスタデータベースに複数作成することができます。データベースの作成、削除、ユーザへの割り当ては管理ユーザが行います。

データベース作成時の規則は以下に示すとおりです。

データベースへ一般ユーザを割り当てる際、権限を指定します。権限は以下の種類があります。

データベースにアクセスできるのは割り当てた一般ユーザと管理ユーザのみです。管理ユーザはすべてのデータベースにアクセスすることができます。 データベースへ一般ユーザを割り当てる際、以下規則があります。

データベースとユーザ
データベースとユーザ

7.2.5 認証方式

GridDBの認証方式には、以下があります。

各方式について、説明します。

7.2.5.1 内部認証

GridDBの管理/一般ユーザのユーザ名、パスワード、および権限をGridDBで管理します。認証方式を指定しない場合、内部認証がデフォルトです。

管理ユーザは、運用コマンドのgs_adduser/gs_deluser/gs_passwdで管理します。

一般ユーザは、SQLのCREATE USER/DROP USER/SET PASSWORD文で管理します。また、一般ユーザのアクセス権は、SQLのGRANT/REVOKE文で管理します。

ユーザキャッシュ設定

一般ユーザ情報のキャッシュの設定は、以下のノード定義ファイル(gs_node.json)を編集します。

【注意】

パラメータ デフォルト 設定値
/security/userCacheSize 1000 キャッシュする一般ユーザ/LDAPユーザエントリ数を指定。
/security/userCacheUpdateInterval 60 キャッシュの更新間隔(秒)を指定。

7.2.5.2 LDAP認証

GridDBの一般ユーザをLDAPで管理します。また、LDAP内のユーザ名/グループ名と同じ名前のロールを作成し権限を操作することで、LDAPユーザの権限を管理します。また、認証処理の高速化のため、LDAPで管理するユーザ情報のキャッシュ機能を提供します。

【注意】

共通設定

LDAP認証を利用する場合は、以下、クラスタ定義ファイル(gs_cluster.json)を編集します。

パラメータ デフォルト 設定値
/security/authentication INTERNAL 認証方式として、INTERNAL(内部認証) / LDAP(LDAP認証)のいずれかを指定。
/security/ldapRoleManagement USER GridDBのロールとマッピングする対象として、USER(LDAPユーザ名でマッピング) / GROUP(LDAPグループ名でマッピング)のいずれかを指定。
/security/ldapUrl LDAPサーバを次の形式で指定。ldap[s]://host[:port]

【注意】

ロール管理

ロールは、SQLのCREATE ROLE / DROP ROLE文で管理します。/security/ldapRoleManagementが「USER」の場合はLDAPのユーザ名で、「GROUP」の場合はLDAPのグループ名でロールを作成します。作成したロールに対するアクセス権限は、SQLのGRANT/REVOKE文で管理します。

LDAP認証モード設定

次に、LDAPユーザの認証方法として、単純モード(直接ユーザアカウントでバインド)とサーチモード(LDAP管理ユーザでバインド後に、ユーザを検索/認証)を選択します。以下、クラスタ定義ファイル(gs_cluster.json)を編集します。

【注意】

■単純モード

パラメータ デフォルト 設定値
/security/ldapUserDNPrefix ユーザのDN(識別子)を生成するために、ユーザ名の前に連結する文字列を指定。
/security/ldapUserDNSuffix ユーザのDN(識別子)を生成するために、ユーザ名の後に連結する文字列を指定。

■サーチモード

パラメータ デフォルト 設定値
/security/ldapBindDn LDAP管理ユーザのDNを指定。
/security/ldapBindPassword LDAP管理ユーザのパスワードを指定。
/security/ldapBaseDn 検索を開始するルートDNを指定。
/security/ldapSearchAttribute uid 検索対象となる属性を指定。
/security/ldapMemberOfAttribute memberof ユーザが所属するグループDNが設定された属性を指定。(ldapRoleManagement=GROUPの場合に有効)

ユーザキャッシュ設定

LDAPユーザ情報のキャッシュの設定は、以下のノード定義ファイル(gs_node.json)を編集します。

【注意】

パラメータ デフォルト 設定値
/security/userCacheSize 1000 キャッシュする一般ユーザ/LDAPユーザエントリ数を指定。
/security/userCacheUpdateInterval 60 キャッシュの更新間隔(秒)を指定。

設定例

以下に設定例を記載します。条件は以下です

■ロールの設定例(SQL文)

 CREATE ROLE TEST
 GRANT SELECT ON sampleDB to TEST

■サーバの設定例(gs_cluster.jsonの一部抜粋)

            :
"security":{
    "authentication":"LDAP",
    "ldapRoleManagement":"USER",
    "ldapUrl":"ldaps://192.168.1.100:636",
    "ldapUserDnPrefix":"CN=",
    "ldapUserDnSuffix":",ou=d1,ou=dev,dc=example,dc=com",
    "ldapSearchAttribute":"",
    "ldapMemberOfAttribute": "" 
},
            :

7.3 セキュリティ機能

7.3.1 通信の暗号化

GridDBでは、GridDBクラスタとクライアント間のSSL接続をサポートします。

【注意】

$ python -c "import ssl; print(ssl.OPENSSL_VERSION)" 

設定

SSL接続を行うためには、以下、クラスタ定義ファイル(gs_cluster.json)、およびノード定義ファイル(gs_node.json)を編集します。そして、サーバ証明書および秘密鍵のファイルを適切なディレクトリに配置します。

【注意】

■クラスタ定義ファイル(gs_cluster.json)

パラメータ デフォルト 設定値
/system/serverSslMode DISABLED SSL接続設定として、DISABLED(SSL無効)、PREFERRED(SSL有効、ただし非SSL接続も許容)、REQUIRED(SSL有効、非SSL接続は不可)のいずれかを指定。
/system/sslProtocolMaxVersion TLSv1.2 TLSプロトコルバージョンとして、TLSv1.2, TLSv1.3のいずれかを指定。

■ノード定義ファイル(gs_node.json)

パラメータ デフォルト 設定値
/system/securityPath security サーバ証明書、秘密鍵の配置ディレクトリをフルパスもしくは、相対パスで指定。
/system/serviceSslPort 10045 運用コマンド用待ち受けSSLポート

■サーバ証明書および秘密鍵

SSLを有効にする場合は、/system/securityPathに設定したディレクトリに、サーバ証明書および秘密鍵をそれぞれ次のファイル名で配置します。

クライアント設定

クライアント側で、SSL接続の有効、無効を指定できます。詳細は各ツール、およびAPIリファレンスをご参照ください。

7.4 障害処理機能

GridDBでは、クラスタを構成する各ノードでデータのレプリカを保持するため、単一点故障に対してのリカバリは不要です。 GridDBでは障害発生時には以下のような動作を行います。

  1. 障害発生時、障害ノードはクラスタから自動的に離脱する。
  2. 離脱した障害ノードに代わり、バックアップノードへのフェイルオーバーが行われる。
  3. 障害によりノード台数が減少するため、自律的にパーティションの再配置を行う(レプリカも配置する)。

障害の回復したノードはオンラインでクラスタ運用に組み込むことができます。障害によりUNSTABLEな状態となったクラスタには、gs_joinclusterコマンドを用いてノードを組み込めます。ノード組込みにより、自律的にパーティションの再配置が行われノードのデータ、負荷バランスが調整されます。

このように、単一点故障の場合にはリカバリのための事前の準備は不要ですが、シングル構成で運用する場合や、クラスタ構成においても複数の障害が重なった場合にはリカバリの操作が必要です。

クラウド環境で稼働させる場合、物理的なディスクの障害やプロセッサ障害で意図せずともクラスタを構成する複数ノードの障害、複数ノードでのデータベース障害といった多重障害となるケースがあります。

7.4.1 障害の種類と処置

発生する障害と対処方法の概要を以下の表に示します。

ノード障害とは、プロセッサ障害やGridDBのサーバプロセスのエラーによりノードが停止した状態、データベース障害とは、ディスクに配置したデータベースへのアクセスでエラーが発生した状態を指します。

GridDBの構成 障害の種類 動作と処置
シングル構成 ノード障害 アプリケーションからアクセスはできなくなりますが、ノードの障害要因を取り除き再起動するだけで、処理が完了したトランザクションのデータはリカバリされます。ノード障害が長期化した際は、別ノードでのリカバリを検討します。
シングル構成 データベース障害 アプリケーションでエラーを検出するため、バックアップしたデータからデータベースファイルを復旧します。データはバックアップ時点に復旧されます。
クラスタ構成 単一ノード障害 アプリケーションにはエラーが隠ぺいされ、レプリカのあるノードで処理が継続できます。障害が発生したノードでのリカバリ操作は不要です。
クラスタ構成 複数ノード障害 レプリカのオーナ/バックアップの双方のパーティションが障害対象ノードに存在する場合、対象パーティションにアクセスができませんが、クラスタは正常に稼働します。ノードの障害要因を取り除き再起動するだけで、処理が完了したトランザクションのデータはリカバリされます。ノードの障害が長期化する場合は別ノードでのリカバリを検討します。
クラスタ構成 単一データベース障害 単一ノードでのデータベース障害は、クラスタを構成する他のノードでデータアクセスが継続するため、異なるディスクにデータベース配置先を変更し、ノードを再起動するだけでリカバリされます。
クラスタ構成 複数データベース障害 レプリカで復旧できないパーティションは最新のバックアップデータからバックアップ採取時点にリカバリさせる必要があります。

7.4.2 クライアントフェイルオーバー

クラスタ構成で運用している際にノード障害が発生した場合、障害ノードに配置されているパーティション(コンテナ)にはアクセスできません。この時、クライアントAPI内で、自動的にバックアップノードに接続し直して処理を継続するクライアントフェイルオーバー機能が動作します。クライアントAPI内で自動的に障害対策を行うため、アプリケーション開発者はノードのエラー処理を意識する必要がありません。

しかし、複数のノードの同時障害やネットワーク障害などにより、アプリケーション操作対象にアクセスできずエラーになることもあります。

エラー発生後のリカバリではアクセス対象のデータに応じて以下の点を考慮する必要があります。

【メモ】

7.4.3 自動再起動機能

GridDBノードが異常終了した場合、またはノードプロセスが強制終了された場合、自動的にノードの再起動、およびクラスタ参加を実行します。 運用管理者が意識せずに、クラスタの状態を正常稼働に戻すことができます。

障害対策機能
障害対策機能

【注意】

以下の場合は自動起動処理を実施しません。

設定

障害対策機能の設定は以下になります。

パラメータ デフォルト 設定値
SVC_ENABLE_AUTO_RESTART true true(有効)/false(無効)
GS_USER admin 適宜
GS_PASSWORD admin 適宜

パラメータを変更するには起動設定ファイル( /etc/sysconfig/gridstore/gridstore.conf )を編集します。

【注意】

7.5 エクスポート/インポート機能

GridDBのエクスポート/インポートでは、データベースの局所的な破壊に対して復旧を行う障害回復処理や、システム構成が変更された際のデータベースの移行(マイグレーション)処理などを実現するために、データベースやコンテナ単位での保存/復元機能を提供します。また、RDBとの連携機能もあり、RDBのデータを収集してGridDBに登録することもできます。

GridDBクラスタでは、コンテナデータをクラスタ内のノードに自動的に配置します。利用者は、どのノードにデータが配置されているかを意識する必要はありません(データの位置透過)。エクスポート/インポートでも、データの取り出し・登録で配置位置を意識する必要はありません。エクスポート/インポートの構成は以下のとおりです。

エクスポート/インポートの構成
エクスポート/インポートの構成

【エクスポート(export)】

① GridDBクラスタのコンテナおよびロウデータを、以下のファイルに保存します。コンテナ名を指定して特定コンテナのみエクスポートすることもできます。

 ※詳細は『GridDB 運用ツールリファレンス』(GridDB_OperationToolsReference.html)をご参照ください。

【インポート(import)】

② エクスポートデータを保存したコンテナデータファイルとエクスポート実行情報ファイルを読み込んで、コンテナおよびロウデータをGridDBに復元します。特定のコンテナデータを指定して、インポートすることもできます。

③ ユーザが作成したコンテナデータファイルを読み込んで、コンテナとロウデータを登録します。

④ RDB(Oracle)データを読み込んで、RDBのテーブルからGridDBのコンテナにデータを対応付けて登録します。

【メモ】

7.6 バックアップ/リストア機能

データベース障害やアプリケーションの誤動作によるデータ破壊に備えるために、定期的なバックアップの採取が必要です。バックアップ運用は、サービスレベルの要求やシステムのリソースに応じて対処方法を選択する必要があります。

バックアップ方式と、それぞれの方式について以下の項目を説明します。

7.6.1 バックアップ方式

データベース障害やアプリケーションの誤動作によるデータ破壊に備えるために、定期的なバックアップの採取が必要です。 バックアップ運用は、障害発生時のリカバリの要件(いつの時点にリカバリするか)、バックアップにかかる時間、バックアップのために用意できるディスクの容量に応じて、バックアップの種別やバックアップの間隔を決定します。リカバリ保証のサービスレベルからの要求やシステムのリソースに応じて対処方法を選択する必要があります。 GridDBのバックアップ方式には、以下のものがあります。

バックアップ方式 復旧時点 特徴
オフラインバックアップ クラスタ停止時点 バックアップのコピー完了までクラスタ停止が必要です。 ノード間で復旧時点が異なることはありません。
オンラインバックアップ(フル+差分・増分) バックアップ採取完了時点 GridDBバックアップコマンドを利用します。バックアップの取得完了のタイミングにより、ノード間で復旧時点が異なることがあります。
オンラインバックアップ(自動ログ) 障害直前の時点 GridDBバックアップコマンドを利用します。トランザクションログから最新状態にリカバリするため、起動時間が長くなることがあります。
ファイルシステムレベルのオンラインバックアップ(スナップショット等) スナップショット取得時点 OSやストレージのスナップショットと連携してバックアップを取得します。各ノードに対して同時にスナップショットを実行しても、更新トランザクションのログ書き込みモードがDELAYED_SYNCの場合、ノード間で1秒程度ずれが発生する場合があります。
ファイルシステムレベルのオンラインバックアップ(OSコピー等+自動ログ) 障害直前の時点 バックアップソリューション等と連携してバックアップを取得します。トランザクションログから最新状態にリカバリするため、起動時間が長くなることがあります。

GridDBのオンラインバックアップの機能については、オンラインバックアップを参照ください。

【注意】

GridDBのオンラインバックアップ機能を使用せず、ファイルシステムレベルのオンラインバックアップを行う場合は、ファイルシステムレベルのバックアップを参照ください。

オフラインバックアップを行うには、まずgs_stopclusterコマンドでクラスタを停止してから、クラスタを構成する全ノードを停止してください。 次に、各ノードのデータベースファイルの配置ディレクトリ(gs_node.jsonの/dataStore/dbPathで示すディレクトリ)下のデータをバックアップしてください。 チェックポイントファイル分割を行う設定となっている場合はさらに、分割チェックポイントファイルの配置ディレクトリ(gs_node.jsonの/dataStore/dbFilePathListで示すディレクトリ)下のデータをバックアップしてください。 クラスタデータベースに関連するデータはすべてdbPathディレクトリ、およびチェックポイントファイル分割時はdbFilePathListディレクトリ下に配置されています。

定義ファイルのバックアップ

バックアップでは、データベースファイルの定期的なバックアップに加え、定義ファイルのバックアップも必要です。

$GS_HOME/confディレクトリ(デフォルトでは、/var/lib/gridstore/conf)にあるノード定義ファイル(gs_node.json)、クラスタ定義ファイル(gs_cluster.json)、ユーザ定義ファイル(password)のバックアップをOSのコマンドを用いて採取しておいてください。

定義ファイルのバックアップは、設定変更やユーザ登録・変更した場合には、必ず実施してください。

7.6.2 オンラインバックアップとリカバリ操作

7.6.2.1 バックアップ運用

GridDBの障害に備えたバックアップ運用について説明します。

7.6.2.1.1 バックアップの種類

GridDBでは、ノード単位のオンラインバックアップが可能です。これをGridDBクラスタを構成する全ノードに対して順次行うことで、サービスを継続しながら、クラスタ全体としてオンラインバックアップが行えます。 GridDBの提供するオンラインバックアップの種類には以下のものがあります。

バックアップ種別 バックアップの動作 復旧時点
フルバックアップ 現在利用中のクラスタデータベースをノード定義ファイルで指定したバックアップディレクトリにノード単位にオンラインでバックアップする。 フルバックアップ採取時点
差分・増分バックアップ 現在利用中のクラスタデータベースをノード定義ファイルで指定したバックアップディレクトリにノード単位にオンラインでバックアップし、以降のバックアップでは、バックアップ後の更新ブロックの差分増分のみをバックアップする。 差分増分バックアップ採取時点
自動ログバックアップ 現在利用中のクラスタデータベースをノード定義ファイルで指定したバックアップディレクトリにノード単位にオンラインでバックアップするとともに、トランザクションログファイルの書き込みと同じタイミングでトランザクションログも自動で採取します。トランザクションログファイルの書き込みタイミングは、ノード定義ファイルの/dataStore/logWriteModeの値に従います。 最新トランザクションの更新時点

利用するバックアップの種類に応じて復旧できる時点が異なります。

GridDBの提供する各バックアップの動作と、利用を推奨するシステムについて以下に示します

フルバックアップ
フルバックアップ
差分・増分バックアップ
差分・増分バックアップ
自動ログバックアップ
自動ログバックアップ

【注意】

バックアップの種別は、コマンドのオプションで指定します。

7.6.2.1.2 バックアップ関連パラメータの確認

バックアップ先は、ノード定義ファイルの /dataStore/backupPathで指定します。ディスクの物理障害を考慮して、バックアップ先とデータベースファイル(/dataStore/dbPath)は必ず異なる物理ディスクに配置するように設定してください。チェックポイントファイル分割を行う設定となっている場合は、バックアップ先とデータベースファイル(/dataStore/dbPath)、分割チェックポイントファイルの配置ディレクトリ(/dataStore/dbFilePathList)は必ず異なる物理ディスクに配置するように設定してください。

トランザクションのログ永続化には2つのモードがあります。デフォルト値はNORMALです。

KEEP_ALL_LOGSは、他社のバックアップソフトウェアとの連携等でログファイルの削除を指示する運用を行うなど特別な用途の場合のみ指定しますが、通常は利用しません。

ノード定義ファイルの指定例を以下に示します。

$ cat /var/lib/gridstore/conf/gs_node.json         # 設定の確認例
{
    "dataStore":{
        "dbPath":"/var/lib/gridstore/data",
        "backupPath":"/mnt/gridstore/backup",      # バックアップディレクトリ
        "storeMemoryLimit":"1024",
        "concurrency":2,
        "logWriteMode":1,
        "persistencyMode":"NORMAL"                 #永続化モード
      :
      :
}
7.6.2.1.3 バックアップの実行

フルバックアップ、差分・増分バックアップ、自動ログバックアップの各々の利用方法を説明します。

どのバックアップでも、バックアップ名(BACKUPNAME)を指定してバックアップを実行します。バックアップで作成されるデータは、ノード定義ファイルのbackupPathで指定したディレクトリ下にバックアップ名(BACKUPNAME)と同じ名前のディレクトリが作成され、配置されます。

BACKUPNAMEは、12文字以内の英数字で指定できます。

7.6.2.1.4 フルバックアップ

障害発生時、フルバックアップの採取完了時点までリカバリできます。 フルバックアップをクラスタを構成するすべてのノードに対して実施します。バックアップデータはコマンドのBACKUPNAMEで示すディレクトリに配置されます。採取したバックアップデータをわかりやすく管理するためにBACKUPNAMEに日付を指定する運用をお勧めします。

以下のコマンドをクラスタ内の全ノードに対して実行します。


$ gs_backup -u admin/admin 20141025

この例では、

  1. バックアップ名(BACKUPNAME)を「20141025」とすると、バックアップディレクトリ下に「20141025」というディレクトリが作成されます。
  2. チェックポイントファイル(gs_cp_n_p.dat)、トランザクションログファイル(gs_log_n_m.log)、バックアップ情報ファイル(gs_backup_info.json,gs_backup_info_digest.json)さらにLSN情報ファイルが、「20141025」ディレクトリに作成されます。

チェックポイントファイルとトランザクションログファイルは、ノード定義ファイルの並列度(/dataStore/concurrency)の数だけ作成されます。ただし、チェックポイントファイル分割を行う設定となっている場合、チェックポイントファイルはノード定義ファイルの並列度(/dataStore/concurrency)×分割数(/dataStore/dbFileSplitCount)の数だけ作成されます。


$ cd /mnt/gridstore/backup
$ ls -l 20141025
-bash-4.1$ ls -l 20141025
合計 13502036
-rw-r--r-- 1 gsadm gridstore        731 10月 25 06:39 2015 gs_backup_info.json
-rw-r--r-- 1 gsadm gridstore         82 10月 25 06:39 2015 gs_backup_info_digest.json
-rw-r--r-- 1 gsadm gridstore 6759120896 10月 25 06:37 2015 gs_cp_0_1.dat
-rw-r--r-- 1 gsadm gridstore 7064846336 10月 25 06:38 2015 gs_cp_1_1.dat
-rw-r--r-- 1 gsadm gridstore    1048576 10月 25 06:38 2015 gs_log_0_161.log
-rw-r--r-- 1 gsadm gridstore    1048576 10月 25 06:39 2015 gs_log_1_161.log
-rw-r--r-- 1 gsadm gridstore        706 10月 25 06:39 2015 gs_lsn_info.json


バックアップコマンドは、バックアップの指示をサーバに通知するだけで、処理の完了は待ち合わせません。

バックアップ処理の完了は、gs_statコマンドのステータスで確認してください。


$ gs_backup -u admin/admin 20141025
$ gs_stat -u admin/admin --type backup
BackupStatus: Processing

バックアップが正しく採取できたか否かは、gs_backuplistコマンドのステータスで確認できます。

$ gs_backuplist -u admin/admin

BackupName   Status   StartTime                EndTime
------------------------------------------------------------------------
 20141025NO2     P   2014-10-25T06:37:10+0900 -
 20141025        NG  2014-10-25T02:13:34+0900 -
 20140925        OK  2014-09-25T05:30:02+0900 2014-09-25T05:59:03+0900
 20140825        OK  2014-08-25T04:35:02+0900 2014-08-25T04:55:03+0900


バックアップリストのStatusの記号を以下に示します。

7.6.2.1.5 差分・増分ブロックバックアップ

障害発生時、ベースライン(基準点)となるフルバックアップとベースライン以降の差分・増分バックアップを用いて、最後の差分・増分バックアップ採取時点まで復旧できます。 差分・増分バックアップのベースラインとしてフルバックアップを取得し、以降差分・増分バックアップを指定します。

データの更新容量とリカバリにかかる時間のサービス目標に応じてバックアップの採取間隔は検討する必要がありますが、以下を目安として運用してください。

フルバックアップのベースライン作成は、以下のように指定します。この例ではBACKUPNAMEは「201504」です。

$ gs_backup  -u admin/admin --mode baseline 201504
$ gs_stat -u admin/admin --type backup
BackupStatus: Processing(Baseline)

バックアップのベースラインとして、データディレクトリにあるデータベースファイルが、バックアップディレクトリ下にコピーされます。

ベースライン作成後の定期的な差分・増分ブロックのバックアップ(ベースラインのフルバックアップ以降に更新されたデータブロックのバックアップ)は、バックアップコマンド(gs_backup)のモードとしてincrementalやsinceを指定します。BACKUPNAMEには、ベースライン作成時のBACKUPNAMEと同じ値を指定します。この例ではBACKUPNAMEは『201504』です。

***** 増分バックアップの場合
$ gs_backup  -u admin/admin --mode incremental 201504
$ gs_stat  -u admin/admin --type backup
BackupStatus: Processing(Incremental)

***** 差分バックアップの場合
$ gs_backup  -u admin/admin --mode since 201504
$ gs_stat  -u admin/admin --type backup
BackupStatus: Processing(Since)

バックアップが正しく採取できたか否かはgs_backuplistコマンドで確認できます。差分・増分バックアップは、複数のバックアップで1つのリカバリ単位となるため、BACKUPNAMEの一覧では1つとして扱われます。したがってステータスの詳細を見るには、バックアップ名を指定して詳細を確認します。

差分・増分バックアップであるというこことはBACKUPNAMEの先頭に"*":アスタリスクがついていることで確認できます。差分・増分のバックアップのステータスは常に"--"です。

差分・増分バックアップのステータスは、gs_backuplistコマンドの引数にBACKUPNAMEを指定することで確認できます。

***** BACKUPNAMEの一覧を表示します
$ gs_backuplist -u admin/admin

BackupName   Status   StartTime                EndTime
------------------------------------------------------------------------
*201504          --  2015-04-01T05:20:00+0900 2015-04-24T06:10:55+0900
*201503          --  2015-03-01T05:20:00+0900 2015-04-24T06:05:32+0900
  :
 20141025NO2     OK   2014-10-25T06:37:10+0900 2014-10-25T06:37:10+0900

***** 個別のBACKUPNAMEを指定し、詳細情報を表示します
$ gs_backuplist -u admin/admin 201504

BackupName : 201504

BackupData            Status   StartTime                EndTime
--------------------------------------------------------------------------------
201504_lv0                OK  2015-04-01T05:20:00+0900 2015-04-01T06:10:55+0900
201504_lv1_000_001        OK  2015-04-02T05:20:00+0900 2015-04-01T05:20:52+0900
201504_lv1_000_002        OK  2015-04-03T05:20:00+0900 2015-04-01T05:20:25+0900
201504_lv1_000_003        OK  2015-04-04T05:20:00+0900 2015-04-01T05:20:33+0900
201504_lv1_000_004        OK  2015-04-05T05:20:00+0900 2015-04-01T05:21:15+0900
201504_lv1_000_005        OK  2015-04-06T05:20:00+0900 2015-04-01T05:21:05+0900
201504_lv1_001_000        OK  2015-04-07T05:20:00+0900 2015-04-01T05:22:11+0900
201504_lv1_001_001        OK  2015-04-07T05:20:00+0900 2015-04-01T05:20:55+0900

差分・増分のバックアップデータは、バックアップディレクトリに以下の規則でディレクトリが作成され、データが配置されます。

バックアップリストのStatusの記号を以下に示します。

差分・増分バックアップでは、BackupDataで示すディレクトリ下に、gs_log_n_m_incremental.logという名前で更新ブロックのログが出力されます。

差分・増分バックアップはフルバックアップと比較してバックアップ時間を削減できます。しかし障害発生時のリカバリにはフルバックアップのデータに更新ブロックをロールフォワードするため、リカバリには時間がかかります。 定期的なベースライン取得やSince指定によるベースラインからの差分バックアップを実施してください。

【注意】

7.6.2.1.6 自動ログバックアップ

GridDBが自動的にトランザクションログをバックアップディレクトリに出力します。従って、常に最新の状態にリカバリすることができます。 自動的なバックアップ操作のため、『システムの利用時間の低い時間にあらかじめスケジューリングしてバックアップ処理をしたい』といったシステムの運用形態に応じた計画的なバックアップはできません。また、自動ログバックアップにより、通常運用中にも多少のシステム負荷が発生します。従って、システムのリソースに余裕がある場合にのみ本指定を用いることをお勧めします。

自動ログバックアップを利用するには次のように指定します。この例ではBACKUPNAMEは「201411252100」です。

$ gs_backup -u admin/admin --mode auto 201411252100
$ gs_stat -u admin/admin --type backup

コマンドを実行するとBACKUPNAMEで示すディレクトリにバックアップを取得します。

この例では、

  1. バックアップディレクトリ下に「201411252100」というディレクトリが作成されます。
  2. フルバックアップと同様にチェックポイントファイル(gs_cp_n_p.dat)、トランザクションログファイル(gs_log_n_m.log)、バックアップ情報ファイル(gs_backup_info.json,gs_backup_info_digest.json)さらにLSN情報ファイルがバックアップディレクトリに作成されます。チェックポイントファイルとトランザクションログファイルは、ノード定義ファイルの並列度(/dataStore/concurrency)の数だけ作成されます。
  3. 「201411252100」ディレクトリ下にトランザクションの実行完了とともにトランザクションログファイル(gs_log_n_m.log)が作成されます。

自動ログバックアップで運用した場合、障害発生時のリカバリは、2)のフルバックアップデータに対して、3)のトランザクションログファイル(gs_log_n_m.log)をロールフォワードします。従ってリカバリに利用するログファイルが多数になるとリカバリ時間が増大しますので、定期的に、--mode autoを指定してフルバックアップを採取してください。

7.6.2.1.7 バックアップ動作の確認

現在実行しているバックアップのモードや実行状態の詳細はgs_statコマンドで取得できる情報でも確認できます。

$ gs_stat -u admin/admin

    "checkpoint": {
        "archiveLog": 0,
        "backupOperation": 3,
        "duplicateLog": 0,
        "endTime": 0,
        "mode": "INCREMENTAL_BACKUP_LEVEL_0",
        "normalCheckpointOperation": 139,
        "pendingPartition": 1,
        "requestedCheckpointOperation": 0,
        "startTime": 1429756253260
    },
        :
        :

gs_statで出力されるバックアップ関連の各パラメータの意味は以下のとおりです。

7.6.2.1.8 コンテナ情報の採取

データベース障害発生時には、どのコンテナがリカバリ対象なのかを把握してコンテナの使用者に連絡するなどの手立てが必要です。リカバリ対象のコンテナを検出するには、定期的に以下の情報を採取している必要があります。

コンテナ一覧を出力するgs_shのコマンドスクリプトを作成しておくことで運用の省力化が図れます。

以下の例では、gs_shのサブコマンドをlistContainer.gshというファイル名で作成します。

setnode node1 198.2.2.1  10040
setnode node2 198.2.2.2  10040
setnode node3 198.2.2.3  10040
setcluster cl1 clusterSeller 239.0.0.20 31999 $node1 $node2 $node3
setuser admin admin gstore
connect $cl1
showcontainer
connect $cl1 db0
showcontainer
 :   dbの数だけ繰り返す
quit

クラスタを構成するノードを示すnode1,node2,node3といったノード変数や、cl1というクラスタ変数、ユーザ設定やデータベース情報は適宜環境に合わせて変更してください。 gs_shの詳細は『GridDB 運用ツールリファレンス』(GridDB_OperationToolsReference.html)を参照ください。

gs_shのスクリプトファイルを以下のように実行することで、コンテナとパーティションの一覧が採取できます。

$ gs_sh listContainer.gsh>`date +%Y%m%d`Container.txt

20141001Container.txtには以下の形式で情報が保存されます。

Database : public
Name                  Type         PartitionId
------------------------------------------------
container_7           TIME_SERIES            0
container_9           TIME_SERIES            7
container_2           TIME_SERIES           15
container_8           TIME_SERIES           17
container_6           TIME_SERIES           22
container_3           TIME_SERIES           25
container_0           TIME_SERIES           35
container_5           TIME_SERIES           44
container_1           TIME_SERIES           53
:
 Total Count: 20

Database : db0
Name                  Type         PartitionId
---------------------------------------------
CO_ALL1              COLLECTION           32
COL1                 COLLECTION          125
 Total Count: 2

7.6.2.2 リカバリ操作

障害発生時のリカバリ操作の概要は以下のとおりです。

  1. 障害の認識とリカバリ範囲の確認
  2. リカバリ操作とノード起動
  3. ノードのクラスタへの組込み
  4. 復旧結果の確認と操作
7.6.2.2.1 障害の認識とリカバリ範囲の確認

GridDB内で障害が発生すると、エラーが発生したノードのイベントログファイルに障害の原因が出力されるとともに、ノードの動作が継続不能と判断した際は、ノードがABNORMAL状態となり、クラスタサービスから切り離されます。

クラスタ構成では、通常複数レプリカが存在する運用を実施しているため、ノードがABNORMAL状態となってもクラスタサービスが停止することはありません。パーティションがレプリカも含めてすべて障害となった場合、データのリカバリが必要です。

データのリカバリが必要か否かは、マスタノードのステータスをgs_statで確認し、/cluster/partitionStatusの値が"OWNER_LOSS"の場合はリカバリが必要です。

$ gs_stat -u admin/admin -p 10041
{
    "checkpoint": {
        :
    },
    "cluster": {
        "activeCount": 2,
        "clusterName": "clusterSeller",
        "clusterStatus": "MASTER",
        "designatedCount": 3,
        "loadBalancer": "ACTIVE",
        "master": {
            "address": "192.168.0.1",
            "port": 10011
        },
        "nodeList": [
            {
                "address": "192.168.0.2",
                "port": 10011
            },
            {
                "address": "192.168.0.3",
                "port": 10010
            }
        ],
        "nodeStatus": "ACTIVE",
        "partitionStatus": "OWNER_LOSS",     ★
        "startupTime": "2014-10-07T15:22:59+0900",
        "syncCount": 4
          :

リカバリしなければならないデータは、gs_partitionコマンドで確認します。--lossオプションを指定してコマンドを実行することで問題のあるパーティションが確認できます。

以下の例では192.168.0.3のノードの問題によりパーティション68がエラーになっています。

$ gs_partition -u admin/admin -p 10041 --loss

[
 {
        "all": [
            {
                "address": "192.168.0.1",
                "lsn": 0,
                "port": 10011,
                "status": "ACTIVE"
            },
            :
            :
            ,
            {
                "address": "192.168.0.3",
                "lsn": 2004,
                "port": 10012,
                "status": "INACTIVE"   <--- このノードのステータスがACTIVEでない
            }
        ],
        "backup": [],
        "catchup": [],
        "maxLsn": 2004,
        "owner": null,           //クラスタ内でパーティションのオーナが不在の状態
        "pId": "68",             //リカバリが必要なパーティションID     
        "status": "OFF"
   },
   {
     :

   }
  ]
7.6.2.2.2 リカバリ操作とノード起動
7.6.2.2.2.1 バックアップデータからのリカバリ

ディスク障害などで、利用しているシステムの問題でデータベースに問題が発生した場合、バックアップデータからリカバリします。リカバリ時は以下のことに注意する必要があります。

【注意】

GridDBノードにバックアップデータをリストアします。

バックアップしたデータからリストアする場合、以下の手順で操作を行います。

  1. ノードが起動していないことを確認します。

    • クラスタ定義ファイルが、参加させるクラスタの他のノードと同一であることを確認します。
  2. リカバリに利用するバックアップ名を確認します。この操作はノード上で実行します。

    • バックアップのステータスを確認し、正しくバックアップされているものを選択します。
  3. ノードのデータベースファイルディレクトリ(デフォルトでは、/var/lib/gridstore/data)に過去のトランザクションログファイル、チェックポイントファイルが残っていないことを確認します。チェックポイントファイル分割を行う設定となっている場合、分割チェックポイントファイルの配置ディレクトリ(gs_node.jsonの/dataStore/dbFilePathListで示すディレクトリ)に対しても過去のチェックポイントファイルが残っていないことを確認します。

    • 不要であれば削除、必要であれば別のディレクトリに移動してください。
  4. ノードを起動するマシン上で、リストアコマンドを実行します。

  5. ノードを起動します。

バックアップしたデータの確認には、以下のコマンドを用います。

以下は、バックアップ名の一覧を表示する具体例です。 バックアップ名の一覧は、ノードの起動状態に関わらず表示できます。ノードが起動状態で、バックアップ処理中の場合はStatusは"P"(Processingの略)と表示されます。

バックアップのリスト表示では、最新のものから順に表示されます。以下の例の場合、201912のBACKUPNAMEが最新です。

$ gs_backuplist -u admin/admin
 BackupName   Status  StartTime                 EndTime
-------------------------------------------------------------------------
*201912           --  2019-12-01T05:20:00+09:00 2019-12-01T06:10:55+09:00
*201911           --  2019-11-01T05:20:00+09:00 2019-11-01T06:10:55+09:00
  :
 20191025NO2      OK  2019-10-25T06:37:10+09:00 2019-10-25T06:38:20+09:00
 20191025         NG  2019-10-25T02:13:34+09:00 -
 20191018         OK  2019-10-18T02:10:00+09:00 2019-10-18T02:12:15+09:00

$ gs_backuplist -u admin/admin 201912

BackupName : 201912

BackupData            Status StartTime                 EndTime
--------------------------------------------------------------------------------
201912_lv0                OK 2019-12-01T05:20:00+09:00 2019-12-01T06:10:55+09:00
201912_lv1_000_001        OK 2019-12-02T05:20:00+09:00 2019-12-02T05:20:52+09:00
201912_lv1_000_002        OK 2019-12-03T05:20:00+09:00 2019-12-03T05:20:25+09:00
201912_lv1_000_003        OK 2019-12-04T05:20:00+09:00 2019-12-04T05:20:33+09:00
201912_lv1_000_004        OK 2019-12-05T05:20:00+09:00 2019-12-05T05:21:25+09:00
201912_lv1_000_005        OK 2019-12-06T05:20:00+09:00 2019-12-06T05:21:05+09:00
201912_lv1_001_000        OK 2019-12-07T05:20:00+09:00 2019-12-07T05:22:11+09:00
201912_lv1_001_001        OK 2019-12-08T05:20:00+09:00 2019-12-08T05:20:55+09:00

【注意】

この201912のバックアップデータのうちでリカバリに利用されるデータを確認します。gs_restoreの--testオプションではリカバリに利用する、差分・増分バックアップのデータが確認できます。--testオプションでは、リカバリに利用する情報の表示のみでデータのリストアは行いません。事前確認する際に利用してください。

上記例で出力された201912のBACKUPNAMEのリカバリでは、ベースラインの201912_lv0ディレクトリのデータ、および差分(Since)の201912_lv1_001_000ディレクトリ、増分(Incremental)の201912_lv1_001_001ディレクトリのデータがリカバリに利用されることを示しています。


-bash-4.2$ gs_restore --test 201912

BackupName : 201912
BackupFolder : /var/lib/gridstore/backup

RestoreData           Status StartTime                 EndTime
--------------------------------------------------------------------------------
201912_lv0                OK 2019-09-06T11:39:28+09:00 2019-09-06T11:39:28+09:00
201912_lv1_001_000        OK 2019-09-06T20:01:00+09:00 2019-09-06T20:01:00+09:00
201912_lv1_001_001        OK 2019-09-06T20:04:42+09:00 2019-09-06T20:04:43+09:00

なお、特定のパーティションの障害の場合、そのパーティションの最新データがどこに保持されているのかを確認する必要があります。

クラスタを構成するすべてのノード上で、gs_backuplistコマンドを用い、--partitionIdオプションに確認したいパーティションIDを指定して実行します。最も数値の大きいLSNを含むノードのバックアップを利用してリカバリします。

**** クラスタを構成する各ノードで実行します。

$ gs_backuplist -u admin/admin --partitionId=68
 BackupName    ID   LSN
----------------------------------------------------------
 20191018      68   1534
*201911        68   2349
*201912        68   11512

"*"は、差分・増分バックアップのBACKUPNAMEの場合に付与されます。

以下は、バックアップデータをリストアする実行例です。リストアはノードを停止した状態で実行します。

$ mv ${GS_HOME}/data/*.{dat,json,log} ${GS_HOME}/temp    # データベースファイルの移動
$ gs_restore 201912                                 # リストア

gs_restoreコマンドの実行により、以下のような処理が実行されます。

リストア後はノードを起動します。起動後の処理は、ノード起動後の操作を参照してください。

$ gs_startnode -u admin/admin -w
7.6.2.2.2.2 ノード障害からのリカバリ

ノード障害でノードの状態がABNORMAL状態になったり、ノードが異常終了した際は、イベントログファイルでエラー原因を特定する必要があります。

データベースファイルに障害がない場合、ノードの障害原因を除去し、ノードを起動するだけでデータベースファイルのデータはリカバリできます。

ノードの状態がABNORMAL状態になったときは、一旦ノードを強制終了させ、エラー原因を調査後再起動します。

強制的にノードを停止します。

$ gs_stopnode -f -u admin/admin -w

エラー原因を特定し、データベースの障害ではないと判断した場合、ノードを起動します。ノードを起動することで、トランザクションログのロールフォワードが行われ、最新の状態にデータがリカバリされます。

$ gs_startnode -u admin/admin -w

起動後の処理は、ノード起動後の操作を参照してください。

7.6.2.2.3 ノード起動後の操作

ノード起動後には以下の操作を行います。

  1. ノードをクラスタに組み込む
  2. データ一貫性の確認とフェイルオーバー操作
7.6.2.2.3.1 ノードをクラスタに組み込む

ノードを起動後、回復したノードをクラスタに組み込むには、gs_joinclusterコマンドを 待合せオプション(-w)を指定して 実行します。

$ gs_joincluster -u admin/admin -c clusterSeller -n 5 -w
7.6.2.2.3.2 データ一貫性の確認とフェイルオーバー操作

ノードをクラスタに組み込んだ後、パーティションのリカバリ状態を確認します。オンラインで動作しているクラスタに対して、データベースファイルのリカバリをバックアップから実施した場合、オンラインで保持しているパーティションのLSNに一致しない場合があります。 以下のコマンドでパーティションの詳細情報を調べ、コンテナ情報の採取で採取した情報と照らし合わせることで、ロスト対象に含まれるコンテナがわかります。

gs_partitionコマンドを用いてパーティションの欠損情報を取得します。パーティションの欠損が発生している場合は、欠損が発生しているパーティションのみが表示されます。表示されなければ、データの一貫性に問題はありません。

$ gs_partition  -u admin/admin --loss
 [
      {
        "all": [
            {
                "address": "192.168.0.1",
                "lsn": 0,
                "port": 10040,
                "status": "ACTIVE"
            },
            {
                "address": "192.168.0.2",
                "lsn": 1207,
                "port": 10040,
                "status": "ACTIVE"
            },
            {
                "address": "192.168.0.3",
                "lsn": 0,
                "port": 10040,
                "status": "ACTIVE"
            },
        ],
        "backup": [],
        "catchup": [],
        "maxLsn": 1408,
        "owner": null,
        "pId": "1",
        "status": "OFF"
    },
:
]

LSNがマスタノードが保持するMAXLSNと異なる場合パーティション欠損と判断されます。 クラスタを構成するノードのstatusはACTIVEですが、パーティションのstatusはOFF状態です。 このままシステムに組み込むにはgs_failoverclusterコマンドを実行します。

$ gs_failovercluster -u admin/admin --repair

フェイルオーバーの完了は、マスタノードに対するgs_statコマンドの実行で/cluster/partitionStatusがNORMALになっていること、 gs_partitionコマンドでパーティションの欠損が発生していないことで確認します。

7.6.2.2.4 リカバリ完了後の操作

リカバリ完了後は、クラスタを構成する全ノードでフルバックアップを採取してください。

7.6.3 ファイルシステムレベルのバックアップとリカバリ操作

GridDBのオンラインバックアップ機能を使わない代替案として、ファイルシステムレベルのオンラインバックアップの方法があります。この方法では、LVMやストレージのスナップショット機能を利用したり、ファイルを直接コピーすることで、データディレクトリのバックアップを取得します。

また、GridDBの自動ログバックアップ機能と組み合わせることで、この方法で取得したバックアップをベースラインとして、最新データまでリカバリすることも可能です。

7.6.3.1 スナップショットによるオンラインバックアップ

LVMスナップショットやストレージのスナップショット機能を用いてオンラインバックアップを実行できます。 バックアップに要する時間を大幅に短縮できるほか、クラスタの各ノードの復旧時点を可能な限り揃えることができます。

以下の手順で操作を行います。

  1. 定期チェックポイント処理を一時停止します。

  2. (任意)自動ログバックアップを併用する場合は、自動ログバックアップを開始します。

    • フルバックアップの取得処理は省略します。
  3. 手動チェックポイント処理を実行し、完了を待ち合わせます。

  4. データベースファイルディレクトリを含むスナップショットを取得します。チェックポイントファイル分割を行う設定となっている場合、データベースファイルディレクトリのほかに、分割チェックポイントファイルの配置ディレクトリも含むスナップショットを取得します。

    • クラスタの全ノードの復旧時点を可能な限り揃えたい場合、この手順を同時刻に開始してください。
  5. スナップショットからデータベースファイルディレクトリをコピーします。

  6. (任意)不要となったスナップショットを削除します。

  7. 定期チェックポイント処理を再開します。

取得したバックアップのおおよその復旧時点は、スナップショット取得時点となります。

【注意】

【メモ】

7.6.3.2 ファイルコピーによるオンラインバックアップ

OSコマンドやバックアップソリューションを用いて、ファイルコピーによるオンラインバックアップを実行できます。

以下の手順で操作を行います。

  1. 定期チェックポイント処理を一時停止します。

  2. (任意)自動ログバックアップを併用する場合は、自動ログバックアップを開始します。

    • フルバックアップの取得処理は省略します。
  3. 手動チェックポイント処理を実行し、完了を待ち合わせます。

  4. トランザクションログファイル、チェックポイントファイルの順でコピーします。

    • クラスタの全ノードの復旧時点を可能な限り揃えたい場合、この手順を同時刻に開始してください。
  5. 定期チェックポイント処理を再開します。

以下では、手順の具体例を説明します。

チェックポイント制御コマンドを実行し、定期チェックポイント処理を一時停止します。

$ gs_checkpoint -u admin/admin --off

ログバックアップを併用する場合は、バックアップコマンドを実行し、自動ログバックアップを開始します。--skipBaselineオプションを指定し、フルバックアップの取得処理は省略します。

$ gs_backup -u admin/admin --mode auto --skipBaseline 201808010300

手動チェックポイント処理を待合せオプション(-w)を指定して実行します。

$ gs_checkpoint -u admin/admin --manual -w

トランザクションログファイル、チェックポイントファイルの順でコピーします。

$ mkdir -p /mnt/backup/201808010300
$ cp -p ${GS_HOME}/data/*.log /mnt/backup/201808010300
$ cp -p ${GS_HOME}/data/*.dat /mnt/backup/201808010300
-   チェックポイントファイル分割を行う設定となっている場合、すべての分割チェックポイントファイルをコピーするよう注意してください。
``` example
(この例では、分割チェックポイントファイルの配置ディレクトリは/var/lib/gridstore/sub_01、/var/lib/gridstore/sub_02であるとします。)

$ mkdir -p /mnt/backup/201909010300
$ mkdir -p /mnt/backup/201909010300_sub01
$ mkdir -p /mnt/backup/201909010300_sub02
$ cp -p ${GS_HOME}/data/*.log /mnt/backup/201909010300
$ cp -p ${GS_HOME}/sub_01/*.dat /mnt/backup/201909010300_sub01
$ cp -p ${GS_HOME}/sub_02/*.dat /mnt/backup/201909010300_sub02
```

ファイルコピー完了後、定期チェックポイント処理を再開します。

$ gs_checkpoint -u admin/admin --on

取得したバックアップのおおよその復旧時点は、トランザクションログファイルのうち、最新のファイルの最終更新時刻となります。

ログバックアップを併用した場合のおおよその復旧時点は、バックアップディレクトリの最終更新日時となります。

【注意】

【メモ】

7.6.3.3 リカバリ操作とノードの起動

スナップショットやファイルコピーによってバックアップしたデータからリストアする場合、以下の手順で操作を行います。

  1. ノードが起動していないことを確認します。

    • クラスタ定義ファイルが、参加させるクラスタの他のノードと同一であることを確認します。
  2. ノードのデータベースファイルディレクトリ(デフォルトでは、/var/lib/gridstore/data)に過去のトランザクションログファイル、チェックポイントファイルが残っていないことを確認します。チェックポイントファイル分割を行う設定となっている場合、分割チェックポイントファイルの配置ディレクトリ(gs_node.jsonの/dataStore/dbFilePathListで示すディレクトリ)に対しても過去のチェックポイントファイルが残っていないことを確認します。

    • 不要であれば削除、必要であれば別のディレクトリに移動してください。
  3. リストアするバックアップデータをデータベースファイルディレクトリにコピーします。

    • ログバックアップを併用して最新のデータへリカバリする場合は、続けてリストアコマンドでログ更新オプションを指定し、対応するログバックアップデータをリストアします。
  4. ノードを起動します。

以下では、3以降の手順の具体例を説明します。

リストアするバックアップデータをデータベースファイルディレクトリにコピーします。

$ cp -p /mnt/backup/201808010300/* ${GS_HOME}/data

ログバックアップを併用して最新のデータへリカバリする場合は、続けてリストアコマンドで対象となるログバックアップデータをリストアします。

gs_restoreコマンドのtestオプションを用いて、StatusがOKであることを確認します。

$ gs_restore --test 201808010300

BackupName : 201808010300
BackupFolder : /var/lib/gridstore/backup

RestoreData           Status   StartTime                EndTime
--------------------------------------------------------------------------------
201808010300              OK  2018-08-01T03:00:01+0900 2018-08-01T03:00:15+0900

ログバックアップによるおおよその復旧時点は、バックアップディレクトリの最終更新日時となります。

$ ls -l /mnt/backup | grep 201808010300
drwx------ 2 gsadm gridstore 4096  8月  4 14:06 2018 201808010300

問題が無いことを確認後、gs_restoreコマンドに--updateLogsオプションを指定して実行します。

$ gs_restore --updateLogs 201808010300

リストア後はノードを起動します。起動後の処理は、ノード起動後の操作を参照してください。

7.6.4 バックアップファイル

7.6.4.1 ファイル構成

ノード定義ファイルの /dataStore/backupPathが指すディレクトリ下に、バックアップコマンドのBACKUPNAMEで指定した名前でディレクトリが作成され、以下のファイルが配置されます。なお、差分・増分バックアップの場合は、バックアップディレクトリ下にBACKUPNAME_lv0 (ベースライン) BACKUPNAME_lv1_NNN_MMM(差分・増分バックアップ)ディレクトリが作成され、同様に以下のファイルが配置されます。

  1. チェックポイントファイル(gs_cp_n_p.dat)

    • ノード定義ファイルの/dataStore/concurrencyの数だけのファイルがあります。
    • チェックポイントファイル分割を行う設定となっている場合、分割数(/dataStore/dbFileSplitCount)の数だけサブディレクトリがあります。サブディレクトリ名は0からの連番です。各サブディレクトリの下に分割チェックポイントファイルがあります。分割チェックポイントファイルのファイル数の合計は、ノード定義ファイルの並列度(/dataStore/concurrency)×分割数(/dataStore/dbFileSplitCount)の数になります。
  2. トランザクションログファイル(gs_log_n_m.log)

    • フルバックアップ時もしくは、自動ログバックアップの動作に応じて新しいしいトランザクションログファイルが追加されます。
  3. 差分・増分ブロックログファイル(gs_log_n_m_incremental.log)

    • 差分・増分バックアップで、更新ブロックのトランザクションログファイルを保持します。
  4. バックアップ情報ファイル(gs_backup_info.json,gs_backup_info_digest.json)

    • バックアップ時の情報として、バックアップの採取開始時間、完了時間やバックアップファイルのサイズなどの情報がgs_backup_info.jsonに保持され、gs_backup_info_digest.jsonにダイジェスト情報が保持されています。本ファイルを元にgs_backuplistで情報が出力されます。
  5. シーケンス番号(gs_lsn_info.json)

    • パーティション更新のシーケンス番号を示すLSN(Log Sequence Number)が出力されます。バックアップ採取時点でパーティションが保持しているLSNが出力されます。

7.6.4.2 不要となったバックアップファイルの削除

不要となったバックアップデータの削除は、BACKUPNAME単位に不要となったディレクトリを削除するのみです。バックアップデータの管理情報はすべて各々のBACKUPNAMEのディレクトリ下にあるため、他のレジストリ情報などを削除するといった操作は不要です。 なお、差分・増分バックアップの際は、BACKUPNAME_lv0, BACKUPNAME_lv1_NNN_MMMのディレクトリ群をすべて削除してください。

7.7 長期アーカイブ機能

長期アーカイブは、期限解放機能によりデータベースから削除されるデータをオープンな形式(Apache Avro形式)で外部ファイルに保存する機能です。 保存データは、以下のように活用できます。

これまでは、参照する可能性が残るデータには期限解放機能を適用することはできませんでした。 本機能により期限解放されたデータを外部ファイルに保持できるため、そのようなデータにも期限解放機能を幅広く適用できるようになります。

7.7.1 アーカイブ対象データ

本書では、期限解放機能により、削除可能となった状態のデータのことを「コールドデータ」と呼びます。 長期アーカイブ機能では、このコールドデータをアーカイブ対象とします。 期限解放されたデータが即座にコールドデータとならないことに注意してください。下図に、期限解放機能を有効期間2日、分割数2で設定した例を示します。

期限解放とコールドデータ
期限解放とコールドデータ

7.7.2 アーカイブの作成

長期アーカイブ機能でアーカイブを実行すると、コールドデータを外部ファイル(アーカイブファイル)に保存します。 保存はオープンなバイナリ形式(Apache Avro形式)で行われます。 保存が終了したら、保存時点にコールドデータとなっていたデータをDBから削除します。

出力ファイル
出力ファイル

【メモ】

7.7.3 アーカイブの検索・活用

作成したアーカイブファイルを活用する際に、長期アーカイブの検索機能を利用して、必要なアーカイブファイルを検索することができます

データベース名とコンテナ名を条件指定した場合、完全一致したファイルのパスを出力します。 有効期間の開始日に対する日付範囲指定検索の場合、指定した範囲内にある開始日を含むすべてのファイルのパス一覧を表示します。

アーカイブ検索機能
アーカイブ検索機能

アーカイブファイル内でデータはオープンな形式(Apache Avro形式)で保存されており、検索したファイルは以下のように活用することができます。

7.8 ローリングアップグレード機能

ローリングアップグレード機能では、クラスタ構成を稼動したままノードのアップグレードを行うことができます。 ノード1台ずつ順番に、クラスタからノードを離脱してGridDB製品をアップグレードし、再びクラスタ構成へノードを参加させることで、最終的にクラスタを構成するすべてのノードを新しいバージョンのGridDB製品に置き換えることができます。

以下の手順で、ローリングアップグレード機能を用いたアップグレードを行います。

  1. ローリングアップグレードの運用計画を立てる

    • ローリングアップグレードの作業時間を見積もります。ノード1台分の作業は下記の項目となります。 これらにかかる時間を見積り、クラスタの全ノードでの作業時間を計算します。 ノード起動(リカバリ)以外の項目は、約5分程度が目安の時間です。
      • クラスタ離脱
      • ノード停止
      • GridDBインストール
      • ノード起動(リカバリ)
      • クラスタ参加
    • クラスタ離脱前にデータ更新が多い場合(チェックポイントされていない更新が多い場合)、また、ローリングアップグレード中にデータ更新が多い場合は、リカバリに時間がかかる場合があります。
  2. クラスタのデータ配置目標の自動設定を無効にする

    • ローリングアップグレードでは、繰り返しクラスタ構成を変更するため、データ配置目標の自動設定を無効にした状態で全ノードのアップグレードを実施します。これにより、無駄なデータ再配置が行われず、処理やネットワーク通信の負荷を軽減できます。
    • gs_goalconfコマンドで--clusterオプションを付けて実行すると、クラスタを構成する全ノードに対してデータ配置目標の自動設定の無効化が行われます。
    • 例)
      $ gs_goalconf -u admin/admin --off --cluster
      
  3. クラスタ構成を確認する

    • ローリングアップグレードの手順では、すべてのフォロワノードをアップグレードした後で、最後にマスタノードをアップグレードします。 そのため、事前にクラスタ構成を確認し、ノードをアップグレードする順序を決めます。
    • gs_configコマンドでマスタノードを確認します。確認したマスタノード以外はフォロワノードです。
    • 例)
      $ gs_config -u admin/admin
      
  4. すべてのフォロワノードを1台ずつアップグレードする

    • 下記の作業を各フォロワノードに対して行います。ノードにログインして実施してください。 この作業の開始以降、5の作業が完了するまでSQL処理は継続できない場合があります。詳しくは【注意】を参照ください。
      • a. 現在のデータ配置目標をマスタノードから取得する (gs_goalconf)
        • 例)
          $ gs_goalconf -u admin/admin -s MASTER_IP --manual > last_goal.json
          
      • b. 対象のノードを離脱対象とするための配置目標を全ノードに設定する (gs_goalconf)
        • ノードを安全に離脱させるため、離脱させるノードがレプリカのオーナを持たないデータ配置にする必要があります。この操作は、(パーティション数 * ノード数 / 10)秒程度かかります。
        • このとき、一部パーティションのオーナとバックアップが切り替わるため、クライアントフェイルオーバが発生することがあります。またクライアントフェイルオーバ非対応の処理はエラーとなります。
        • 例)
          $ gs_goalconf -u admin/admin --manual --leaveNode NODE_IP --cluster
          
      • c. マスタノードのパーティション状態がNORMALになるまで待つ (gs_stat)
        • 例)
          $ gs_stat -u admin/admin -s MASTER_IP | grep partitionStatus
          
      • d. 全ノードの自律的データ配置機能を無効にする (gs_loadbalance)
        • 例)
          $ gs_loadbalance -u admin/admin --off --cluster
          
      • e. ノードをクラスタから離脱する (gs_leavecluster)
        • 例)
          $ gs_leavecluster -u admin/admin --force -w
          
      • f. ノードを通常停止する (gs_stopnode)
        • 例)
          $ gs_stopnode -u admin/admin -w
          
      • g. GridDBをアップグレードする
      • h. ノードを起動する (gs_startnode)
        • 例)
          $ gs_startnode -u admin/admin -w
          
      • i. 自律的データ配置機能を無効にする (gs_loadbalance)
        • ノード1台に対して行う操作なので、--clusterオプションは不要です。
        • 例)
          $ gs_loadbalance -u admin/admin --off
          
      • j. データ配置目標の自動設定を無効にする (gs_goalconf)
        • ノード1台に対して行う操作なので、--clusterオプションは不要です。
        • 例)
          $ gs_goalconf -u admin/admin --off
          
      • k. ノードをクラスタに参加させる (gs_joincluster)
        • 例) クラスタ名:mycluster、クラスタ構成ノード数:5の場合
          $ gs_joincluster -u admin/admin -c mycluster -n 5 -w
          
      • l. マスタノードのパーティション状態がREPLICA_LOSSになるまで待つ (gs_stat)
        • 例)
          $ gs_stat -u admin/admin -s MASTER_IP | grep partitionStatus
          
      • m. データ配置目標を離脱前の状態に戻す (gs_goalconf)
        • この操作は、(パーティション数 * ノード数 / 10)秒程度かかります。
        • 例)
          $ gs_goalconf -u admin/admin --manual --set last_goal.json --cluster
          
      • n. 全ノードの自律的データ配置機能に有効にする (gs_loadbalance)
        • このとき、一部パーティションのオーナとバックアップが切り替わるため、クライアントフェイルオーバが発生することがあります。またクライアントフェイルオーバ非対応の処理はエラーとなります。
        • 例)
          $ gs_loadbalance -u admin/admin --on --cluster
          
      • o. マスタノードのパーティション状態がNORMALになるまで待つ (gs_stat)
        • 例)
          $ gs_stat -u admin/admin -s MASTER_IP | grep partitionStatus
          
  5. マスタノードをアップグレードする

    • 手順3で確認したマスタノードを最後にアップグレードします。手順は4と同様です。
  6. クラスタ内のすべてのノードが新しいバージョンになっていることを確認する (gs_stat)

  7. クラスタのデータ配置目標の自動設定を有効にする

    • 例)
      $ gs_goalconf -u admin/admin --on --cluster
      

なお、ノードのアップグレードを実施する際のa-oの手順を自動実行するサンプルスクリプトを提供しています。サーバパッケージをインストールすると、次のディレクトリに配置されます。

$ ls /usr/griddb/sample/ja/rolling_upgrade
Readme.txt  rolling_upgrade_sample.sh

$ ls /usr/griddb/sample/en/rolling_upgrade
Readme.txt  rolling_upgrade_sample.sh

【メモ】

【注意】

7.9 イベントログ機能

イベントログは、GridDBノード内部で発生した例外などのイベント情報に関するメッセージやシステム稼働情報を記録するログです。

イベントログは、環境変数GS_LOGで示すディレクトリにgridstore-%Y%m%d-n.logというファイル名で作成されます(例: gridstore-20150328-5.log)。ファイルは以下のタイミングで切り替わります。

イベントログファイルの上限数の初期値は30です。30ファイルを超えると古いファイルから削除されます。ファイル数の上限値はノード定義ファイルで変更できます。

イベントログの出力形式は以下の内容です。


2014-11-12T10:35:29.746+0900 TSOL1234 8456 ERROR TRANSACTION_SERVICE [10008:TXN_CLUSTER_NOT_SERVICING] (nd={clientId=2, address=127.0.0.1:52719}, pId=0, eventType=CONNECT, stmtId=1) <Z3JpZF9zdG9yZS9zZXJ2ZXIvdHJhbnNhY3Rpb25fc2VydmljZS5jcHAgQ29ubmVjdEhhbmRsZXI6OmhhbmRsZUVycm9yIGxpbmU9MTg2MSA6IGJ5IERlbnlFeGNlcHRpb24gZ3JpZF9zdG9yZS9zZXJ2ZXIvdHJhbnNhY3Rpb25fc2VydmljZS5jcHAgU3RhdGVtZW50SGFuZGxlcjo6Y2hlY2tFeGVjdXRhYmxlIGxpbmU9NjExIGNvZGU9MTAwMDg=>

イベントログの出力レベルはgs_logconfコマンドを用いてオンラインで変更できます。障害情報の詳細を分析する際には、オンラインで変更します。ただし、オンラインでの変更は一時的なメモリ上での変更のため、ノードの再起動でも設定を有効とするような恒久的設定にするには、クラスタを構成する各ノードのノード定義ファイルのtrace項目を設定する必要があります。

設定状況はgs_logconfコマンドで確認できます。

 $ gs_logconf -u admin/admin
{
    "levels": {
        "CHECKPOINT_FILE": "ERROR",
        "CHECKPOINT_SERVICE": "INFO",
        "CHUNK_MANAGER": "ERROR",
        "CHUNK_MANAGER_IODETAIL": "ERROR",
        "CLUSTER_OPERATION": "INFO",
        "CLUSTER_SERVICE": "ERROR",
        "COLLECTION": "ERROR",
        "DATA_STORE": "ERROR",
        "DEFAULT": "ERROR",
        "EVENT_ENGINE": "WARNING",
        "IO_MONITOR": "WARNING",
        "LOG_MANAGER": "WARNING",
        "MAIN": "WARNING",
        "MESSAGE_LOG_TEST": "ERROR",
        "OBJECT_MANAGER": "ERROR",
        "RECOVERY_MANAGER": "INFO",
        "REPLICATION_TIMEOUT": "WARNING",
        "SESSION_TIMEOUT": "WARNING",
        "SYNC_SERVICE": "ERROR",
        "SYSTEM": "UNKNOWN",
        "SYSTEM_SERVICE": "INFO",
        "TIME_SERIES": "ERROR",
        "TRANSACTION_MANAGER": "ERROR",
        "TRANSACTION_SERVICE": "ERROR",
        "TRANSACTION_TIMEOUT": "WARNING",
        "TRIGGER_SERVICE": "ERROR"
    }
}

7.10 稼働状況の確認機能

7.10.1 性能・統計情報

GridDBの性能・統計情報は、運用コマンドのgs_statを利用して確認できます。gs_statはクラスタで共通の情報とノード独自の性能情報・統計情報を表示します。

gs_statコマンドでの出力のうち、performance構造が、性能・統計情報に関連する項目です。

出力例を以下に示します。出力される内容はバージョンによって異なります。

-bash-4.1$ gs_stat -u admin/admin -s 192.168.0.1:10040
{
    :
    "performance": {
        "batchFree": 0,
        "checkpointFileSize": 65536,
        "checkpointFileUsageRate": 0,
        "checkpointMemory": 2031616,
        "checkpointMemoryLimit": 1073741824,
        "checkpointWriteSize": 0,
        "checkpointWriteTime": 0,
        "currentTime": 1428024628904,
        "numConnection": 0,
        "numTxn": 0,
        "peakProcessMemory": 42270720,
        "processMemory": 42270720,
        "recoveryReadSize": 65536,
        "recoveryReadTime": 0,
        "sqlStoreSwapRead": 0,
        "sqlStoreSwapReadSize": 0,
        "sqlStoreSwapReadTime": 0,
        "sqlStoreSwapWrite": 0,
        "sqlStoreSwapWriteSize": 0,
        "sqlStoreSwapWriteTime": 0,
        "storeDetail": {
            "batchFreeMapData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "batchFreeRowData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "mapData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "metaData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "rowData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            }
        },
        "storeMemory": 0,
        "storeMemoryLimit": 1073741824,
        "storeTotalUse": 0,
        "swapRead": 0,
        "swapReadSize": 0,
        "swapReadTime": 0,
        "swapWrite": 0,
        "swapWriteSize": 0,
        "swapWriteTime": 0,
        "syncReadSize": 0,
        "syncReadTime": 0,
        "totalLockConflictCount": 0,
        "totalReadOperation": 0,
        "totalRowRead": 0,
        "totalRowWrite": 0,
        "totalWriteOperation": 0
    },
    :
}

性能・統計情報に関連する情報を説明します。storeDetail構造は、内部のデバッグ情報のため説明は省きます。

出力パラメータ 種別 説明 監視すべき事象
checkpointFileSize c チェックポイントファイルサイズ(バイト)
checkpointFileUsageRate c チェックポイントファイル利用率
checkpointMemory c チェックポイント用checkpointメモリ量(バイト)
checkpointMemoryLimit c チェックポイント用checkpointMemoryLimit設定(バイト)
checkpointWriteSize s チェックポイント処理CPファイルライトサイズ(バイト)
checkpointWriteTime s チェックポイント処理CPファイルライト時間(ミリ秒)
checkpointFileAllocateSize c チェックポイントファイルに割り当てられたブロックの総サイズ(バイト)
currentTime c 現在時刻
numConnection c 現在のコネクション数。トランザクション処理で使用している接続数であり、クラスタ処理で使用している接続数は含まれない。クライアントの数+保有するパーティション*レプリカ数の値となる。 ログの監視でコネクション不足が発生している場合はノード構成のconnectionLimitの値を見直します。
numSession c 現在のセッション数
numTxn c 現在のトランザクション数
peakProcessMemory p プロセス最大使用メモリ量(バイト) storememoryの値を含め、GridDBサーバの利用したメモリのピーク値 peakProcessMemory、processMemoryがノードの実装メモリより大きくOSのスワップが発生している場合、メモリの追加や一時的にstorememoryLimitの値を下げるなどの検討が必要
processMemory c プロセス使用メモリ量(バイト)
recoveryReadSize s リカバリ処理でチェックポイントファイルを読み込んだサイズ(バイト)
recoveryReadTime s リカバリ処理でチェックポイントファイルを読み込んだ時間(ミリ秒)
sqlStoreSwapRead s SQLストアスワップ処理のファイルからの読み込み回数
sqlStoreSwapReadSize s SQLストアスワップ処理のファイルからの読み込みサイズ(バイト)
sqlStoreSwapReadTime s SQLストアスワップ処理のファイルからの読み込み時間(ミリ秒)
sqlStoreSwapWrite s SQLストアスワップ処理のファイルへの書き込み回数
sqlStoreSwapWriteSize s SQLストアスワップ処理のファイルへの書き込みサイズ(バイト)
sqlStoreSwapWriteTime s SQLストアスワップ処理のファイルへの書き込み時間(ミリ秒)
storeMemory c インメモリデータベースでの使用メモリ量(バイト)
storeMemoryLimit c インメモリデータベースでの使用メモリ量制限(バイト)
storeTotalUse c データベースファイル内のデータ容量を含めたノードが保有する全データ容量(バイト)
swapRead s スワップ処理のファイルからの読み込み回数
swapReadSize s スワップ処理のファイルからの読み込みサイズ(バイト)
swapReadTime s スワップ処理のファイルからの読み込み時間(ミリ秒)
swapWrite s スワップ処理のファイルへの書き込み回数
swapWriteSize s スワップ処理のファイルへの書き込みサイズ(バイト)
swapWriteTime s スワップ処理のファイルへの書き込み時間(ミリ秒)
syncReadSize s 同期処理CPファイルからの読み込みサイズ(バイト)
syncReadTime s 同期処理CPファイルからの読み込み時間(ミリ秒)
totalLockConflictCount s ロウロック競合発生回数
totalReadOperation s 検索処理回数
totalRowRead s ロウ読み出し回数
totalRowWrite s ロウ書き込み回数
totalWriteOperation s 登録更新処理回数

7.10.2 コンテナ(テーブル)の配置情報確認

GridDBクラスタ上のコンテナ(テーブル)は、各ノードに自動的に分散して配置されます。 運用機能やSQLを用いることで、コンテナ(テーブル)がどのノードに配置されているかを確認することができます。

この機能は次の場合に役立ちます。

【メモ】

次の方法で、コンテナ(テーブル)が属するパーティションのオーナが配置されているノードを確認できます。

7.10.2.1 ノード上のコンテナ(テーブル)一覧確認

1つのノード上に配置されているコンテナ(テーブル)一覧を確認するには、統合運用管理GUI(gs_admin)のコンテナ一覧画面を使用します。

  1. gs_adminにログインします。

  2. 左画面のツリービューで「ClusterTree」タブを選択してノードを選択した後、右画面で「Container」タブをクリックします。

  3. ノードに配置されているコンテナ一覧が表示されます。

【メモ】

7.10.2.2 コンテナ(テーブル)配置ノードの確認

特定のコンテナ(テーブル)が配置されているノードを確認するには、gs_shとパーティション情報取得コマンド(gs_partition)を使用します。

  1. gs_shのshowcontainerサブコマンドでコンテナが格納されているパーティションのIDを確認します。 パーティションIDが"Partition ID"に表示されます。

  2. gs_shのconfigclusterサブコマンドでマスタノードを確認します。 "Role"に"M"と表示されるノードがマスタノードです。

  3. マスタノードに対して、1で確認したパーティションIDを引数に指定してgs_partitionを実行します。 表示されたJSONの/owner/addressのノードが、コンテナが配置されているノードです。

【実行例】

$ gs_partition -u admin/admin -n 5
[
    {
        "backup": [],
        "catchup": [],
        "maxLsn": 300008,
        "owner": {
            "address": "192.168.11.10",    -> IPアドレス:192.168.11.10のノードに格納されている
            "lsn": 300008,
            "port": 10010
        },
        "pId": "5",
        "status": "ON"
    }
]

【注意】

【メモ】

7.10.2.3 データパーティション配置ノードの確認

パーティショニングされたコンテナ(テーブル)は、複数の内部コンテナ(データパーティション)にデータを分割して格納します。 これらのデータパーティションがどのノードに配置されているかを確認することで、パーティショニングされたコンテナ(テーブル)のデータ配置を知ることができます。

配置確認の流れとしては、該当コンテナ(テーブル)のデータパーティションが格納されているパーティションのIDを調べて、そのIDを基にして配置されているノードを調べます。以下に手順を説明します。

  1. 該当コンテナ(テーブル)のデータパーティションが格納されているパーティションのIDを確認する
  1. パーティションIDから、配置されているノードを確認する

【例】

select DATABASE_NAME, TABLE_NAME, CLUSTER_PARTITION_INDEX from "#table_partitions" where TABLE_NAME='hashTable1';

DATABASE_NAME,TABLE_NAME,CLUSTER_PARTITION_INDEX
public,hashTable1,1
public,hashTable1,93
public,hashTable1,51
public,hashTable1,18
public,hashTable1,32  →'hashTable1'のデータパーティションは5個で、格納されているパーティションのIDは1, 93, 51, 18, 32。
$ gs_partition -u admin/admin -n 1
[
    {
        "backup": [],
        "catchup": [],
        "maxLsn": 200328,
        "owner": {
            "address": "192.168.11.15",    -> IPアドレス:192.168.11.15のノードに格納されている
            "lsn": 200328,
            "port": 10010
        },
        "pId": "1",
        "status": "ON"
    }
]

【注意】

【メモ】

7.11 運用ツール

GridDBでは、クラスタ操作やノード操作、コンテナ作成などのデータ操作、エクスポート/インポートなどを行うための以下のツールを提供しています。

運用ツール一覧
運用ツール一覧
名称 内容
サービス Linuxのサービス管理で、GridDBノードの起動/停止などを行います。
統合運用管理GUI(gs_admin) GridDBクラスタの運用機能を統合したWebベースの統合運用管理GUIツールです。
クラスタ運用管理コマンド・インタプリタ(gs_sh) GridDBクラスタの運用管理機能、およびデータ操作を行うCUIツールです。
運用コマンド GridDBクラスタの運用機能を行うコマンド群です。機能ごとに様々なコマンドがあります。
エクスポートツール/インポートツール データをエクスポート/インポートします。
長期アーカイブツール 期限解放によりデータベースから削除されるデータを外部ファイルに保存します。

7.11.1 運用コマンド

GridDBの運用動作を指示するコマンドには以下があります。GridDBの運用コマンドはすべてgs_で始まります。

種類 コマンド 機能
ノード操作 gs_startnode ノードの起動
gs_stopnode ノードの停止
クラスタ操作 gs_joincluster 指定ノードをクラスタ構成へ参加させる。クラスタを構成する際に使用
gs_leavecluster クラスタから特定ノードを切り離す。メンテナンス等で特定ノードを切り離す際に利用する。切り離したノードに配置されているパーティションは再配置(リバランス)される
gs_stopcluster クラスタを構成する全ノードをクラスタから切り離す。全ノードを停止する際に利用する。ノード切り離しに伴うパーティションのリバランスは発生しない
gs_config クラスタを構成するノードの情報を取得
gs_stat ノードやクラスタの稼働情報や性能情報を情報取得
gs_appendcluster STABLE状態のクラスタに対してノードを増設する
gs_failovercluster クラスタのフェイルオーバーを手動で通知する。データロストを許容してサービスを開始する際にも利用
gs_partition パーティションのクラスタ内での配置(マスタ/バックアップ)情報や更新情報を取得
gs_loadbalance クラスタの自律的データ配置機能の有効無効の設定、設定情報の取得
管理ユーザ操作 gs_adduser 管理ユーザの登録
gs_deluser 管理ユーザの削除
gs_passwd 管理ユーザのパスワードの変更
ログ情報 gs_logs ノードのメモリに保持する最新のログ情報の表示
gs_logconf イベントログ出力レベルの表示と変更
バックアップ/リストア gs_backup バックアップの取得指示
gs_backuplist バックアップデータの確認
gs_restore バックアップデータのリストア
インポート/エクスポート gs_import ディスクに保持しているコンテナやデータベースのexportデータを指定してインポート
gs_export コンテナやデータベースを指定して、ディスク上にデータをCSV形式またはzip形式でエクスポート
保守 gs_paramconf 稼働パラメータの表示と稼働パラメータのオンライン変更
gs_authcache 一般ユーザの認証やLDAP認証の高速化のためのユーザ情報キャッシュの一覧表示と削除

7.11.2 統合運用管理機能

統合運用管理機能(gs_admin)はGridDBのクラスタ運用機能を統合したWebアプリケーションです。gs_adminは直観的なインターフェースで、クラスタの稼働情報を1画面で把握できます(ダッシュボード画面)。また、クラスタを構成する個々のノードへの起動停止操作や性能情報の確認などができます。

gs_admin ダッシュボード画面
gs_admin ダッシュボード画面

gs_adminは、上記運用操作とともに、開発を支援する以下の機能もサポートしており、システムの開発段階でも有効に利用できます。

7.11.3 クラスタ運用管理コマンド・インタプリタ(gs_sh)

GridDBのクラスタ操作やデータ操作のためのコマンドラインインターフェースです。運用コマンドが個別のノードに対して操作するのに対して、クラスタを構成するノードに一括した処理を行うインターフェースを提供しています。また、ユーザ管理操作に加え、データベース、コンテナやテーブルの作成、TQLやSQLによる検索などのデータ操作も提供します。

gs_shは、対話形式でサブコマンドを指定して処理を実行する方法と、一連の操作をサブコマンドで記載したスクリプトファイルをバッチで実行する方法の2つの起動方法があります。バッチスクリプトを利用することで、システム構築の省力化や開発時の動作検証の自動化などができます。

//対話形式
$ gs_sh
//サブコマンド「version」の実行
gs> version

//バッチ形式 コマンドの引数にサブコマンドを記載したファイルを指定する
$gs_sh test.gsh

gs_shでは、ノード起動やクラスタ開始などのクラスタ操作や、コンテナ作成などのデータ操作が実行できます。

gs_shの操作の詳細については、『GridDB 運用ツールリファレンス』(GridDB_OperationToolsReference.html)をご参照ください。

8 パラメータ

GridDBの動作を制御するパラメータについて説明します。GridDBのパラメータにはノードの設定情報や利用できるリソースなどの設定を行うノード定義ファイルと、クラスタの動作設定を行うクラスタ定義ファイルがあります。 定義ファイルの項目名と初期状態での設定値とパラメータの意味を説明します。

設定値の単位は以下のように指定します。

 

8.1 クラスタ定義ファイル(gs_cluster.json)

クラスタ定義ファイルは、クラスタを構成する全ノードで同一の設定にしておく必要があります。partitionNum,storeBlockSizeパラメータはデータベースの構造を決める重要なパラメータのため、GridDBの初期起動後は値の変更ができません。

クラスタ定義ファイルの各設定項目の意味を以下に説明します。

初期状態で含まれていない項目も項目名を追加することでシステムに認識させることができます。 変更の欄ではパラメータの変更可否と変更タイミングを示します

 

GridDBの構成 初期値 パラメータの意味と制限値 変更
/notificationAddress 239.0.0.1 マルチキャストアドレスの標準設定です。cluster,transactionの同じ名前のパラメータが省略された場合、本設定が有効になります。異なる値が設定されている場合、個別設定のアドレスが有効です。 起動
/dataStore/partitionNum 128 パーティション数を構成するクラスタ台数で分割配置できる公倍数で指定します。 整数: 1以上、10000以下で指定します。 変更不可
/dataStore/storeBlockSize 64KB ディスクI/Oのサイズ(64KB,1MB,4MB,8MB,16MB,32MB)を指定します。ブロックサイズを大きくすると1ブロックに格納できるレコードが増えるため、大規模テーブルのフルスキャンに向きますが、競合が発生する可能性が高くなります。システムにあったサイズを十分に検討して設定してください。サーバ起動後は変更できません。 変更不可
/cluster/clusterName なし クラスタを識別するための名称を指定します。必須入力のパラメータです。 起動
/cluster/replicationNum 2 レプリカ数を指定します。レプリカ数が2の場合、パーティションが2重化されます。 起動
/cluster/notificationAddress 239.0.0.1 クラスタ構成用マルチキャストアドレスを指定します。 起動
/cluster/notificationPort 20000 クラスタ構成用マルチキャストポートを指定します。 ポート番号として指定可能な範囲の値を指定します。 起動
/cluster/notificationInterval 5秒 クラスタ構成用マルチキャスト周期です。 1s以上、231s未満の値を指定します。 起動
/cluster/heartbeatInterval 5秒 クラスタ間でのノードの生存確認チェック周期(ハートビート周期)です。 1s以上、231s未満の値を指定します。 起動
/cluster/loadbalanceCheckInterval 180秒 クラスタを構成するノード間の負荷バランス調整のため、バランス処理を実施するか否かのデータ採取周期を指定します。 1s以上、231s未満の値を指定します。 起動
/cluster/notificationMember なし クラスタ構成方式を固定リスト方式にする際に、アドレスリストを指定します。 起動
/cluster/notificationProvider/url なし クラスタ構成方式をプロバイダ方式にする際に、アドレスプロバイダのURLを指定します。 起動
/cluster/notificationProvider/updateInterval 5秒 アドレスプロバイダからリストを取得する間隔を指定します。1s以上、231s未満の値を指定します。 起動
/sync/timeoutInterval 30秒 クラスタ間のデータ同期時のタイムアウト時間を指定します。 タイムアウトが発生した場合、システムの負荷が高い、障害発生などの可能性があります。 1s以上、231s未満の値を指定します。 起動
/transaction/notificationAddress 239.0.0.1 クライアントが初期に接続するマルチキャストアドレスです。クライアントにはマスタノードが通知されます。 起動
/transaction/notificationPort 31999 クライアントが初期に接続するマルチキャストポートです。ポート番号として指定可能な範囲の値を指定します。 起動
/transaction/notificationInterval 5秒 クライアントへのマスタ通知用マルチキャスト周期。1s以上、231s未満の値を指定します。 起動
/transaction/replicationMode 0 トランザクションでデータ更新をする時のデータの同期(レプリケーション)方法を指定します。文字列または整数で、 "ASYNC"または0(非同期)、"SEMISYNC"または1(準同期)を指定します。 起動
/transaction/replicationTimeoutInterval 10秒 トランザクションが準同期レプリケーションでデータを同期する際のノード間通信のタイムアウト時間を指定します。1s以上、231s未満の値を指定します。 起動
/transaction/authenticationTimeoutInterval 5秒 認証タイムアウト時間を指定します。 起動
/sql/notificationAddress 239.0.0.1 JDBC/ODBCクライアントが初期に接続するマルチキャストアドレスです。クライアントにはマスタノードが通知されます。 起動
/sql/notificationPort 41999 JDBC/ODBCクライアントが初期に接続するマルチキャストポートです。ポート番号として指定可能な範囲の値を指定します。 起動
/sql/notificationInterval 5秒 JDBC/ODBCクライアントへのマスタ通知用マルチキャスト周期です。1s以上、231s未満の値を指定します。 起動
/security/authentication INTERNAL 認証方式として、INTERNAL(内部認証) / LDAP(LDAP認証)のいずれかを指定。 起動
/security/ldapRoleManagement USER GridDBのロールとマッピングする対象として、USER(LDAPユーザ名でマッピング) / GROUP(LDAPグループ名でマッピング)のいずれかを指定。 起動
/security/ldapUrl LDAPサーバを次の形式で指定。ldaps://host[:port] 起動
/security/ldapUserDNPrefix ユーザのDN(識別子)を生成するために、ユーザ名の前に連結する文字列を指定。 起動
/security/ldapUserDNSuffix ユーザのDN(識別子)を生成するために、ユーザ名の後に連結する文字列を指定。 起動
/security/ldapBindDn LDAP管理ユーザのDNを指定。 起動
/security/ldapBindPassword LDAP管理ユーザのパスワードを指定。 起動
/security/ldapBaseDn 検索を開始するルートDNを指定。 起動
/security/ldapSearchAttribute uid 検索対象となる属性を指定。 起動
/security/ldapMemberOfAttribute memberof ユーザが所属するグループDNが設定された属性を指定。(ldapRoleManagement=GROUPの場合に有効) 起動
/system/serverSslMode DISABLED SSL接続設定として、DISABLED(SSL無効)、PREFERRED(SSL有効、ただし非SSL接続も許容)、REQUIRED(SSL有効、非SSL接続は不可)のいずれかを指定。 起動
/system/sslProtocolMaxVersion TLSv1.2 TLSプロトコルバージョンとして、TLSv1.2, TLSv1.3のいずれかを指定。 起動

8.2 ノード定義ファイル(gs_node.json)

ノード定義ファイルでは、クラスタを構成するノードのリソースを初期設定します。オンライン運用では、配置されているリソース、アクセス頻度などから、オンラインで値を変更できるパラメータもあります。逆に一度設定すると変更できない値(concurrency)もありますので注意してください。

ノード定義ファイルの各設定項目の意味を以下に説明します。

初期状態で含まれていない項目も項目名を追加することでシステムに認識させることができます。 変更の欄ではパラメータの変更可否と変更タイミングを示します

ディレクトリの指定は、フルパスもしくは、GS_HOME環境変数からの相対パスで指定します。相対パスは、GS_HOMEの初期ディレクトリが基点となります。GS_HOMEの初期設定ディレクトリは、/var/lib/gridstoreです。

GridDBの構成 初期値 パラメータの意味と制限値 変更
/serviceAddress なし cluster,transaction,syncの各サービスアドレスの初期値を設定。3項目のアドレスを設定せずに本アドレスの設定のみで各サービスアドレスの初期値を設定できる。 起動
/dataStore/dbPath data データベースファイルの配置ディレクトリをフルパスもしくは、相対パスで指定する。 起動
/dataStore/dbFileSplitCount 0 (分割無し) チェックポイントファイルの分割数。 不可
/dataStore/dbFilePathList 空リスト チェックポイントファイル分割時の分割チェックポイントファイルの配置ディレクトリリスト。
dbFileSplitCountに1以上を指定した場合は必須。複数設定可能(例:["/stg01","/stg02"])。ただし、dbFileSplitCount以上のディレクトリ数は指定不可。
起動
/dataStore/backupPath backup バックアップファイルの配置ディレクトリのパスを指定。 起動
/dataStore/syncTempPath sync データ同期用一時ファイルの配置ディレクトリのパスを指定。 起動
/dataStore/storeMemoryLimit 1024MB データ管理用メモリの上限。 オンライン
/dataStore/concurrency 4 処理の並列度を指定。 不可
/dataStore/logWriteMode 1 ログ書き出しモード・周期を指定。 -1または0の場合トランザクション終了時にログ書き込み、1以上231未満の場合、秒単位の周期でログ書き込み 起動
/dataStore/persistencyMode 1(NORMAL) 永続化モードでは、データ更新時の更新ログファイルの保持期間を指定する。1(NORMAL)、2(RETAINING_ALL_LOGS) のいずれかを指定。"NORMAL" は、チェックポイントにより、不要になったトランザクションログファイルは削除されます。"RETAINING_ALL_LOGS"は、全てのトランザクションログファイルを残します。 起動
/dataStore/storeWarmStart false(無効) 再起動時にチャンクメモリ上限までインメモリ化するかを指定。 起動
/dataStore/affinityGroupSize 4 アフィニティグループ数 起動
/dataStore/storeCompressionMode NO_COMPRESSION データブロック圧縮モード 起動
/dataStore/autoExpire false 期限解放が設定されたコンテナのロウを、コールドデータになった後に自動削除するかを指定。false:自動削除しない(長期アーカイブ実行による削除が必要) true:自動削除する オンライン
/checkpoint/checkpointInterval 60秒 メモリ上のデータ更新ブロックを永続化するチェックポイント処理の実行周期 起動
/checkpoint/checkpointMemoryLimit 1024MB チェックポイント専用書き出しメモリの上限 ※チェックポイント中に更新トランザクションがある場合に必要となるメモリ領域を上限値までプール。 オンライン
/checkpoint/useParallelMode false(無効) チェックポイントを並列実行するかどうかを指定。※並列スレッド数は並列度(concurrency)と同じ数になります。 起動
/checkpoint/checkpointCopyInterval 100ms データの更新や追加が行われたブロックをチェックポイント処理でディスクに出力する際の出力処理間隔 起動
/cluster/serviceAddress 上位のserviceAddressに従う クラスタ構成用待ち受けアドレス 起動
/cluster/servicePort 10010 クラスタ構成用待ち受けポート 起動
/cluster/notificationInterfaceAddress "" マルチキャストパケットを送信するインターフェースのアドレスを指定 起動
/sync/serviceAddress 上位のserviceAddressに従う クラスタ間でデータ同期のための受信アドレス 起動
/sync/servicePort 10020 データ同期用待ち受けポート 起動
/system/serviceAddress 上位のserviceAddressに従う 運用コマンド用待ち受けアドレス 起動
/system/servicePort 10040 運用コマンド用待ち受けポート 起動
/system/eventLogPath log イベントログファイルの配置ディレクトリのパス 起動
/system/securityPath security サーバ証明書、秘密鍵の配置ディレクトリをフルパスもしくは、相対パスで指定。 起動
/system/serviceSslPort 10045 運用コマンド用待ち受けSSLポート 起動
/transaction/serviceAddress 上位のserviceAddressに従う クライアント通信向けトランザクション処理用待ち受けアドレス(/transaction/localserviceAddressの指定がない場合、クラスタ内部通信向けも兼ねる) 起動
/transaction/localServiceAddress 上位のserviceAddressに従う クラスタ内部通信向けトランザクション処理用待ち受けアドレス 起動
/transaction/servicePort 10001 トランザクション処理用待ち受けポート 起動
/transaction/connectionLimit 5000 トランザクション処理接続数の上限 起動
/transaction/transactionTimeoutLimit 300秒 トランザクションタイムアウト時間の上限値 起動
/transaction/reauthenticationInterval 0s(無効) 再認証間隔。(指定時間を超えると再認証が行われ、既に接続中の一般ユーザに対する権限等の変更が反映される。) デフォルト(0s)の場合、再認証は無効。 オンライン
/transaction/workMemoryLimit 128MB トランザクション処理でのデータ参照(get、TQL)時のメモリの上限サイズ(並列度ごと) オンライン
/transaction/notificationInterfaceAddress "" マルチキャストパケットを送信するインターフェースのアドレスを指定 起動
/sql/serviceAddress 上位のserviceAddressに従う クライアント通信向けNewSQL I/Fアクセスの処理用待ち受けアドレス(/sql/localServiceAddressの指定がない場合、クラスタ内部通信向けも兼ねる) 起動
/sql/localServiceAddress 上位のserviceAddressに従う クラスタ内部通信向けNewSQL I/Fアクセスの処理用待ち受けアドレス 起動
/sql/servicePort 20001 NewSQL I/Fアクセスの処理用待ち受けポート 起動
/sql/storeSwapFilePath swap SQL中間ストアのスワップファイルの配置ディレクトリのパス 起動
/sql/storeSwapSyncSize 1024MB SQL中間ストアのスワップファイルのsyncおよび物理メモリキャッシュ消去を行うサイズ 起動
/sql/storeMemoryLimit 1024MB SQL処理でメモリ上に保持する中間データの最大値 起動
/sql/workMemoryLimit 32MB SQL処理でオペレータが使用するメモリの最大値 起動
/sql/workCacheMemory 128MB SQL処理でオペレータが使用するメモリのうち、使用後に解放せずにキャッシュするメモリサイズ 起動
/sql/connectionLimit 5000 NewSQL I/Fアクセスの処理接続数の上限 起動
/sql/concurrency 4 同時実行スレッド数 起動
/sql/traceLimitExecutionTime 300秒 スロークエリをイベントログに残す実行時間の下限値 オンライン
/sql/traceLimitQuerySize 1000 スロークエリに残るクエリ文字列のサイズ上限(バイト) オンライン
/sql/notificationInterfaceAddress "" マルチキャストパケットを送信するインターフェースのアドレスを指定 起動
/trace/fileCount 30 イベントログファイルの上限数 起動
/security/userCacheSize 1000 キャッシュする一般ユーザ/LDAPユーザエントリ数を指定。 起動
/security/userCacheUpdateInterval 60 キャッシュの更新間隔(秒)を指定。 起動

9 システムの制限値

9.1 数値に関する制限

ブロックサイズ 64KB 1MB~32MB
文字列型/空間型のデータサイズ 31KB 128KB
BLOB型のデータサイズ 1GB - 1Byte 1GB - 1Byte
配列長 4000 65000
カラム数 1024個 約7K~32000個(※1)
索引数(コンテナ1個あたり) 1024個 16000個
線形補完圧縮の対象カラム数 100個 100個
ユーザ数 128 128
データベース数 128個 128個
トリガのURL 4KB 4KB
アフィニティグループ数 10000 10000
解放期限付き時系列コンテナの分割数 160 160
GridDBノードが管理する通信バッファのサイズ 約2GB 約2GB
ブロックサイズ 64KB 1MB 4MB 8MB 16MB 32MB
パーティションサイズ 約4TB 約64TB 約256TB 約512TB 約1PB 約2PB

9.2 ネーミングに関する制限

名前 使用可能な文字 長さの上限
管理ユーザ 先頭が"gs#"で始まる。それ以外の文字は英数字、'_' 64文字
一般ユーザ 英数字、'_'、'-'、'.'、'/'、'=' 64文字
ロール 英数字、'_'、'-'、'.'、'/'、'=' 64文字
パスワード Unicodeコードポイントを文字とする
任意個数の文字の列(NULL文字(U+0000)は不可)
64バイト(UTF-8エンコード換算)
クラスタ名 英数字、'_'、'-'、'.'、'/'、'=' 64文字
データベース名 英数字、'_'、'-'、'.'、'/'、'=' 64文字
コンテナ名
テーブル名
ビュー名
英数字、'_'、'-'、'.'、'/'、'='
(ノードアフィニティを指定する場合のみ'@')
16384文字(ブロックサイズ64KB)
131072文字(ブロックサイズ1MB~32MB)
カラム名 英数字、'_'、'-'、'.'、'/'、'=' 256文字
索引名 英数字、'_'、'-'、'.'、'/'、'=' 16384文字(ブロックサイズ64KB)
131072文字(ブロックサイズ1MB~32MB)
トリガ名 英数字、'_'、'-'、'.'、'/'、'=' 256文字
バックアップ名 英数字、'_' 12文字
データアフィニティ 英数字、'_'、'-'、'.'、'/'、'=' 8文字

10 付録

10.1 ディレクトリ構成

GridDBのサーバやクライアントをインストールした時のディレクトリ構成を以下に示します。X.x.xはGridDBのバージョンを表します。

(サーバ/クライアントをインストールしたマシン)
/usr/griddb-ee-X.X.X/                                    インストールディレクトリ
                     Readme.txt
                     bin/
                         gs_xxx                          各種コマンド
                         gsserver                        サーバモジュール
                         gsserver_archive                サーバモジュール
                         gssvc                           サーバモジュール
                     conf/
                     etc/
                     lib/
                     license/
                     misc/
                     prop/
                     sample/
                     web/

/usr/griddb-ee-X.X.X/                                    インストールディレクトリ
                     lib/
                         gridstore-tools-X.X.X.jar
                         XXX.jar                         フリーソフトウェア

/usr/share/java/gridstore-tools.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-tools-X.X.X.jar

/var/lib/gridstore/                                      GridDBホームディレクトリ(作業ディレクトリ)
                   admin/                                統合運用管理GUIホームディレクトリ(adminHome)
                   backup/                               バックアップファイル格納ディレクトリ
                   conf/                                 定義ファイルの格納ディレクトリ
                        gs_cluster.json                  クラスタ定義ファイル
                        gs_node.json                     ノード定義ファイル
                        password                         ユーザ定義ファイル
                   data/                                 データベースファイル格納ディレクトリ
                   log/                                  イベントログ格納ディレクトリ
                   webapi/                               Web APIディレクトリ

/usr/bin/
         gs_xxx -> /usr/griddb-ee-X.X.X/bin/gs_xxx                       各種コマンドへのリンク
         gsserver -> /usr/griddb-ee-X.X.X/bin/gsserver                   サーバモジュールへのリンク
         gsserver_archive -> /usr/griddb-ee-X.X.X/bin/gsserver_archive   サーバモジュールへのリンク
         gssvc -> /usr/griddb-ee-X.X.X/bin/gssvc                         サーバモジュールへのリンク

/etc/init.d/
            gridstore                                    rcスクリプト

(ライブラリをインストールしたマシン)
/usr/griddb-ee-X.X.X/                                    インストールディレクトリ
                     lib/
                         gridstore-X.X.X.jar
                         gridstore-advanced-X.X.X.jar
                         gridstore-call-logging-X.X.X.jar
                         gridstore-conf-X.X.X.jar
                         gridstore-jdbc-X.X.X.jar
                         gridstore-jdbc-call-logging-X.X.X.jar
                         gridstore.h
                         libgridstore.so.0.0.0
                         libgridstore_advanced.so.0.0.0
                         python/                         Pythonライブラリディレクトリ
                         nodejs/                         Node.jsライブラリディレクトリ
                             sample/
                             griddb_client.node
                             griddb_node.js
                         go/                             Goライブラリディレクトリ
                             sample/
                             pkg/linux_amd64/griddb/go_client.a
                             src/griddb/go_client/       Goライブラリのソースディレクトリ
                         conf/                           
                         javadoc/                           

/usr/griddb-ee-webapi-X.X.X/                             Web APIディレクトリ
                     conf/
                     etc/
                     griddb-webapi-ee-X.X.X.jar
                     griddb-webapi.jar -> /usr/griddb-ee-webapi-X.X.X/griddb-webapi-ee-X.X.X.jar

/usr/share/java/gridstore.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-X.X.X.jar
/usr/share/java/gridstore-advanced.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-advanced-X.X.X.jar
/usr/share/java/gridstore-call-logging.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-call-logging-X.X.X.jar
/usr/share/java/gridstore-conf.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-conf-X.X.X.jar
/usr/share/java/gridstore-jdbc.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-jdbc-X.X.X.jar
/usr/share/java/gridstore-jdbc-call-logging.jar -> /usr/griddb-ee-X.X.X/lib/gridstore-jdbc-call-logging-X.X.X.jar


/usr/include/gridstore.h -> /usr/griddb-ee-X.X.X/lib/gridstore.h

/usr/lib64/
           libgridstore.so -> libgridstore.so.0
           libgridstore.so.0 -> libgridstore.so.0.0.0
           libgridstore.so.0.0.0 -> /usr/griddb-ee-X.X.X/lib/libgridstore.so.0.0.0
           libgridstore_advanced.so -> libgridstore_advanced.so.0
           libgridstore_advanced.so.0 -> libgridstore_advanced.so.0.0.0
           libgridstore_advanced.so.0.0.0 -> /usr/griddb-ee-X.X.X/lib/libgridstore_advanced.so.0.0.0