はじめに
Verticaで利用しているデータ領域が不足した場合等、何らかの理由でデータベース作成時に指定したデータ領域とは別にデータの保存先を作成したい場合、ストレージロケーション(STORAGE LOCATION)を作成することで新たなデータファイル保存先として利用することができます。
ストレージロケーション(STORAGE LOCATION)とは
ストレージロケーションとは、データファイルや一時ファイル等の保存先(ノード名、絶対パス)情報を持つオブジェクトです。ストレージロケーションには複数のタイプが用意されており、用途に応じて使い分ける必要があります。
| ストレージロケーションのタイプ | 内容 |
|---|---|
| DATA | 永続データと一時テーブルの作成先 |
| TEMP | 一時ファイルの作成先(ソート、結合、グループ化に使用) |
| DATA,TEMP(デフォルト) | DATA、TEMPの作成先 |
| USER | スーパーユーザ以外のファイルの読み書きや外部テーブルの作成先 |
| DEPOT | Eonモードのデポ |
データファイルの保存先を追加する方法
ディスク容量が不足した際のディスク追加を例にデータファイルの保存先を追加する手順を記載していきます。追加したディスクをVerticaの新しいDATAストレージロケーションとして認識させ、該当ストレージロケーションへ特定スキーマ全体のデータを移動します。
1.ノードに物理ディスクを追加
物理ディスクをVerticaノードに追加し、対象ディスクをフォーマットします。
2.追加ディスクをマウント
追加ディスクをノードにマウントし、ストレージロケーション用のディレクトリを作成します。
※複数ノード構成の場合、各ノードに作成するディレクトリは同一名にすることを推奨します。
※複数ノード構成の場合、ノード間で共有のディレクトリをストレージロケーションとすることはできません。
3.ストレージロケーションを作成
ストレージロケーションを作成します。また、作成したロケーションにラベルを付与します。
/home/dbadmin/data2をdata_locというストレージロケーションで作成する例)
/* ストレージロケーション作成例 */
dbadmin=> CREATE LOCATION '/home/dbadmin/data2' ALL NODES USAGE 'DATA' LABEL 'data_loc2';
CREATE LOCATION
/* 確認例 */
dbadmin=> SELECT node_name,location_path,location_usage,location_label FROM STORAGE_LOCATIONS;
node_name | location_path | location_usage | location_label
----------------+---------------------------------------+----------------+----------------
v_vdb_node0001 | /home/dbadmin/vdb/v_vdb_node0001_data | DATA,TEMP |
v_vdb_node0002 | /home/dbadmin/vdb/v_vdb_node0002_data | DATA,TEMP |
v_vdb_node0003 | /home/dbadmin/vdb/v_vdb_node0003_data | DATA,TEMP |
v_vdb_node0001 | /home/dbadmin/data2 | DATA | data_loc2
v_vdb_node0002 | /home/dbadmin/data2 | DATA | data_loc2
v_vdb_node0003 | /home/dbadmin/data2 | DATA | data_loc2
(6 rows)4.オブジェクト配置ポリシーを作成
先ほど作成したストレージロケーションへtestスキーマのデータを移動させるため、SET_OBJECT_STORAGE_POLICY関数でオブジェクト配置ポリシーを作成します。
オブジェクト配置ポリシーには、オブジェクトのデータをどのストレージロケーションへ格納するかのポリシーを設定することができます。
SET_OBJECT_STORAGE_POLICY関数の構文
‘[[database.]schema.]object‑name’, ‘location‑label’
[,’key‑min’, ‘key‑max’] [, ‘enforce‑storage‑move’ ] )
| パラメータ | 説明 |
|---|---|
| [database.]schema | スキーマを指定 |
| object‑name | オブジェクトを指定 「データベース」、「スキーマ」、「テーブル」単位で指定可能 |
| location‑label | ストレージロケーションのラベルを指定 |
| key‑min key‑max | パーティションキーの範囲を指定 ※object‑nameに「テーブル」を指定する場合のみ有効 |
| enforce‑storage‑move | ストレージロケーションへデータを移動するタイミングを指定 alse(デフォルト):すべてのマージアウトタスクが完了後に移動 true:すべてのデータを即時移動 |
※オブジェクト配置ポリシーを作成する前に、移動先のストレージロケーションに十分な空き容量があるか、
必ず確認してください。オブジェクトのサイズは、 projection_storageシステムテーブルのused_bytes列で確認できます。
testスキーマのデータは全てdata_loc2に保存する場合の例)
/* オブジェクト配置ポリシー作成例 */
dbadmin=> SELECT set_object_storage_policy('test','data_loc2', true);
set_object_storage_policy
-------------------------------------------------------------------------
Object storage policy set.
Task: moving storages
(Table: test.CUSTOMER) (Projection: test.CUSTOMER_DBD_1_seg_comp3_b0)
(Table: test.CUSTOMER) (Projection: test.CUSTOMER_DBD_1_seg_comp3_b1)
(Table: test.LINEORDER) (Projection: test.LINEORDER_DBD_2_seg_comp3_b0)
(Table: test.LINEORDER) (Projection: test.LINEORDER_DBD_2_seg_comp3_b1)
(1 row)
/* 確認例 */
dbadmin=> SELECT schema_name, node_name, projection_name, storage_type, location_label
dbadmin-> FROM v_monitor.storage_containers ORDER BY 1,2,3;
schema_name | node_name | projection_name | storage_type | location_label
-------------+----------------+------------------------------+--------------+----------------
public | v_vdb_node0001 | CUSTOMER_DBD_3_seg_comp3_b0 | ROS |
public | v_vdb_node0001 | CUSTOMER_DBD_3_seg_comp3_b1 | ROS |
public | v_vdb_node0001 | LINEORDER_DBD_4_seg_comp3_b0 | ROS |
public | v_vdb_node0001 | LINEORDER_DBD_4_seg_comp3_b1 | ROS |
public | v_vdb_node0002 | CUSTOMER_DBD_3_seg_comp3_b0 | ROS |
public | v_vdb_node0002 | CUSTOMER_DBD_3_seg_comp3_b1 | ROS |
public | v_vdb_node0002 | LINEORDER_DBD_4_seg_comp3_b0 | ROS |
public | v_vdb_node0002 | LINEORDER_DBD_4_seg_comp3_b1 | ROS |
public | v_vdb_node0003 | CUSTOMER_DBD_3_seg_comp3_b0 | ROS |
public | v_vdb_node0003 | CUSTOMER_DBD_3_seg_comp3_b1 | ROS |
public | v_vdb_node0003 | LINEORDER_DBD_4_seg_comp3_b0 | ROS |
public | v_vdb_node0003 | LINEORDER_DBD_4_seg_comp3_b1 | ROS |
test | v_vdb_node0001 | CUSTOMER_DBD_1_seg_comp3_b0 | ROS | data_loc2
test | v_vdb_node0001 | CUSTOMER_DBD_1_seg_comp3_b1 | ROS | data_loc2
test | v_vdb_node0001 | LINEORDER_DBD_2_seg_comp3_b0 | ROS | data_loc2
test | v_vdb_node0001 | LINEORDER_DBD_2_seg_comp3_b1 | ROS | data_loc2
test | v_vdb_node0002 | CUSTOMER_DBD_1_seg_comp3_b0 | ROS | data_loc2
test | v_vdb_node0002 | CUSTOMER_DBD_1_seg_comp3_b1 | ROS | data_loc2
test | v_vdb_node0002 | LINEORDER_DBD_2_seg_comp3_b0 | ROS | data_loc2
test | v_vdb_node0002 | LINEORDER_DBD_2_seg_comp3_b1 | ROS | data_loc2
test | v_vdb_node0003 | CUSTOMER_DBD_1_seg_comp3_b0 | ROS | data_loc2
test | v_vdb_node0003 | CUSTOMER_DBD_1_seg_comp3_b1 | ROS | data_loc2
test | v_vdb_node0003 | LINEORDER_DBD_2_seg_comp3_b0 | ROS | data_loc2
test | v_vdb_node0003 | LINEORDER_DBD_2_seg_comp3_b1 | ROS | data_loc2
(24 rows)
※testスキーマのlocation_labelが「data_loc2」に設定される。5.オブジェクトの移動
オブジェクト配置ポリシーに設定したロケーションへのデータ移動は、Mergeout処理の中で行われます。
Mergeout処理は10分間隔で自動実行されます。
※Mergeoutによるデータ移動は、一度に全てのデータを移動せず、徐々に移動していきます。
スキーマ、ノード毎のサイズを確認する例)
/* Mergeoutによるデータ移動完了後、ノード1でOS上のディレクトリサイズ(KB)を確認 */
$ du -sk /home/dbadmin/
1806364 /home/dbadmin/vdb
1804660 /home/dbadmin/data2
/* Vertica内でスキーマ、ノード毎のサイズを確認(KB) */
dbadmin=> SELECT s.location_label, p.anchor_table_schema, p.node_name,
dbadmin -> round(sum(p.used_bytes)/1024,0) as used_kb
dbadmin -> FROM projection_storage p, storage_containers s
dbadmin -> WHERE p.anchor_table_schema = s.schema_name
dbadmin -> AND p.node_name = s.node_name
dbadmin -> AND p.projection_name = s.projection_name
dbadmin -> GROUP BY s.location_label, p.anchor_table_schema, p.node_name
dbadmin -> ORDER BY 1,2,3;
location_label | anchor_table_schema | node_name | used_kb
----------------+---------------------+----------------+----------------------------
| public | v_vdb_node0001 | 1799362.000000000000000000
| public | v_vdb_node0002 | 1799611.000000000000000000
| public | v_vdb_node0003 | 1799129.000000000000000000
data_loc2 | test | v_vdb_node0001 | 1799362.000000000000000000
data_loc2 | test | v_vdb_node0002 | 1799611.000000000000000000
data_loc2 | test | v_vdb_node0003 | 1799129.000000000000000000
(6 rows)以降は作成したオブジェクト配置ポリシーに従い、データが投入されていきます。
上記例の場合、testスキーマに作成するテーブルおよび投入データは、全てdata_loc2ロケーション
(/home/dbadmin/data2)のディレクトリ配下に格納されます。
参考情報
・Managing Storage Locations
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/AdministratorsGuide/StorageLocations/CreatingAndConfiguringStorageLocations.htm
・Creating Storage Locations
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/AdministratorsGuide/StorageLocations/AddingStorageLocations.htm
・SET_OBJECT_STORAGE_POLICY
https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/SQLReferenceManual/Functions/VerticaFunctions/SET_OBJECT_STORAGE_POLICY.htm
検証バージョン
この記事の内容はVertica 9.3で確認しています。
更新履歴
2020/03/05 本記事を公開