11.4.25 チャンクのアーカイブを意識した運用例
ここでは,検索頻度が少ない古いデータをアーカイブして,データベースの容量増加を抑える運用方法を,次に示す例を使って説明します。ここで説明する運用方法の前提は,次のとおりです。
-
全国の通信制御機器から発生したセンサデータ(通信量や障害予兆検知に関する情報)を本社が収集し,通信制御機器の交換や増設の要否を判断するために,センサデータを検索・分析します。
-
本社が収集したセンサデータは,通信制御機器ログ表で一元管理します。
-
センサデータは,1時間ごとにデータベースにインポートします。
-
1時間ごとにインポートしたセンサデータは,日が切り替わったタイミングで,1日分のチャンクとして,1つのチャンクにマージします。また,月が切り替わったタイミングで,1か月分のチャンクとして,1つのチャンクにマージします。最終的には,1つのチャンクを月単位で管理します。
-
データベースにセンサデータをインポートしている間も,センサデータを検索します。直近24時間分(日単位),直近7日分(週単位)および直近1か月分(月単位)のセンサデータを検索します。検索結果を基に,通信制御機器の交換や増設の要否を判断します。
-
センサデータを検索した結果,通信量がしきい値を超えていた場合は,該当する日と前後1日の日付をキーにして,過去5年間のデータを分析します。通信量がしきい値を超えるケースは,月1回程度です。
-
データベースにインポートして1年が経過したセンサデータは,検索頻度が非常に少なくなるため,チャンク単位でセンサデータをアーカイブします。月が切り替わったタイミングで,センサデータをアーカイブして,データベースの容量を削減します。
-
データベースには5年間のデータを保持します。5年を超えたデータは,月が切り替わったタイミングで,チャンク単位で削除します。
このシステムでの運用の流れを次の図に示します。
- 〈この項の構成〉
(1) アーカイブディレクトリの作成
この運用例では,データ容量削減のために,1年経過したデータをチャンク単位にアーカイブします。チャンクをアーカイブする際,アーカイブファイルを格納するためのアーカイブディレクトリが必要になります。運用を開始する前に,アーカイブディレクトリを作成してください。
次に示す手順で,アーカイブディレクトリを作成します。
手順
-
スーパユーザでOSにログインする
スーパユーザで,サーバマシンのOSにログインしてください。
-
アーカイブディレクトリ用のファイルシステムを作成する
OSのコマンドを実行し,アーカイブディレクトリ用のファイルシステムを作成します。
アーカイブディレクトリ用のLVとして作成した/dev/vg_hadb/hadb_archivedirを,ext4のファイルシステムで作成する場合の実行例を次に示します。
■コマンドの実行例
mkfs -t ext4 /dev/vg_hadb/hadb_archivedir
-
アーカイブディレクトリ用のマウントポイントを作成する
OSのコマンドを実行し,アーカイブディレクトリ用のマウントポイントを作成します。実行例を次に示します。
■コマンドの実行例
mkdir -p /HADB/archive
-
アーカイブディレクトリ用のファイルシステムがあるVGを活性化する
OSのコマンドを実行し,アーカイブディレクトリ用のファイルシステムがあるVGを活性化します。実行例を次に示します。
■コマンドの実行例
vgchange -a y /dev/vg_hadb
-
アーカイブディレクトリ用ファイルシステムをマウントする
OSのコマンドを実行し,アーカイブディレクトリ用ファイルシステムをマウントします。実行例を次に示します。
■コマンドの実行例
mount /dev/vg_hadb/hadb_archivedir /HADB/archive -t ext4 -o defaults,noatime,_netdev4
-
アーカイブディレクトリのオーナーを変更する
OSのコマンドを実行し,アーカイブディレクトリのオーナーを変更します。アーカイブディレクトリを使用するHADB管理者とHADB管理グループを指定してください。
HADB管理者のユーザ名がadbmanager,HADB管理グループがadbgroupの場合の実行例を次に示します。
■コマンドの実行例
chown adbmanager.adbgroup /HADB/archive
(2) アーカイブマルチチャンク表の定義
アーカイブディレクトリを作成したあとで,アーカイブマルチチャンク表とインデクスを定義します。
この運用例では,センサデータを一元管理するために,通信制御機器ログ表(INSTRUMENT_LOG)およびインデクスを定義します。
(a) 通信制御機器ログ表(INSTRUMENT_LOG)の定義
通信制御機器ログ表(INSTRUMENT_LOG)は,DBエリアTBLDAT_003に格納するように定義します。また,バックグラウンドインポートおよびチャンクのアーカイブを実施するために,通信制御機器ログ表をアーカイブマルチチャンク表として定義します。
この運用例では,次に示す数のチャンクが必要となります。
-
1時間ごとにバックグラウンドインポートで追加したセンサデータを管理するチャンク(24個)
1時間ごとにバックグラウンドインポートでデータを追加するため,1日分のチャンクは24個になります。
-
1日ごとのセンサデータを管理するチャンク(32個)
1か月分(31日分)に加えて,それらをマージするマージ先チャンクが1個必要となるため,合計すると32個になります。
-
1か月ごとのセンサデータを管理するチャンク(61個)
5年分(60か月分)に加えて,それらをマージするマージ先チャンクが1個必要となるため,合計すると61個になります。
このため,安全率を1.2とすると,作成されるチャンク数の最大値は次の値となります。
- メモ
-
チャンク数が増加すると検索性能に影響を与えます。そのため,使用するチャンク数をできるだけ抑えるように,設計・運用することを推奨します。
この見積もりによって,チャンク数の最大値には141を設定します。この値をCREATE TABLE文のチャンク指定のCHUNKに指定します。
また,通信制御機器ログ表(INSTRUMENT_LOG)の収集日時列(C_TIME)は,データ分析の範囲を特定でき,かつチャンクごとにデータが重ならない列です。そのため,アーカイブレンジ列とします。アーカイブレンジ列に自動的に定義されるレンジインデクスは,通信制御機器ログ表(INSTRUMENT_LOG)に定義する,ほかのインデクスを格納するDBエリアIDXDAT_003に格納します。
次に示す内容を,CREATE TABLE文のチャンクアーカイブ指定に指定します。
-
アーカイブレンジ列の列名(C_TIME)
-
自動的に定義されるレンジインデクスを格納するDBエリア名(IDXDAT_003)
-
作成したアーカイブディレクトリ(/HADB/archive)
CREATE TABLE文の例を次に示します。
- ■CREATE TABLE文の例
-
CREATE TABLE "INSTRUMENT_LOG" ("SID" INTEGER, "C_TIME" TIMESTAMP, "TRAFFIC" INTEGER, "THROUGH" INTEGER, "RETRY" INTEGER, ...) IN "TBLDAT_003" CHUNK= 141 ARCHIVABLE RANGECOLUMN="C_TIME" IN "IDXDAT_003" ARCHIVEDIR='/HADB/archive'
CREATE TABLE文については,マニュアルHADB SQLリファレンスの定義系SQLのCREATE TABLE(表の定義)を参照してください。
(b) 通信制御機器ログ表(INSTRUMENT_LOG)に対するインデクスの定義
通信制御機器ログ表に対して,B-treeインデクスを定義します。B-treeインデクスはDBエリアIDXDAT_003に格納します。
機器ID列(SID)に対してB-treeインデクスを定義します。CREATE INDEX文の例を次に示します。
- ■CREATE INDEX文の例
-
CREATE INDEX "SID_IDX" ON "INSTRUMENT_LOG"("SID") IN "IDXDAT_003" EMPTY
CREATE INDEX文については,マニュアルHADB SQLリファレンスの定義系SQLのCREATE INDEX(インデクスの定義)を参照してください。
(c) この運用例で使用する表のイメージ
この運用例で使用する表のイメージを次の図に示します。
(3) 新しいセンサデータの追加(バックグラウンドインポート)
通信制御機器からリアルタイムにセンサデータが発生します。発生したセンサデータは,1時間ごとに通信制御機器ログ表(INSTRUMENT_LOG)に追加します。
センサデータの追加は,バックグラウンドインポートで実行します。1回のバックグラウンドインポートでアーカイブマルチチャンク表に格納したデータ,およびそのインデクスは,1つの固まり(チャンク)として管理されます。チャンクについては,「2.14.2 データインポート単位のデータ管理(チャンク)」を参照してください。
- メモ
-
データをチャンク単位で管理することで,チャンク単位でのバックアップの取得や,データの削除ができます。バックグラウンドインポートやチャンクをマージする際に,チャンクにコメントを設定できます。コメントを設定しておくと,操作対象のチャンクを特定しやすくなります。
-bオプションを指定したadbimportコマンドを実行して,バックグラウンドインポートを行います。adbimportコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbimport -u ADBUSER01 -p '#HelloHADB_01' -k "'" -s , -g 10 -w /home/adbmanager/tmp -z /home/adbmanager/imp_file/imp_opt_file03.txt -b -m '2015/03/31' INSTRUMENT_LOG /home/adbmanager/imp_file/imp_data_path03.txt
- [説明]
-
通信制御機器ログ表(INSTRUMENT_LOG)に対して,入力データパスファイル(/home/adbmanager/imp_file/imp_data_path03.txt)に指定した入力データファイルの内容をバックグラウンドインポートします。
「2015年3月31日」に発生したセンサデータをバックグラウンドインポートで追加するため,-mオプションに「チャンクに設定するコメント」を指定します。
1時間ごとにバックグラウンドインポートを実行します。その結果,1日分(24時間分)のチャンクが24個作成されます。
adbimportコマンドについては,マニュアルHADB コマンドリファレンスのadbimport(データのインポート)を参照してください。また,「11.4.2 マルチチャンク表にデータを格納する方法(バックグラウンドインポート)」も参照してください。
(4) データの検索
バックグラウンドインポートを実行している間も,アーカイブマルチチャンク表のデータを検索できます。
バックグラウンドインポートによってセンサデータを追加することで,インポートの対象となるデータベースに対して検索を実行しているHADBユーザが存在しても,データのインポートを実行できます(検索と並行してデータのインポートを実行できます)。
バックグラウンドインポートとデータの検索の関係を次の図に示します。
(5) チャンクのマージ(チャンク数の削減)
チャンク数が増加すると検索性能が低下するおそれがあるため,定期的にチャンクをマージする必要があります。この運用例では,センサデータを1時間ごとにバックグラウンドインポートしているので,1日で24個のチャンクが作成されます。
この運用例では,次に示すタイミングで複数のチャンクをマージして,1個のチャンクにマージしています。最終的には,月単位でチャンクを管理します。
-
1日分(24時間分)のチャンク24個を,1個のチャンクにマージする
-
1か月分(31日分)のチャンク31個を,1個のチャンクにマージする
ここでは,1日分(2015年3月31日分)のデータを,1つのチャンクにマージする例を次に示します。
(a) マージ対象とするチャンクの特定
マージ対象とするチャンクのチャンクIDを特定するには,次に示すように,システム表STATUS_CHUNKSを検索します。SQL文の例を次に示します。
- ■SQL文の例
-
SELECT "CHUNK_ID" FROM "MASTER"."STATUS_CHUNKS" TC WHERE "TABLE_SCHEMA"='ADBUSER01' AND "TABLE_NAME"='INSTRUMENT_LOG' AND "CHUNK_COMMENT"='2015/03/31'
- ■検索結果
-
CHUNK_ID -------------------- 92 (中略) 115
- [説明]
-
この例の場合は,バックグラウンドインポート時に付加したチャンクのコメント('2015/03/31')をキーにSTATUS_CHUNKS表を検索することで,マージ対象とするチャンクのチャンクID(92〜115)を特定しています。
対象となるチャンクと,そのチャンクIDについては,「11.4.8 チャンクの状態や作成されているチャンク数を確認する方法」を参照して確認してください。
(b) チャンクのマージ
adbmergechunkコマンドを実行してチャンクをマージします。adbmergechunkコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbmergechunk -u ADBUSER01 -p '#HelloHADB_01' -g 2 -w /home/adbmanager/tmp -z /home/adbmanager/merge_file/merge_opt_file03.txt -m '2015/03/31' -c 92-115 INSTRUMENT_LOG
- [説明]
-
通信制御機器ログ表(INSTRUMENT_LOG)に対してマージチャンクオプションファイル(/home/adbmanager/merge_file/merge_opt_file03.txt)に指定した値を入力情報として,-cオプションに指定したチャンクのマージを実行します。
この例では,92から115のチャンクIDのチャンクを1つの待機状態のチャンクにマージすることで,1日分のセンサデータ(2015年3月31日分)としてまとめています。
チャンクのマージの例を次の図に示します。
チャンクIDが92から115のチャンクは,adbmergechunkコマンドの正常終了時に自動的に削除されます。
- メモ
-
チャンクをマージすることで,検索性能の低下を防ぐことができます。また,1表,1DBエリアが管理できるチャンク数には限りがあります。使用中のチャンク数が,1表,1DBエリアが管理できる上限に達した場合には,複数のチャンクを1つにマージしてください。チャンクをマージすることで,使用中のチャンク数を削減できます。
adbmergechunkコマンドについては,マニュアルHADB コマンドリファレンスのadbmergechunk(チャンクのマージ)を参照してください。また,「11.4.9 チャンクをマージする方法(チャンク数を減らす方法)」も参照してください。
(6) チャンクのアーカイブ(チャンク単位でのデータの圧縮)
この運用例では,データベースに追加してから1年が経過したデータは,検索頻度が非常に少なくなるため,チャンク単位でアーカイブ(データの圧縮)します。チャンクをアーカイブすることで,データベースの容量を削減できます。
- 重要
-
アーカイブしたチャンク内のデータを検索する場合,次に示す原因によって,アーカイブされていないチャンク内のデータを検索するときに比べて検索時間が長くなります。
-
データの伸長に時間が掛かる
-
インデクスを使用した検索ができない
この運用例のように,検索頻度が非常に少ないが,長期間保持する必要があるデータをアーカイブするようにしてください。詳細については,「2.15.2 チャンクアーカイブ機能を適用するケース」を参照してください。
-
(a) チャンクのアーカイブの実行
adbarchivechunkコマンドを実行して,チャンクをアーカイブします。ここでは,2014年3月のセンサデータを管理するチャンクをアーカイブします。adbarchivechunkコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbarchivechunk -u ADBUSER01 -p '#HelloHADB_01' -g 2 -z /home/adbmanager/arc_file/archive_chunk03.def -r 2014/03/01-2014/03/31 INSTRUMENT_LOG
- [説明]
-
adbarchivechunkコマンドの-rオプションで,アーカイブするチャンクの日付の範囲(2014/03/01-2014/03/31)を指定します。-rオプションに指定した日付の範囲に,アーカイブレンジ列の値の範囲が含まれているチャンクがアーカイブされます。この運用例では,通信制御機器ログ表(INSTRUMENT_LOG)の収集日時列(C_TIME)を,アーカイブレンジ列に指定しています。そのため,収集日時列(C_TIME)の値を基に,2014年3月分のチャンクがアーカイブされます。
(b) アーカイブの実行結果の確認
adbdbstatusコマンドを実行して,アーカイブしたチャンクの状態を確認します。adbdbstatusコマンドで「アーカイブ状態のチャンクのサマリ情報」を出力すると,アーカイブしたチャンクの状態を確認できます。adbdbstatusコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbdbstatus -c archivechunk -n ADBUSER01.INSTRUMENT_LOG -r 2014/03/01-2014/03/31
- [説明]
-
アーカイブ状態のチャンク(2014年3月分)のサマリ情報を出力します。次の出力項目から,アーカイブしたチャンクに格納されている行数,アーカイブしたチャンクのデータ容量,およびアーカイブしたチャンクの圧縮率が確認できます。
-
Rows(アーカイブ状態のチャンクに格納されている行数)
-
Archive_file_size(アーカイブ状態のチャンクに対応している全アーカイブファイルのファイルサイズの合計値)
-
Unarchive_table_size(アーカイブ状態になる前のチャンクで,表を格納するために使用していたセグメントの容量)
-
Unarchive_index_size(アーカイブ状態になる前のチャンクで,インデクスを格納するために使用していたセグメントの容量)
-
Compression_ratio(アーカイブ状態のチャンクの圧縮率)
-
(7) 古いデータ(チャンク)の削除
データ容量の増加を抑えるため,5年が経過したデータ(アーカイブ状態のチャンク)を削除します。
通信制御機器ログ表(INSTRUMENT_LOG)から,データを追加して5年が経過した古いチャンクを削除します。削除対象のチャンクのチャンクIDを確認してから,PURGE CHUNK文でチャンクを削除します。
ここでは,2010年4月分のチャンクを削除します。
(a) チャンクIDの確認
adbdbstatusコマンドを実行して,削除対象のチャンクのチャンクIDを確認します。adbdbstatusコマンドで「アーカイブ状態のチャンクのサマリ情報」を出力すると,削除対象のチャンクのチャンクIDを確認できます。adbdbstatusコマンドの実行例を次に示します。
- ■コマンドの実行例
-
adbdbstatus -c archivechunk -n ADBUSER01.INSTRUMENT_LOG -r 2010/04/01-2010/04/30
- [説明]
-
アーカイブ状態のチャンク(2010年4月分)のサマリ情報を出力します。次の出力項目から,削除対象のチャンクのチャンクID,およびチャンク削除後にアーカイブディレクトリに確保される空き容量が確認できます。
-
Chunk_ID(チャンクID)
-
Archive_file_size(アーカイブ状態のチャンクに対応している全アーカイブファイルのファイルサイズの合計値)
-
(b) チャンクの削除
adbdbstatusコマンドで確認したチャンクIDを基に,チャンクを削除します。チャンクを削除するには,PURGE CHUNK文の探索条件にチャンクIDを指定して実行します。PURGE CHUNK文の例を次に示します。
- ■SQL文の例
-
PURGE CHUNK "INSTRUMENT_LOG" WHERE CHUNKID=4
- [説明]
-
チャンクIDが4のチャンクに含まれるデータを削除します。
この例の場合,月単位でチャンクがマージされているので,1か月分のデータが削除されます。
PURGE CHUNK文については,マニュアルHADB SQLリファレンスの操作系SQLのPURGE CHUNK(チャンク内の全行削除)を参照してください。また,「11.4.6 チャンク単位にデータを削除する方法」も参照してください。
(8) 新しいデータの追加・マージ・アーカイブと古いデータの削除の繰り返し
次に示す運用を繰り返すことで,長期間保持するデータの容量を抑えながら,センサデータを分析する運用を継続できます。
-
バックグラウンドインポートの実行
-
チャンクのマージ
-
チャンクのアーカイブ
-
PURGE CHUNK文を利用したチャンクの削除