はじめに
データベースシステムのデータ格納方式は、性能・信頼・運用性等を考慮した上で決定する必要があります。 本エントリではこの目的において、HiRDBでデータの物理配置を制御する「表のマトリクス分割」を試してみた結果をまとめます。
表の横分割の種類
HiRDBでは表を分割して格納する場合に、大きく次の分割方法を選択できます。 このうち、今回は3点目のマトリクス分割でキーレンジ分割+FIXハッシュ分割を行います。
- キーレンジ分割
キーとなる値の格納条件指定または境界値指定で表を分割する。 - ハッシュ分割
ハッシュ関数を使用して、均等に表を複数のRDエリアに格納する。 - マトリクス分割※
第1次元分割列で境界値指定のキーレンジ分割をし、分割されたデータをさらに第2次元分割列で分割する。第2次元分割列には次の分割方法が指定できる。
(a) 境界値指定のキーレンジ分割
(b) フレキシブルハッシュ分割
(c) FIXハッシュ分割
※HiRDB Advanced High Availabilityが必要
想定するシステム構成
次のように複数のRDエリアが異なるディスクのHiRDBファイルシステム領域に割り当てられている場合に、 第1次元のキーレンジ分割によって、ディスク障害時の影響範囲を局所化し(信頼性向上)、 第2次元のFIXハッシュ分割でI/Oの並列処理を可能とする(性能向上)ことが狙いです。
- 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