pgcon09jに参加しました - streaming replication & hot standby

概要

8.5~予定。本体内蔵。Slave側で参照クエリ実行可能。

  • stream replicatoin: replicationを実現する。
  • hot standby: Slave側で参照クエリを実行可能にする。 replicationが本体にない=mysqlに対する大きなディスアドバンテージだった。
  1. もともの方針: replicationの要件は色々すぎて満たしきれない→本体に入れない方針
  2. これからの方針: シンプルなものを本体に入れておく ※本体同梱はシンプルなものなので、んまり高機能ではない!

replication

特徴

  • record base log shipping = WAL転送 = Slaveはリカバリモードで動作 ※いままではリカバリモードではクエリ実行できなかったが、hot standbyでできるようになる
  • shared nothing
  • 同期モードは4つ
  • async: DRBDのA相当。非同期。MySQLのreplicationと同じ。性能劣化がほとんどない。
  • recv: DRBDのB相当。MasterのDiskとSlaveのMemoryにWAL転送済みを保証。割とバランスがとれている。
  • fsync: DRBDのC相当。MasterのDiskとSlaveのDiskにWAL転送済みを保証。性能劣化が激しいが信頼性は高い。
  • apply: Slave側でのCommitまで保証。完全同期。
  • お勧め: Masterのfsyncを切ってrecvで稼働させる などなど
  • クラスタリング的な機能はない
  • heartbeatなどと組み合わせてなんとかしてください

restriction

architecture

  • アーキテクチャが同じでないといけない(32bit/64bit)
  • メジャーバージョンが同じでないといけない(8.x/9.x) function
  • テーブルごとのレプリケーション要否は指定できない。
  • WALに書かれないデータは複製されない
  • サーバログ
  • 統計情報
  • 設定情報
  • など

Hot Standby

  • slaveでもコマンド実行できるようになる
  • select
  • set
  • load
  • commit / rollback
  • などなど 特徴
  • オーバーヘッドが小さい
  • CPUで2%くらい
  • Master/SlaveのConflictを避けるために、実行できるコマンドを制限している
  • insert, delete, create table
  • 2phase commit
  • transaction control command(select for share....)
  • シーケンス操作
  • drop
  • などなど

demo

[Master] 192.168.0.99:5432 / [Slave] 192.168.0.99:9999

  1. [Master]archive modeにする@postgresql.conf
  • 普通に設定する
  • 例: archive_mode = on
  • 例: archive_command = 'cp %P ../archive_master/%f'
  1. [Master]wal転送設定をする@postgresql.conf
  • max_wal_sender
  • listen_address
  1. [Master]認証設定@pg_hba.conf
  • 例: host replication postgres 192.168.0.99/32 trust
  1. [Master]起動
  2. [Master]オンラインバックアップ取得
  3. pg_start_backupでバックアップモード開始
  4. cpコマンドでデータをコピー ←コレがSlave用データベースクラスタの元データ
  5. pg_stop_backupでバックアップモード終了
  6. [Slave]archive mode用の設定をする@postgresql.conf ※failoverしたらSlaveがMasterになるので、Slaveも普通に設定する
  • 例: archive_mode = on
  • 例: archive_command = 'cp %P ../archive_slave/%f'
  1. [Slave]wal転送設定をする@postgresql.conf ※failoverしたらSlaveがMasterになるので、Slaveも普通に設定する
  • max_wal_sender
  • listen_address
  1. [Slave]Slaveとして機能させる@recovery.conf
  • standby_mode='on'
  • primary_conninfo = 'host=192.168.0.99 port=5432 user=postgres
  • trigger_file=../trigger
  1. [Slave]起動
  • ログにstarting streaming recovery at ...と出力
  • wal_senderwal_receiverが起動していればok

参考

Event 

See also