【PostgreSQL】えっ!?レプリカセットで3台以上を!?~PRIMARY基準に構築する~

中山テック 代表の中山です。

さて久しぶりのミドルウェア構築ネタです。

大規模なシステムになると2台構成では間に合わず、3台以上や多い所では10台構成なんてこともチラホラ。

ただ設定方法が大幅に変わるという訳でもありません。

今回は3台以上でのレプリカセットを作成する方法についてお話したいと思います。

参考にしたサイト



まずは現状の構成を説明します。

PostgreSQL×pgpool2台構成、それぞれレプリカセットが構築されています。

pgpool同士もPostgreSQL同士も繋がっており、pgpoolからはロードバランスの設定もされてます。

PostgreSQLのレプリカセットの台数を増やしたい

では2台では足りない!という場合、更なる負荷分散を目指していくこととなります。

今回は+2台追加する方向でお話を進めます。

PRIMARY側の設定

2台構成での設定値はこちらのブログをご覧ください。

上記リンク先の設定値からの修正箇所は「synchronous_standby_names」。

synchronous_standby_names = '3(standby1,standby2,standby3)'

スタンバイ側で設定する「application_user」の値を定義します。

※namesを"*"でも出来るとは思いますが、わかりやすくするため修正しています

  • システム開発関連記事

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台構成の場合はそこまで難しくないですが、それ以上となるとちょっと手を入れる必要があります。

※入れなくてもできるかもしれませんが、それはまた別の機会に・・・

参考になるかは微妙な所ですが、役に立ったと思って頂けたら幸いです!

最後までご覧いただき、ありがとうございました。

※中山テックに掲載しているゲーム画像の著作権、商標権、その他知的財産権は、当該コンテンツの提供元に帰属します


おすすめの記事