‘Tips and FAQs’

接続文字列

libpq およびjdbc のようなPostgreSQL

client 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