レプリケーションも、つまるところpg_basebackupで一気にコピーしてしまうだけなので、むしろdump, restoreより楽まであるよ
Conversation
Notices
-
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 10:43:18 JST のえる -
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 10:55:00 JST のえる データベースでかくなると、pg_basebackupが終わる前にどんどん新しい更新が溜まっていって、あとからではWAL転送が追いつかなくなってしまうことがあるので、同時にWALもストリーミング受信して、完了時に追いついているようにする。(そういうオプションがある)
完了したら直ちに起動したいので、そこまで一気に実行するようにコマンド書く。
レプリケーションはじまってしまえば、あとは落ち着いていつでも元をとめて、新環境をpromoteできる。
sublimer@鯖缶 repeated this. -
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 11:13:55 JST のえる 元のサーバでやること
・外からつながるようにインタフェースをlistenする(そのままだとlocalhostしかlistenしてない)
・replication_user作る(名前は別になんでもいい)
・pg_hba.confで、新鯖からのreplication_userでの接続を許可する
・その他のレプリケーション設定パラメータを足す(wal_level = replicaなど)
・ファイアーウォールでも接続許可する
sublimer@鯖缶 repeated this. -
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 11:21:23 JST のえる 新規のサーバでやること
・一旦データベース初期設定して、整えとく。停止状態。
・データは消しちゃう(rm -fr /var/lib/postgresql/14/main みたいな)
・元サーバのpgtune.confなど、パラメータをある程度一致させとく(コネクション数とか元と違うと蹴られたり)
・もちろんpg_hba.confなどセキュリティ設定は済ませておく
・とりあえずpsqlコマンドでreplication_userで繋がるか事前にテスト
・pg_basebackupで一気に持ってくる
・起動
・レプリケーションできてることを確認する
・(元のサーバに新規書き込みするのやめて、転送しきったら元DB止める)
・promoteする(昇格してこっちが本体になる)
・新規DBサーバへの読み書きを開始する
sublimer@鯖缶 repeated this. -
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 11:25:24 JST のえる pg_basebackupはこんな感じ。
# sudo -u postgres pg_basebackup -h xxx.xxx.xxx.xxx -p 5432 -D /var/lib/postgresql/14/main/ -U replication_user -R -P --checkpoint=fast -X stream -v && pg_ctlcluster 14 main start
xxx.xxx.xxx.xxxは元サーバのIPアドレス。ポートも指定してるけど、5432ならいらないかな。
rootになって、pg_basebackupから、完了後のstartまで一気にやる。これはUbuntu / Debian系ね。
sublimer@鯖缶 repeated this. -
村上さん (aureoleark@misskey.io)'s status on Saturday, 30-Apr-2022 11:29:54 JST 村上さん @noellabo@fedibird.com pgpool-II突っ込んで設定しておくとダウンタイム0でスイッチできるよ仮想IP喋ってくれるからそこにアプリケーション接続しておけばアプリケーション側の設定も不要で便利
-
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 11:29:54 JST のえる @AureoleArk ダウンタイムゼロまで持っていくと格好いいよね! 切り替わったことだれも気付かないw
-
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 11:41:28 JST のえる @AureoleArk Mastodonはドキュメントに案内があってpgbouncer使ってる人が多いんだけど、
こいつもpauseして接続先切り替えてresumeするようにすると具合がいい。
Mastodonのプロセスからコネクション維持されててちょっと応答が遅延したぐらいにしか見えないので、擬似的にダウンタイムゼロにみえる。
-
村上さん (aureoleark@misskey.io)'s status on Saturday, 30-Apr-2022 11:41:29 JST 村上さん @noellabo@fedibird.com 動かしたままpg_basebackupして、ストリーミングレプリケーションを構築しながらpgpool-IIを使うなどがよさそう
-
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 11:50:40 JST のえる listen_addresses = 'xxx.xxx.xxx.xxx,localhost'
リモートサーバじゃなくて、元サーバのインタフェースに振ってあるアドレス。面倒なら
listen_addresses = '*'
でいい。
replication_userつくる。パスワードつける。
CREATE ROLE replication_user LOGIN REPLICATION PASSWORD 'xxxxxxxxx';
pg_hba.confこんな感じ。
host replication replication_user xxx.xxx.xxx.xxx/32 md5
replication.confとか作ってconf.d/ においとくといい。
synchronous_commit = offwal_level = replicamax_wal_senders = 3
ファイアーウォールはたとえばこう。
ufw allow from xxx.xxx.xxx.xxx to any port 5432 proto tcp
-
のえる (noellabo@fedibird.com)'s status on Saturday, 30-Apr-2022 12:10:03 JST のえる pg_lsclusterしたらもうmainがいたりするけど、いたら止める。
sudo pg_ctlcluster 14 main stop
いないなら作る。
sudo pg_createcluster 14 main
データ消す。
sudo rm -fr /var/lib/postgresql/14/main
pg_hba.conとかconf.d/に置く設定は割愛。あ、これは書いとくか。
hot_standby = on
レプリカがホットスタンバイで動くようにする設定。
(中略)
元DBで select * from pg_stat_replication; すると、実行中のレプリケーション接続がリストされるので、これで状況みる。
昇格はこう。
sudo pg_ctlcluster 14 main promote
レプリケーションやめて、こっちが本体になる。
-