はじめに

Verticaでは、別のVertica環境にデータを複製する方法がいくつかあります。
この記事では、vbrのレプリケーション機能を使った方法を紹介します。

vbrとは

vbrとは、Verticaの標準機能であるバックアップツールです。
vbrは基本的にはバックアップやリストアを行うツールですが、様々なオプションが提供されています。
その中の1つとしてレプリケーション機能が用意されており、今回はその機能にフォーカスします。

vbrのレプリケーションとは

ここでのvbrのレプリケーションとは、あるデータベースから別のデータベースへの部分的なコピーを指します。
レプリケーション元のデータが更新されたら、レプリケーション先に対してリアルタイムに更新するような機能ではありません。
例えば、本番環境から検証環境に対してある時点のデータをコピーしたいような場合に使える機能です。

レプリケーション対象

vbrのレプリケーション機能でコピーできるオブジェクトは、テーブルとスキーマです。
1度に複数のオブジェクトをコピーすることもできます。

バックアップデータは不要

vbrツールがバックアップツールであるため、一度取得したバックアップデータを使って別環境にコピーすることをイメージされるかもしれません。
しかし、vbrのレプリケーション機能はバックアップデータを使わずに、レプリケーション元のデータベースから、レプリケーション先のデータベースに直接コピーされます。
そのため、バックアップ運用をしていないシステムでも使うことができます。

必要な前提条件

・dbadminユーザがレプリケーション元とレプリケーション先の両方に存在する
・各ノードのステータスがUPであること
・レプリケーション元環境とレプリケーション先環境のノード数が同一であること
・レプリケーション元とレプリケーション先の間では、SSHでパスワードレスで接続できること
・パスワードファイルのパーミッションは、dbadminユーザに対して「600」であること。

レプリケーションの手順

レプリケーションの手順の概要を以下に記載します。
1. iniファイルの作成
2. パスワードファイルの作成
3. レプリケーションコマンドの実行
4. レプリケーション先での確認

1. iniファイルの作成

vbrの設定ファイル(iniファイル)を作成します。
当ファイルはテンプレートが用意されており、Verticaノード上の/opt/vertica/share/vbr/example_configsディレクトリに保存されています。
当ファイルをコピーして、viエディタなどのテキストエディタで編集します。
以下の例では、iniファイルの保存場所を/tmp/rep/replication.iniとします。
なお、テンプレートではオプションの説明などが英語で記載されていますが、和訳したものを以下に記載しています。

以下の例では、2つのテーブル「public.customer, public.part」をレプリケーションする記述になっています。
※;(セミコロン)で始まる行はコメントアウトされています。

; このサンプルのvbrコンフィグレーションファイルは、vbrタスクのレプリケーション用のものです。
; 各セクションの先頭には、[]括弧で囲んでいます。
; コメントは、;(セミコロン記号)または#(シャープ記号)で行います。
; =(イコール記号)は、パラメータと設定値を結びます。
; ‘!!Mandatory!!’ と記載された箇所は設定が必須な箇所です。
; All commented parameters are set to their default value.

; ——————————————- ;
;;; BASIC PARAMETERS ;;;
; ——————————————- ;

[Mapping]
; [Mapping]セクションには、データベースクラスタ内のすべてのノードを記述します。
; !!Mandatory!! レプリケーション先となるターゲットのホスト名を記述します。
v_ssbm_node0001 = host01-dev

[Misc]
; !!Recommended!! SnapshotNameを記述します。.
; SnapshotName は、監視やトラブルシュートの際に役立ちます。
; 有効な文字: a-z A-Z 0-9 – _
snapshotName = backup_snapshot


; コピーするテーブルまたはスキーマを指定します。
; テーブルを指定する場合、スキーマを省略するとデフォルトスキーマとしてpublicが使われます。
; オブジェクトをレプリケーションするには、objects または includeObjects を指定しなければなりません。
; 複数のオブジェクトをリストするには、,(カンマ)で区切ります。
objects = public.customer, public.part

; レプリケートするオブジェクトをセットで指定する場合、ワイルドカードが使えます。
; 注意: ‘includeObjects’ と ‘objects’は互換性がありません。
; includeObjects = public.mytable, customer*, s?

; レプリケートするオブジェクトのセットから除外する場合、ワイルドカードが使えます。
; 注意: ‘excludeObjects’ は ‘objects’ と互換性がありません。
; excludeObjects = public.*temp, etl.phase?

; スキーマやテーブルをコピーする際、オブジェクトが同一名の場合に、どのようにVerticaにハンドリングさせるかを指定します。
; objectRestoreMode = 上書きします
; create = エラーになり、処理をスキップします
; coexist = __という名前でレプリケーションします
objectRestoreMode = createOrReplace

[Database]
; !!Recommended!! ソース側のVerticaクラスタに複数のデータベースが定義されている場合は、このパラメータを使用してレプリケートするデータベースを指定します。
dbName = ssbm

; パスワードプロンプトの指定をします。
; TRUE : 対話式にパスワードを入力する
; FALSE : パスワードファイルに記載されたパスワードを使用する
; [Misc]セクションにある’passwordFile’パラメータにパスワードファイルの保存場所を指定します。
dbPromptForPassword = True

; !!Mandatory!! これらの設定はすべて必須項目です。
; dest_dbNameは、レプリケーション先のデータベース名を指定します。
; dest_dbUserは、レプリケーション先のデータベース管理者のユーザ名を指定します。
; dest_dbPromptForPasswordは、レプリケーション先のパスワードプロンプトの設定をします。
; Falseに設定した場合は、[Misc]セクションにあるパスワードファイルを参照します。

dest_dbName = ssbm
dest_dbUser = dbadmin
dest_dbPromptForPassword = True

; ——————————————- ;
;;; ADVANCED PARAMETERS ;;;
; ——————————————- ;

[Misc]
; すべてのデータベースのホスト上の一時ディレクトリ場所を指定します。
; ディレクトリは、dbadminユーザが読み書きできる権限が必要です。
; また、POSIXスタイルのfcntl lockfロックが実装されている必要があります。
; tempDir = /tmp/vbr

; エラーが発生した場合に、何回リトライをさせるかを指定します。
; retryCount = 2

; リトライを試行する際の間隔を秒指定します。
; retryDelay = 1

; パスワードが記載されたパスワードファイルの場所をフルパスで記述します。
; パスワードファイルは、dbadminだけが読み取れるディレクトリに格納します。
passwordFile = /tmp/rep/vbr.pass

; バックアップやレプリケーション、COPYCLUSTERを実行する際、現在のEPOCHとバックアップEPOCHとの間の最大許容差(秒単位)を指定します。
; 現在のEPOCHとバックアップEPOCHの間の時間がこのパラメータで指定された値を超えると、Verticaはエラーメッセージを表示します。
; SnapshotEpochLagFailureThreshold = 3600

[Transmission]
; rsyncプロトコルのデフォルトのポート番号を指定します。
; port_rsync = 50000

; すべてのバックアップ接続の総帯域幅制限をKBPSで指定します。
; 無制限の場合は 0 を指定します。
; Verticaはこの帯域幅を concurrency_backup で設定された接続数で均等に分配します。
; total_bwlimit_backup = 0

; ノードあたりのrsyncのTCP接続スレッドについて、レプリケーションのための最大数を指定します。
; 最適な設定は、お使いの環境によって異なります。
; ベストパフォーマンスを得るには、2~16の値を試してください。
; concurrency_backup = 1

; ノードあたりのrsyncのTCP接続スレッドについて、リストアのための最大数を指定します。
; 環境によって異なりますが、2~16の値が有用な場合があります。
; concurrency_restore = 1

[Database]
; vbrがデータベースに接続する際のVerticaユーザの名前を指定します。
; 通常、dbUserはデータベース管理者と同じであるため、ほとんどの場合は必要ありません。
; dbUser = current_username

2. パスワードファイルの作成

上記のiniファイルとは別にレプリケーション元とレプリケーション先のデータベース管理者ユーザのパスワードを記載したパスワードファイルの作成も必要です。
記述例を以下に記載します。
保存する場所とファイル名については、iniファイル内の設定と同一にします。
今回は、/tmp/rep/vbr.passとします。

[Passwords]
; レプリケーション元の管理ユーザのパスワード
dbPassword = ssbm

; レプリケーション先の管理ユーザのパスワード
dest_dbPassword = ssbm

3. レプリケーションコマンドの実行

レプリケーションを実行するには、以下のコマンドを実行します。
以下の例で指定しているiniファイルのパスは任意の場所で構いません。


4. レプリケーション先での確認

レプリケーション元とレプリケーション先のデータベースで、正常にレプリケーションされたことを確認します。
ここでは、両者のテーブルが同一の件数であることを確認します。

レプリケーション元での件数確認


レプリケーション先での件数確認


関連情報

Verticaデータベースのコピー
特定テーブルのデータを別環境のVerticaに直接コピーする方法
Replicating Tables and Schemas to an Alternate Database

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。