中山テック 代表の中山です。
さて久しぶりのミドルウェア構築ネタです。
大規模なシステムになると2台構成では間に合わず、3台以上や多い所では10台構成なんてこともチラホラ。
ただ設定方法が大幅に変わるという訳でもありません。
今回は3台以上でのレプリカセットを作成する方法についてお話したいと思います。
まずは現状の構成を説明します。
PostgreSQL×pgpool2台構成、それぞれレプリカセットが構築されています。
pgpool同士もPostgreSQL同士も繋がっており、pgpoolからはロードバランスの設定もされてます。
では2台では足りない!という場合、更なる負荷分散を目指していくこととなります。
今回は+2台追加する方向でお話を進めます。
PRIMARY側の設定
2台構成での設定値はこちらのブログをご覧ください。
上記リンク先の設定値からの修正箇所は「synchronous_standby_names」。
synchronous_standby_names = '3(standby1,standby2,standby3)'
スタンバイ側で設定する「application_user」の値を定義します。
※namesを"*"でも出来るとは思いますが、わかりやすくするため修正しています
- wildflyサーバログのエンコーディング
- cronで定期的に処理を行う方法~分単位から年月日まで指定できる便利ツールです~
- Excel(エクセル)で数字を順番に振る方法~項目番号やカレンダーまで応用~
- NginxをKeepAliveで冗長化~さらにロードバランスでTomcatを負荷分散~
- ペイント(Windows標準)ツールでかんたんにモザイクを掛ける方法
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台構成の場合はそこまで難しくないですが、それ以上となるとちょっと手を入れる必要があります。
※入れなくてもできるかもしれませんが、それはまた別の機会に・・・
参考になるかは微妙な所ですが、役に立ったと思って頂けたら幸いです!
最後までご覧いただき、ありがとうございました。