人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PostgreSQLのレプリケーション時のCURRENT_TIMESTAMPの挙動について教えてください。

http://www.kunitake.org/chalow/2008-09-11-1.html
上の記事によると、MySQLではnow()はレプリケーションセーフであるがsysdate()はレプリケーションセーフでないと書かれてします。

PostgreSQLではどうなのでしょうか?
知りたいのは、now()やCURRENT_TIMESTAMPが、マスタとレプリケーションで必ず同じ値になるかどうかです。
よろしくお願いします。

●質問者: DQNEO
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● y-kawaz
●100ポイント ベストアンサー

同じ値になるという理解で合ってると思います。
PostgreSQLのレプリケーションはSQLより低レベルなWALと呼ばれる書き込みログベースでのレプリケーションなので異なったデータが入ることは無いはずです。

SQLのクエリレベルでのレプリケーションだとスレーブ側で評価が行われて値が異なってしまう危険性がありますが、PostgreSQLのレプリケーションではnow()やCURRENT_TIMESTAMPの値解決はマスタ側で行われて、その結果の静的な値が書き込まれるというログがレプリケーションされ、スレーブ側でその書き込みログを再生してデータ同期するイメージです。

http://www.postgresql.jp/document/current/html/wal.html


DQNEOさんのコメント
ありがとうございます! ですが、マニュアルのそのページを見ただけでは、そこまでは書いてないように思えたのですが・・私の読み方が浅かったのでしょうか。

DQNEOさんのコメント
http://www.postgresql.jp/document/current/html/different-replication-solutions.html このページを見ると、pgpool2では「random()関数による乱数値とCURRENT_TIMESTAMP関数による現在時刻およびシーケンス値が、サーバごとに異なることがあります」と書いてました。 しかし、pgpool2以外ではCURRENT_TIMESTAMPは同値になるとは書いてないので、不安がぬぐえません。。

y-kawazさんのコメント
pgpoolはクエリベースのレプリケーションなのでそういう問題があります。 僕の回答は最新のPostgreSQL9.1で使える公式のレプリケーション機能を使った場合の話です。これはWALベースなので回答の通り心配は無用です。 元々PostgreSQLにはレプリケーション機能は無く、pgpool、pgcluster、slony等色々なレプリケーションを実現するためのソフトが開発されてきましたが、9.0から公式で登場したのがWALを使ったレプリケーションです。 9.0ではホットスタンバイ構成しかできませんでしたが、9.1では更に同期レプリケーションが出来るようになっています。

y-kawazさんのコメント
そのURLにもある通り色々な特徴を持ったレプリケーションがあるので、逆に何を重視するかでレプリケーション手段を決める方向で決めましょう。 一概に「PostgreSQLのレプリケーションでは」とは語れないのです。僕の回答はあくまでPostgreSQL本体で実装されたストリーミングレプリケーションの場合の話になります。 例えば以下のようにpgpoolとストリーミングレプリケーションを組み合わせると言ったやり方もあります。 http://lets.postgresql.jp/documents/technical/pgpool/3 ストリーミングレプリケーションは公式実装で信頼性が高く参照系の分散が出来るというメリットがありますが、参照系クエリの分散自体はアプリケーション側で行わなければいけない不便さもあります。そこで間にpgpoolを挟むことで更新系はマスタに集中させつつ参照系クエリは分散させるといったことをアプリケーションからは意識せずに使えるようにした構成例です。ここでのpgpoolの使い方は参照系の分散のために使っているのみで更新系クエリのレプリケーションには使ってないのでデータ不一致のような問題も回避してるんだと思います。

y-kawazさんのコメント
すみません↑に張ったURLは9.0のホットスタンバイ用の構築例なので9.1で同じpgpoolの設定すると問題ある可能性があります。手順はpgpoolの最新のドキュメントなどにあたって下さい。

DQNEOさんのコメント
ご丁寧にありがとうございます。 WALベースだとTimeStampが同値になるかという点について、マニュアルのどこを見ても明示的には書かれていなかったのですが、もしかして常識(もしくは、WALの仕組みからして当然のことと帰結される)なのでしょうか。。。 だとしたら私の勉強不足ですね。

DQNEOさんのコメント
たしかに、もしWALのtimestampがログ読み取り時に評価されるとしたら、クラッシュ後のリカバリしたときにtimestampがリカバリ時の時間になってしまい、リカバリにならないですね。 よってWALには時間の直値がかかれてある、としか考えようがないですね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ