‘Tips and FAQs’¶
接続文字列¶
libpqおよびjdbcのようなPostgreSQLclient libraries は、クライアント接続フェイルオーバーをサポートしています。接続文字列には、複数のサーバーが含まれています(例、
host=srv1,srv2
)。クライアントライブラリは、使用可能なホストをループして、使用可能で読み取り/書き込みまたは読み取り専用操作が可能な接続を見つけます。この構成により、クライアントはスイッチオーバー中にプライマリクラスタをたどることができます。
例:
$ psql "host=srv1,srv2 dbname=postgres user=admin target_session_attrs=read-write" -c "SELECT pg_is_in_recovery();"
pg_is_in_recovery
- ------------------
f
(1 row)
$ psql "host=srv1,srv2 dbname=postgres user=admin target_session_attrs=read-only" -c "SELECT pg_is_in_recovery();"
pg_is_in_recovery
- ------------------
t
(1 row)
VIP&Keepalived¶
複数のHAProxyインスタンスを使用していて、接続するプロキシホストを決定する方法が必要な場合、最も簡単な解決策は、KeepalivedとVIP(仮想IP)を使用することです。
RHEL8の例¶
この例では、RHEL8でのインストールと構成を示しています。
最初に、HAProxyを実行している各ホストにKeepalivedをインストールします。
$ sudo dnf install -y keepalived
$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bck
この例では、仮想IPとして192.168.121.121 を使用します。
Keepalivedを構成します。
$ VIP=192.168.121.121
$ MY_IP=$(hostname -I | awk {print $1})
$ DEVICE=$(ip -br address | grep $MY_IP | awk {print $1})
$ cat <<EOF | sudo tee /etc/keepalived/keepalived.conf
global_defs {
vrrp_garp_master_delay 3
vrrp_garp_master_repeat 4
vrrp_garp_master_refresh 60
vrrp_garp_master_refresh_repeat 4
}
vrrp_instance patroni {
state BACKUP
interface $DEVICE
virtual_router_id 100
priority 100
advert_int 1
virtual_ipaddress {
$VIP
}
authentication {
auth_type PASS
auth_pass secret
}
}
EOF
必要に応じてファイアウォールを構成します。
$ sudo firewall-cmd --add-rich-rule=rule protocol value="vrrp" accept --permanent
$ sudo firewall-cmd --reload
最後に、Keepalived サービスを有効にして開始します。
$ sudo systemctl enable keepalived
$ sudo systemctl start keepalived
起動すると、仮想IPがいずれかのホストに接続されます。確認するには、それに到達してみてください。
$ ping -c 3 $VIP
PING 192.168.121.121 (192.168.121.121) 56(84) bytes of data.
64 bytes from 192.168.121.121: icmp_seq=1 ttl=64 time=0.196 ms
64 bytes from 192.168.121.121: icmp_seq=2 ttl=64 time=0.410 ms
64 bytes from 192.168.121.121: icmp_seq=3 ttl=64 time=0.322 ms
- -- 192.168.121.121 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2052ms
rtt min/avg/max/mdev = 0.196/0.309/0.410/0.087 ms