![【PostgreSQL】えっ!?レプリカセットで3台以上を!?~PRIMARY基準に構築する~](https://nakayama-tech.com/wp-content/uploads/2024/04/blog-20240416-03.jpg)
中山テック 代表の中山です。
さて久しぶりのミドルウェア構築ネタです。
大規模なシステムになると2台構成では間に合わず、3台以上や多い所では10台構成なんてこともチラホラ。
ただ設定方法が大幅に変わるという訳でもありません。
今回は3台以上でのレプリカセットを作成する方法についてお話したいと思います。
![](https://nakayama-tech.com/wp-content/uploads/2024/04/blog-20240416-01.jpg)
まずは現状の構成を説明します。
PostgreSQL×pgpool2台構成、それぞれレプリカセットが構築されています。
pgpool同士もPostgreSQL同士も繋がっており、pgpoolからはロードバランスの設定もされてます。
![](https://nakayama-tech.com/wp-content/uploads/2024/04/blog-20240416-02-1024x474.jpg)
では2台では足りない!という場合、更なる負荷分散を目指していくこととなります。
今回は+2台追加する方向でお話を進めます。
PRIMARY側の設定
2台構成での設定値はこちらのブログをご覧ください。
上記リンク先の設定値からの修正箇所は「synchronous_standby_names」。
synchronous_standby_names = '3(standby1,standby2,standby3)'
スタンバイ側で設定する「application_user」の値を定義します。
※namesを"*"でも出来るとは思いますが、わかりやすくするため修正しています
- PostgreSQLのバックアップとリストア~pg_basebackupを駆使して主系副系復帰を目指す~
- 【バックエンド開発】代表の実績や経験をご紹介すると共に得た知識を技術コラムとして執筆
- スマホ画面を簡単に録画するアプリをご紹介~ゲーム実況にも使えます~
- Let’s C言語チャレンジ!~自由度が高くメモリ理解も得られるので勉強することをおすすめします~
- Excel(エクセル)、行・列に複数の見出しを作る方法~テキストエディタを駆使~
STANDBY側の設定
こちらの手順を実施してください。
「pg_basebackup -R -D /var/lib/pgsql/15/data/ -U repl -h [PRIMARYのIPアドレス]」でコピーします。
※全スタンバイノードが理想だが、遅すぎる場合は1つのノードを上記コマンドで実施、他はdata配下を固めて送信しても良い
コピー後はdata配下「postgresql.auto.conf」にレプリカセットの情報が定義されているので修正します。
※postgres.conf内のprimary_conninfoを修正でも良いが、その際はpostgresql.auto.confに何も定義しないこと。postgresql.auto.confが優先されます!
スタンバイ1
primary_conninfo = 'user=repl application_user=standby1 passfile=''/home/postgres/.pgpass'' channel_binding=prefer host=192.168.230.128 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
スタンバイ2
primary_conninfo = 'user=repl application_user=standby2 passfile=''/home/postgres/.pgpass'' channel_binding=prefer host=192.168.230.128 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
スタンバイ3
primary_conninfo = 'user=repl application_user=standby3 passfile=''/home/postgres/.pgpass'' channel_binding=prefer host=192.168.230.128 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
レプリカセット確認
こちらの手順を確認ください。
[ RECORD 1 ]~[ RECORD 3 ]まで「sync_state」が"sync"になっていればレプリケーションされています。もしasyncとなっていた場合はスタンバイ側の「postgresql.auto.conf」とプライマリ側の「postgresql.conf」の"synchronous_standby_names"が誤っている可能性があります。
まとめ
2台構成の場合はそこまで難しくないですが、それ以上となるとちょっと手を入れる必要があります。
※入れなくてもできるかもしれませんが、それはまた別の機会に・・・
参考になるかは微妙な所ですが、役に立ったと思って頂けたら幸いです!
最後までご覧いただき、ありがとうございました。