Pivotal Knowledge Base

フォローする

異なるセグメントマップ(content、dbid)をもつシステムへのバックアップのリストア

問題

Cluster-A でバックアップを取得し、それを Cluster-B でリストアする必要があるものとする。双方のクラスターともにセグメント数は同じだが、セグメントマップ(content、dbid)が異なるものとする。

解決策

GPDB のデータは、分散キーハッシュ値とセグメントの content ID を元に、セグメントに格納されている。例えば、分散キーハッシュ値が "0" である行は、必ずクラスターの一意の content X を元に格納される。これは、同一セグメント数の全てのクラスターにあてはまる。

これは、セグメント数が同一の二つのクラスターがあった場合、分散キーハッシュ値が共通の行に対しては共通のデータストレージセグメントと content を有することを意味する。したがって、セグメント間のデータ転送は、プライマリーセグメントの content ID に応じて実行する必要がある(ミラーはプライマリーの content ID 値に応じて一意に決定される)。

バックアップはセグメント単位で順番に実施され、以下のようにファイルが生成される。

  • 特定セグメントのデータディレクトリ配下に生成される。
  • ファイル名にセグメントの DBID(content ID ではない)を含む。例えば、gp_dump_0_2_20150612091645.gz といったファイル名の場合、最初の "0" は 'セグメントバックアップファイル' であることを意味し(対照的に、マスターバックアップファイルの場合は、この箇所は "1" となる)、その次の "2" はセグメントの dbid を意味する。

したがって、他のクラスターにリストアを行うための準備として、以下の対応が完了している必要がある。

  • バックアップ元クラスターの特定 dbid に対する content id を識別する(注意:プライマリーセグメントの dbid は、バックアップ実行時に決定される。これが、生成されたバックアップファイルにおける dbid となる)。
lpetrov=# select content from gp_segment_configuration where dbid = 2;
 content 
---------
       0
(1 row)
 
  • リストア先の新クラスターで、上述の手順で確認した content id と一致するプライマリーセグメントの dbid を確認する。
lpetrov=# select dbid from gp_segment_configuration where content = 0 and role = 'p';
 content 
---------
       5
(1 row)
 
  • リストア先の新クラスターで、上述の手順で確認した dbid に対するセグメントデータディレクトリーの場所を確認する(content は一致しているはずである)。
lpetrov=# select
    hostname,
    f.fselocation,
    fs.fsname
from
    gp_segment_configuration s
    join pg_filespace_entry f on s.dbid = f.fsedbid
    join pg_filespace fs on fs.oid = f.fsefsoid
where
    dbid = 5
and content = 0
and fsname = 'pg_system'; hostname | fselocation ------------+----------------------------------------- lpetrovmac | /Users/lpetrov/greenplum-db-data/gpseg0 (1 row)
  • バックアップファイル(この例では、"gp_dump_0_2_20150612091645.gz" とする)を、ファイル名を変更して(この例では、dbid を 2 から 5 へ変更し、"gp_dump_0_5_20150612091645.gz" とする)、新しいセグメント(この例では、lpetrovmac:/Users/lpetrov/greenplum-db-data/gpseg5 における db_dumps/<日付>/ directory 配下)に移動する。

以上の手順を、全てのダンプファイルに対して繰り返す。マスターダンプファイル(マスターはいつも dbid=1)はファイル名を変更する必要がなく、単に新しいマスターデータディレクトリー配下へ移動すれば良い。この方法は、リストア実行時にファイルが適切なセグメントにに配置されていることを保証する。

自動化手法

-- バックアップ元データベース(すなわち、バックアップを取得したクラスター)にて、以下のスクリプトを使用してセグメントの設定内容を取得する。

\t
\o /tmp/source.txt
SELECT dbid,content,hostname 
FROM gp_segment_configuration 
WHERE role='p' and content <> -1
ORDER BY content;
\o

-- リストア先データベース(すなわち、リストアを実行するクラスター)にて、以下のスクリプトを使用してセグメントの設定内容を取得する。

\t
\o /tmp/target.txt
SELECT dbid,content,hostname,fselocation
FROM gp_segment_configuration c , pg_filespace_entry f , pg_database d, pg_tablespace t
WHERE c.role='p'
AND c.content <> -1
AND f.fsedbid=c.dbid
AND f.fsefsoid=t.spcfsoid
AND d.dattablespace=t.oid
AND d.datname=current_database()
ORDER BY content; \o

-- バックアップ元セグメントの設定ファイルを、リストア先ホストにコピーする。

-- マッピングスクリプトを生成するため、以下のステートメントを実行する。

注意 : 実行前に環境変数の変更が必要となる。

変更対象となる環境変数は以下である。

  • prefix -> ダンプファイル名の先頭部分(多くの場合、この値は不変である)
  • suffix -> バックアップファイルが(gzip)で圧縮されている場合はそのままで、それ以外は変数設定行をコメントアウトする
  • location -> リストア先サーバーのダンプファイルの格納箇所
  • timestamp_key -> リストアしようとするダンプファイルのタイムスタンプキー

必要な変更を実施した後、以下のスクリプトをリストア先ホストで実行する。

export prefix=gp_dump_0_
export suffix=.gz
export location=< location of the dump eg.s /tmp >
export timestamp_key=< backup dump timestamp eg.s 201508100000 >

paste /tmp/source.txt /tmp/target.txt | while read line
do
s_dbid=`echo $line| awk '{print $1}'`
t_dbid=`echo $line| awk '{print $6}'`
s_content=`echo $line| awk '{print $3}'`
t_content=`echo $line| awk '{print $8}'`
t_hostname=`echo $line| awk '{print $10}'`
#t_location=`echo $line| awk '{print $12}'` #if in segment default directory

if [ "$s_dbid" == "$t_dbid" ] && [ "$s_content" == "$t_content" ]
then
echo "# The Source / target contents : " $s_content "/" $t_content " dbids are same " $s_dbid "/" $t_dbid ", skipping .... "
else
echo "ssh " $t_hostname " \" mv" $location"/"${prefix}${s_dbid}"_"${timestamp_key}${suffix} $location"/"${prefix}${t_dbid}"_"${timestamp_key}${suffix} "\""
fi
done > /tmp/segment_mapping.sh

-- 生成された以下のマッピングスクリプトファイルを開き、全てが正しく設定されることを確認、一度だけ当該スクリプトを実行する。

/bin/sh /tmp/segment_mapping.sh

コメント

Powered by Zendesk