HiRDBで表のマトリクス分割

はじめに

データベースシステムのデータ格納方式は、性能・信頼・運用性等を考慮した上で決定する必要があります。 本エントリではこの目的において、HiRDBでデータの物理配置を制御する「表のマトリクス分割」を試してみた結果をまとめます。

表の横分割の種類

HiRDBでは表を分割して格納する場合に、大きく次の分割方法を選択できます。 このうち、今回は3点目のマトリクス分割でキーレンジ分割+FIXハッシュ分割を行います。

  • キーレンジ分割
    キーとなる値の格納条件指定または境界値指定で表を分割する。
  • ハッシュ分割
    ハッシュ関数を使用して、均等に表を複数のRDエリアに格納する。
  • マトリクス分割※
    第1次元分割列で境界値指定のキーレンジ分割をし、分割されたデータをさらに第2次元分割列で分割する。第2次元分割列には次の分割方法が指定できる。
    (a) 境界値指定のキーレンジ分割
    (b) フレキシブルハッシュ分割
    (c) FIXハッシュ分割
    ※HiRDB Advanced High Availabilityが必要

想定するシステム構成

次のように複数のRDエリアが異なるディスクのHiRDBファイルシステム領域に割り当てられている場合に、 第1次元のキーレンジ分割によって、ディスク障害時の影響範囲を局所化し(信頼性向上)、 第2次元のFIXハッシュ分割でI/Oの並列処理を可能とする(性能向上)ことが狙いです。 f:id:hiroki-sawano:20180212192455p:plain

  • FES(フロントエンドサーバ):SQLの解析/最適化処理やBESへの指示などを担うサーバ
  • BES(バックエンドサーバ):FESからの指示に従ってデータベースへのアクセスや排他制御、演算処理などを行うサーバ
  • RD_T1~4:ユーザ用RDエリア(テーブル用)
  • RD_I1~4:ユーザ用RDエリア(インデクス用)

マトリクス分割の確認

それでは実際にマトリクス分割を行う表を定義し、行挿入時に指定のRDエリアがデータ格納先として使用されることを確認します。

実行環境

  • Red Hat Enterprise Server Linux 7(64-bit)/バージョン7.3
  • HiRDB Server with Additional Function Version 9
    • HiRDB/Parallel Server Version 9.65
  • HiRDB Advanced High Availability Version 9

テーブル定義の作成

列"row_type"でキーレンジ分割し、列"id1"と列"id2でFIXハッシュ分割します。
キーレンジ分割での境界値の指定は、PARTITIONED BY MULTIDIMに続けて昇順に行います。 以下の例では'10'と指定してあるため、row_typeが'10'以下の行と'10'を超過する行がそれぞれ異なるRDエリアに分割されます。
FIXハッシュ分割では、分割キーに「キー値の偏りが少ない」、「キーの値に重複が少ない」列を選択します。 また、ハッシュ関数は複数用意されていますが、リバランス表でない場合最も均等にハッシングされるHASH6を選びます。

この定義によって次の通り動作することが期待できます。
<row_type <= '10'の場合> RD_T1とRD_T2に格納
<row_type > '10'の場合> RD_T3とRD_T4に格納

MATRIX_TEST.sql

CREATE TABLE "MATRIX_TEST" (
  "id1"          INTEGER      NOT NULL,
  "id2"          INTEGER      NOT NULL,
  "row_type"     CHAR(2)      NOT NULL,
  "row_value"    VARCHAR(100)
)
 PARTITIONED BY MULTIDIM
 ("row_type" (('10')),
 FIX HASH HASH6 BY "id1","id2")
                   IN ((RD_T1,RD_T2),
                       (RD_T3,RD_T4))
 PRIMARY KEY ("id1", "id2", "row_type")
                   IN ((RD_I1,RD_I2),
                       (RD_I3,RD_I4))
;

次の通り作成したテーブル定義のSQLを実行します。

$ pddef < ./MATRIX_TEST.sql
KFPA12000-I Processing of SQL completed
$ pdsql
COMMAND ?     +----2----+----3----+----4----+----5----+----6----+----7----+
tables;
 TABLE_SCHEMA                   TABLE_NAME                     N_COLS N_INDEX CREATE_TIME
 ------------------------------ ------------------------------ ------ ------- --------------
 xxxxxxx                        MATRIX_TEST                         4       1 20180212190159

データの挿入と表分割の確認

次のデータをMATRIX_TESTに挿入しながら、経過をDB状態解析機能(pddbst)で確認します。

SELECT * FROM MATRIX_TEST;
 id1          id2          row_type row_value
 ------------ ------------ -------- -----------------------------------------------------
            1            1 10       ABCD
            1            2 10       ABCD
            2            2 20       ABCD
            2            1 20       ABCD
KFPX27010-I            4 rows selected

作業開始前の状態確認

テーブル用ユーザRDエリアの状態確認を行っていきます。
pddbstの-tオプションで解析対象のテーブル'MATRIX_TEST'を指定します。 この時点ではどのRDエリアの使用率も0%であることがわかります(記載内容はコマンド実行結果の一部抜粋)。

$ pddbst -t MATRIX_TEST
 RD Area Name   : RD_T1
  Server        : bes1
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T2
  Server        : bes2
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T3
  Server        : bes3
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T4
  Server        : bes4
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0

row_type'10'の挿入(1行目)

RD_T1が使用されている様子が確認できます。

$ pdsql
COMMAND ?     +----2----+----3----+----4----+----5----+----6----+----7----+
INSERT INTO MATRIX_TEST VALUES (1,1,'10','ABCD');
KFPX27010-I            1 rows inserted
…
$ pddbst -t MATRIX_TEST
 RD Area Name   : RD_T1
  Server        : bes1
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T2
  Server        : bes2
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T3
  Server        : bes3
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T4
  Server        : bes4
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0

row_type'10'の挿入(2行目)

2行目の挿入ではハッシュ分割されてRD_T2が使用されました。

$ pdsql
COMMAND ?     +----2----+----3----+----4----+----5----+----6----+----7----+
INSERT INTO MATRIX_TEST VALUES (1,2,'10','ABCD');
KFPX27010-I            1 rows inserted
…
$ pddbst -t MATRIX_TEST
 RD Area Name   : RD_T1
  Server        : bes1
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T2
  Server        : bes2
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T3
  Server        : bes3
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T4
  Server        : bes4
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0

row_type'20'の挿入(1行目)

キー値を'20'にするとRD_T4にデータが格納されました。

$ pdsql
COMMAND ?     +----2----+----3----+----4----+----5----+----6----+----7----+
INSERT INTO MATRIX_TEST VALUES (2,1,'20','ABCD');
KFPX27010-I            1 rows inserted
…
$ pddbst -t MATRIX_TEST
 RD Area Name   : RD_T1
  Server        : bes1
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T2
  Server        : bes2
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T3
  Server        : bes3
          Used(Full)       Used(      Full)        Sum
  Segment   0%(  0%)          0(         0)          0
  Page      0%(  0%)          0(         0)          0
 RD Area Name   : RD_T4
  Server        : bes4
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20

row_type'20'の挿入(2行目)

次のrow_type'20'の行は、RD_T3に挿入されました。

$ pdsql
COMMAND ?     +----2----+----3----+----4----+----5----+----6----+----7----+
INSERT INTO MATRIX_TEST VALUES (2,2,'20','ABCD');
KFPX27010-I            1 rows inserted
…
$ pddbst -t MATRIX_TEST
 RD Area Name   : RD_T1
  Server        : bes1
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T2
  Server        : bes2
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T3
  Server        : bes3
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20
 RD Area Name   : RD_T4
  Server        : bes4
          Used(Full)       Used(      Full)        Sum
  Segment 100%(  0%)          1(         0)          1
  Page      5%(  0%)          1(         0)         20