概要
8.5~予定。本体内蔵。Slave側で参照クエリ実行可能。
- stream replicatoin: replicationを実現する。
- hot standby: Slave側で参照クエリを実行可能にする。 replicationが本体にない=mysqlに対する大きなディスアドバンテージだった。
- もともの方針: replicationの要件は色々すぎて満たしきれない→本体に入れない方針
- これからの方針: シンプルなものを本体に入れておく ※本体同梱はシンプルなものなので、んまり高機能ではない!
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
- [Master]archive modeにする@postgresql.conf
- 普通に設定する
- 例:
archive_mode = on
- 例:
archive_command = 'cp %P ../archive_master/%f'
- [Master]wal転送設定をする@postgresql.conf
max_wal_sender
listen_address
- [Master]認証設定@pg_hba.conf
- 例:
host replication postgres 192.168.0.99/32 trust
- [Master]起動
- [Master]オンラインバックアップ取得
pg_start_backup
でバックアップモード開始cp
コマンドでデータをコピー ←コレがSlave用データベースクラスタの元データpg_stop_backup
でバックアップモード終了- [Slave]archive mode用の設定をする@postgresql.conf ※failoverしたらSlaveがMasterになるので、Slaveも普通に設定する
- 例:
archive_mode = on
- 例:
archive_command = 'cp %P ../archive_slave/%f'
- [Slave]wal転送設定をする@postgresql.conf ※failoverしたらSlaveがMasterになるので、Slaveも普通に設定する
max_wal_sender
listen_address
- [Slave]Slaveとして機能させる@recovery.conf
standby_mode='on'
primary_conninfo = 'host=192.168.0.99 port=5432 user=postgres
trigger_file=../trigger
- [Slave]起動
- ログに
starting streaming recovery at ...
と出力 wal_sender
やwal_receiver
が起動していればok
参考
See also
- #isucon チーム「ウー馬場ーイー222」でISUCON13本選に参加し30位になりました
- 「SRE≠インフラなんだけどもう誤解されちゃってるから、DevOps新実装としてSite Production Engineeringはいかがでしょう?」でJAWS DAYS 2022に登壇しました #jawsdays #jawsug
- #isucon チーム「シン・ウー馬場ーイー2」でISUCON12本選に進出し12位になりました
- #isucon チーム「シン・ウー馬場ーイー2」でISUCON12予選に参加し2位で予選突破しました
- 「非ITの事業会社にSREと言わずにSREを持ち込んだ」SRE NEXT 2022で登壇しました #srenext