1 / 6 2010/11/01 21:58 構 成 構 成 ユーザ ディレクトリ ネットワーク スクリプト 1. セットアップ 1-1. DBクラスタの 作 成 1-2. マスタのパラメータ 設 定 1-3. マスタの 認 証 設 定 1-4. マスタの 起 動 1-5. バックアップの 取 得 1-6. スタンバイのパラメータ 設 定 (postgresql.conf 編 ) 1-7. スタンバイのパラメータ 設 定 (recovery.conf 編 ) 1-8. フェイルオーバ 後 を 意 識 した 設 定 1-9. スタンバイの 起 動 2. レプリケーションの 使 用 2-1. レプリケーションのお 試 し 2-2. 進 捗 の 確 認 2-3. スタンバイの 停 止 と 再 起 動 2-4. フェイルオーバ 2-5. 再 組 み 込 み 3. 注 意 が 必 要 な 挙 動 3-1. リカバリと SQL の 競 合 の 確 認 3-2. 競 合 によるリカバリの 遅 れを 確 認 ユーザ postgres ユーザにスイッチ $ su - postgres パスワード: postgres ディレクトリ $HOME (/home/postgres) +-- master (マスタのDBクラスタ) +-- standby (スタンバイのDBクラスタ) +-- pgsql (9.0のインストール 先 ) $HOME/pgsql/bin は PATH に 登 録 済 同 一 マシン 上 にマスタとスタンバイをセットアップする ネットワーク ポート 番 号 はマスタが 5432 スタンバイが 9999 スクリプト setup_master_and_standby.sh マスタとスタンバイをセットアップするスクリプト monitor_postgres.sh postgres プロセスをリアルタイムに 表 示 し 続 けるスクリプト ターミナルを1つプロセス 表 示 用 に 割 り 当 て ずっと monitor_postgres.sh を 走 らせておくと 便 利 make_conflict.sh スタンバイでリカバリと SQL の 競 合 を 発 生 させるスクリプト check_progress.sh レプリケーションの 進 捗 を 表 示 するスクリプト 1. セットアップ 1-1. DBクラスタの 作 成 マスタのDBクラスタを 通 常 PostgreSQL を 使 う 場 合 と 同 様 に initdb で 作 成 $ initdb -D master --no-locale
2 / 6 2010/11/01 21:58 1-2. マスタのパラメータ 設 定 PostgreSQL をマスタとして 稼 働 させるための 設 定 を postgresql.conf に 行 う $ $EDITOR master/postgresql.conf listen_addresses = '127.0.0.1' スタンバイからの 接 続 をマスタが 受 け 付 けられるように 待 ち 受 けのアドレスを 指 定 今 回 は 127.0.0.1 を 設 定 しておく 同 一 マシン 上 でマスタとスタンバイを 動 作 させ それらを Unix ドメイン 経 由 で 通 信 させるのであれば listen_addresses の 設 定 は 不 要 wal_level = hot_standby レプリケーション 中 にスタンバイで SQL を 実 行 するには wal_level を hot_standby に 設 定 する 必 要 がある max_wal_senders = 4 マスタが 受 け 付 けるスタンバイの 最 大 数 を 設 定 スタンバイ1 台 しかセットアップしないが 4 と 設 定 しておく 無 駄 に 大 きな 値 を 設 定 すると 共 有 メモリが 若 干 無 駄 に 消 費 wal_keep_segments = 16 レプリケーション 用 に 少 なくとも 何 個 マスタに WAL ファイルを 残 すかを 設 定 マスタはチェックポイントごとに 古 い WAL ファイルを 削 除 するため スタンバイが 必 要 とする WAL ファイルが 転 送 される 前 にマスタから 削 除 されてしまう 可 能 性 がある スタンバイが 必 要 とする WAL ファイルがマスタにないと レプリケーションは 開 始 できない この 問 題 を 回 避 するために 今 回 は 少 なくとも 16 個 は WAL ファイルを 残 すように 設 定 しておく (チェックポイントが 古 い WAL ファイルを 削 除 しようとしたときに もし 削 除 後 の WAL ファイル 数 が 16 個 未 満 ならば 削 除 をスキップ) log_line_prefix = '[master] ' 今 回 は サーバログがマスタとスタンバイのどちらのものかすぐに 分 かるように log_line_prefix を 設 定 しておく このパラメータの 設 定 は 必 須 ではない 1-3. マスタの 認 証 設 定 マスタがスタンバイを 認 証 するための 設 定 を pg_hba.conf に 行 う $ $EDITOR master/pg_hba.conf host replication postgres 127.0.0.1/32 trust アドレス 127.0.0.1 からユーザ postgres としてレプリケーション 目 的 に 接 続 してくるサーバを 許 可 する 設 定 を 追 加 レプリケーションのための 認 証 情 報 を 記 述 するには pg_hba.conf の2 列 目 (database 列 ) に replication と 記 述 する 必 要 がある replication という 名 前 のデータベースへの 認 証 を 設 定 するときは "replication" とダブルクォートを 付 与 1-4. マスタの 起 動 マスタで PostgreSQL を 通 常 と 同 じように 起 動 $ pg_ctl -D master start 1-5. バックアップの 取 得 スタンバイのセットアップ 用 に マスタからバックアップを 取 得 して それをスタンバイのDBクラスタにする バックアップを 開 始 $ psql -c "SELECT pg_start_backup('test', true)" 第 一 引 数 のラベルは 通 常 PostgreSQL を 使 用 する 場 合 と 同 じように どのような 文 字 列 でもOK 第 二 引 数 のフラグは pg_start_backup が 内 部 的 に 実 行 する CHECKPOINT を 全 力 で 短 期 間 に 終 わらせるか 他 処 理 に 影 響 を 与 えないようにゆっくりと 時 間 をかけて 行 う かを 指 定 する 実 運 用 時 であれば 他 処 理 に 影 響 を 与 えないように false を 設 定 (もしくはデフォルト 値 が false なので 第 二 引 数 を 省 く) 今 回 のハンズオンでは pg_start_backup に 時 間 をかけてられないので true を 設 定 して 短 時 間 で 終 わらせる 8.4 以 前 では archive_mode = off とアーカイブが 設 定 されていないと pg_start_backup は 実 行 できなかった 9.0 以 降 ではアーカイブが 未 設 定 でも max_wal_senders が 0 以 上 ならば 実 行 可 能 マスタのDBクラスタをバックアップして それをスタンバイのDBクラスタとする $ cp -r master standby バックアップを 完 了 $ psql -c "SELECT pg_stop_backup()" archive_mode = off で pg_stop_backup を 実 行 すると 以 下 の NOTICE メッセージが 出 力 されるが 気 にする 必 要 はない NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup 1-6. スタンバイのパラメータ 設 定 (postgresql.conf 編 ) PostgreSQL をスタンバイとして 稼 働 させるための 設 定 を postgresql.conf に 行 う $ $EDITOR standby/postgresql.conf port = 9999 スタンバイのポート 番 号 を 9999 に 変 更
3 / 6 2010/11/01 21:58 マスタとスタンバイを 別 マシンで 動 作 させ それぞれで 同 じポート 番 号 を 使 いたい 場 合 は port を 変 更 する 必 要 はない 今 回 は 同 一 マシン 上 でマスタとスタンバイを 動 作 させるため それぞれに 同 じポート 番 号 を 使 用 できず スタンバイだけ 9999 に 変 更 する hot_standby = on レプリケーション 中 にスタンバイで SQL の 実 行 を 許 可 するかどうかを 指 定 するパラメータ スタンバイで SQL を 実 行 したい 場 合 は on に 設 定 する 必 要 がある 今 回 は SQL を 実 行 するので on に 設 定 整 理 すると スタンバイでレプリケーション 中 に SQL を 実 行 したい 場 合 は マスタ 側 で wal_level = hot_standby スタンバイ 側 で hot_standby = on と 設 定 する 必 要 がある log_line_prefix = '[standby] ' 今 回 は サーバログがマスタとスタンバイのどちらのものかすぐに 分 かるように log_line_prefix を 設 定 しておく このパラメータの 設 定 は 必 須 ではない 1-7. スタンバイのパラメータ 設 定 (recovery.conf 編 ) PostgreSQL をスタンバイとして 稼 働 させるための 設 定 を recovery.conf に 行 う $ $EDITOR standby/recovery.conf recovery.conf は 設 定 値 を 必 ずシングルクォートで 囲 む 必 要 があるため 注 意 standby_mode = 'on' PostgreSQL をスタンバイとして 稼 働 させたい 場 合 は standby_mode を on に 設 定 primary_conninfo = 'host=127.0.0.1 port=5432 user=postgres' スタンバイがマスタに 接 続 するための 情 報 を 設 定 PQconnectdb 等 の libpq 関 数 に 接 続 情 報 を 与 えるのと 同 じ 形 式 で 情 報 は 指 定 今 回 はアドレス 127.0.0.1 ポート 番 号 5432 で 稼 働 するマスタに ユーザ postgres としてスタンバイを 接 続 させる 設 定 trigger_file = '../trigger' フェイルオーバ 時 にスタンバイをマスタに 切 り 替 えるのに 使 用 するトリガファイルのパスを 指 定 このパスにトリガファイルを touch コマンド 等 で 作 成 すると そのファイルの 存 在 をスタンバイが 検 知 してマスタに 切 り 替 わる カレントディレクトリはDBクラスタなので その 一 つ 上 (..) つまり $HOME 直 下 に 今 回 はトリガファイル trigger を 設 定 なお トリガファイルの 名 前 は 何 でもよい 1-8. フェイルオーバ 後 を 意 識 した 設 定 フェイルオーバによってスタンバイがマスタになった 後 のことまで 考 えて pg_hba.conf 等 を 設 定 すべき 今 回 は 不 要 のため 割 愛 1-9. スタンバイの 起 動 同 一 マシン 上 で 複 数 インスタンスを 起 動 するための 処 置 $ rm -f standby/postmaster.pid 別 マシン 上 でマスタとスタンバイを 構 築 する 場 合 は 不 要 スタンバイのPostgreSQLの 起 動 $ pg_ctl -D standby start レプリケーションの 成 功 の 確 認 以 下 のログが 出 力 されていることを 確 認 マスタへの 接 続 が 成 功 したとことを 示 すスタンバイ 側 のログメッセージ [standby] LOG: streaming replication successfully connected to primary スタンバイで SQL を 受 け 付 けられるようになったことを 示 すログメッセージ [standby] LOG: database system is ready to accept read only connections レプリケーション 用 のプロセス (wal sender と wal receiver) が 起 動 されていることを 確 認 walsender はマスタ 側 のプロセスで WAL のスタンバイ (walreceiver) への 送 信 を 担 当 walreceiver はスタンバイ 側 のプロセスで WAL のマスタ (walsender) からの 受 信 を 担 当 2. レプリケーションの 使 用 2-1. レプリケーションのお 試 し データベースが 複 製 されることを 確 認 マスタの SQL 結 果 がスタンバイに 複 製 されることの 確 認 $ psql -p5432 =# CREATE TABLE tbl (id int); =# INSERT INTO tbl VALUES (1), (2); データを2 件 INSERT =# SELECT * FROM tbl; tblテーブルにデータが2 件 あることを 確 認 =# \d テーブル 一 覧 でtblテーブルがあることを 確 認 =# SELECT * FROM tbl; tblテーブルにデータが2 件 あることを 確 認
4 / 6 2010/11/01 21:58 更 新 SQLがスタンバイで 失 敗 することの 確 認 =# INSERT INTO tbl VALUES (3); ERROR: cannot execute INSERT in a read-only transaction スタンバイで pg_dump のバックアップを 取 得 できることの 確 認 $ pg_dump -p9999 -t tbl テーブル tbl に 関 係 するものだけダンプ ダンプ 結 果 に tbl テーブルの 作 成 と データ2 件 の COPY があることを 確 認 2-2. 進 捗 の 確 認 ps の 結 果 からレプリケーションの 進 捗 を 確 認 grep streaming 12505 postgres: wal receiver process streaming 0/2066C08 12506 postgres: wal sender process postgres 127.0.0.1(42152) streaming 0/2066C08 streaming XXX/XXX が 進 捗 を 表 す XXX/XXX は LSN (Log Sequence Number) と 呼 ばれる 値 で WAL の 位 置 を 示 す wal sender の LSN は どこまでマスタが WAL を 送 信 したかを 示 す wal receiver の LSN は どこまでスタンバイが WAL を 受 信 したかを 示 す 関 数 で 進 捗 を 確 認 以 下 の 操 作 が 面 倒 な 場 合 は check_progress.sh を 実 行 すること マスタがどこまで WAL を 書 き 込 んだか? $ psql -p5432 =# SELECT pg_current_xlog_location(); スタンバイがどこまで WAL を 受 信 したか? リカバリしたか? =# SELECT pg_last_xlog_receive_location(); =# SELECT pg_last_xlog_replay_location(); 2-3. スタンバイの 停 止 と 再 起 動 スタンバイをスマート シャットダウンできることを 確 認 8.4 以 前 の warm-standby 構 成 では スマート シャットダウンではスタンバイは 停 止 しない スタンバイへの 接 続 スタンバイの 停 止 ###### Terminal 2 ###### 上 記 psql とは 別 ターミナルから 以 下 を 実 施 $ pg_ctl -D standby -m s stop pg_ctl によるシャットダウンのデフォルトはスマート シャットダウンなので -m s の 付 与 は 冗 長 スタンバイへの 接 続 の 終 了 通 常 時 のスマート シャットダウンと 同 様 に 接 続 がすべて 切 断 されるまで PostgreSQL は 停 止 されない スタンバイ 停 止 時 に 以 下 の FATAL メッセージが 出 力 されるが これは 停 止 操 作 によって walreceiver プロセスが 終 了 したことを 示 すもので 気 にする 必 要 はない [standby] FATAL: terminating walreceiver process due to administrator command スタンバイの 起 動 $ pg_ctl -D standby start どの 位 置 からレプリケーションを 再 開 すればよいかスタンバイは 情 報 を 持 っているため 再 起 動 するだけで 自 動 的 に 前 回 の 続 きからレプリケーションが 再 開 される レプリケーションの 成 功 の 確 認 以 下 のログが 出 力 されていることを 確 認 [standby] LOG: streaming replication successfully connected to primary [standby] LOG: database system is ready to accept read only connections レプリケーション 用 のプロセス (wal sender と wal receiver) が 起 動 されていることを 確 認
5 / 6 2010/11/01 21:58 2-4. フェイルオーバ マスタを 停 止 して フェイルオーバ $ pg_ctl -D master stop $ touch trigger 作 成 したトリガファイルは 切 替 時 に PostgreSQL が 自 動 的 に 削 除 スタンバイがマスタに 切 り 替 わったことを 以 下 のサーバログが 出 ていることで 確 認 [standby] LOG: database system is ready to accept connections 新 しいマスタに 接 続 して 更 新 SQLが 実 行 できることを 確 認 =# INSERT INTO tbl VALUES (3); =# SELECT * FROM tbl; tblテーブルにデータが3 件 あることを 確 認 2-5. 再 組 み 込 み 再 組 み 込 みのために 旧 マスタのDBクラスタを 削 除 $ rm -rf master バックアップの 取 得 $ psql -p 9999 -c "SELECT pg_start_backup('test', true)" $ cp -r standby master $ psql -p 9999 -c "SELECT pg_stop_backup()" 新 スタンバイ( 旧 マスタ)の postgresql.conf の 設 定 $ $EDITOR master/postgresql.conf port = 5432 hot_standby = on log_line_prefix = '[master] ' 新 スタンバイ( 旧 マスタ)の recovery.conf の 設 定 $ $EDITOR master/recovery.conf standby_mode = 'on' primary_conninfo = 'host=127.0.0.1 port=9999 user=postgres' trigger_file = '../trigger' 同 一 マシン 上 で 複 数 インスタンスを 起 動 するための 処 置 $ rm -f master/postmaster.pid 新 スタンバイ( 旧 マスタ)のPostgreSQLの 起 動 $ pg_ctl -D master start レプリケーションの 成 功 の 確 認 以 下 のログが 出 力 されていることを 確 認 [master] LOG: streaming replication successfully connected to primary [master] LOG: database system is ready to accept read only connections レプリケーション 用 のプロセス (wal sender と wal receiver) が 起 動 されていることを 確 認 3. 注 意 が 必 要 な 挙 動 マスタとスタンバイが 逆 転 していて 分 かりづらいので setup_master_and_standby.sh を 実 行 して 再 度 レプリケーション 環 境 をセットアップ $./setup_master_and_standby.sh 3-1. リカバリと SQL の 競 合 の 確 認 スタンバイで マスタから 転 送 された WAL のリカバリ 処 理 と SQL 処 理 が 競 合 することを 確 認 以 下 の 操 作 が 面 倒 な 場 合 は make_conflict.sh を 実 行 すること 初 期 データを 作 成 する
6 / 6 2010/11/01 21:58 $ psql -p5432 =# CREATE TABLE tbl (id int); =# INSERT INTO tbl VALUES (1), (2); データを2 件 INSERT 別 ターミナルから スタンバイでデータ2 件 を 参 照 する 処 理 時 間 の 長 い SQL を 実 行 ###### Terminal 2 ###### -c"select pg_sleep(3600) FROM tbl" テーブル tbl を 参 照 した 上 で 3600 秒 スリープする SQL 初 期 データを 作 成 したターミナルで データの 削 除 と VACUUM を 実 施 =# DELETE FROM tbl; =# VACUUM tbl; マスタの VACUUM の WAL がスタンバイに 転 送 されて スタンバイはリカバリでデータ2 件 を 完 全 に 削 除 しようとする しかし スタンバイの SELECT 文 はまだデータ2 件 を 参 照 する 可 能 性 があるため データの 削 除 を 待 たせる ps の 結 果 からリカバリが 競 合 で 処 理 を 待 たされていることを 確 認 startup process に waiting が 付 与 されており 競 合 の 発 生 を 示 す 30 秒 程 度 後 に ERROR が 発 生 して スタンバイで SQL がキャンセルされたことを 確 認 ERROR: canceling statement due to conflict with recovery DETAIL: User query might have needed to see row versions that must be removed. 3-2. 競 合 によるリカバリの 遅 れを 確 認 スタンバイの postgresql.conf で 競 合 する SQL をキャンセルしないように 設 定 $ $EDITOR standby/postgresql.conf max_standby_streaming_delay = -1 設 定 ファイルの 変 更 をスタンバイに 反 映 $ pg_ctl -D standby reload 競 合 を 発 生 させる $./make_conflict.sh スクリプトの 内 容 は 3-1 の 操 作 と 同 じ ps の 結 果 からリカバリが 競 合 で 処 理 を 待 たされていることを 確 認 startup process に waiting が 付 与 されており 競 合 の 発 生 を 示 す マスタで 更 新 SQLを 実 行 $ pgbench -p5432 -i マスタとスタンバイの 進 捗 を 表 示 させ スタンバイのリカバリ 位 置 だけ 遅 れていることを 確 認 $./check_progress.sh