クラウドにおけるPgpool-IIの活用方法
2022/12/15
SRA OSS LLC
彭 博 (ペン ボ)© 2022 SRA OSS LLC

1

概要• クラウドにおけるPgpool-IIの稼働環境• Pgpool-IIの設定• 冗長化構成• 仮想IPの設定方法© 2022 SRA OSS LLC

2AWSにおけるPostgreSQLの稼働環境
EC2• オンプレミス環境の場合とほぼ同じ• 柔軟に設定できるマネージドリレーショナルデータベースサービス• Amazon RDS for PostgreSQL/Amazon Aurora PostgreSQL• セットアップや運用管理が容易• スケーリングや自動フェイルオーバ、バックアップなど、便利な機能が提供されている

Kubernetes•••

クラウドネイティブなプラットフォーム
マイクロサービスで使われているデータベースの運用の課題を解決
システム全体のプラットフォームの統一© 2022 SRA OSS LLC

3

稼働環境によって利用するPgpool-IIの機能の差異
PostgreSQL
稼働環境

Pgpool-II
稼働環境

利用するPgpool-IIの機能
フェイルオーバ

ヘルスチェック

Watchdog

負荷分散

コネクションプー
リング

EC2

✓

✓✓✓

✓

Amazon RDS EC2
forPostgreSQL--✓/-✓✓

AmazonAuroraPostgreSQL

EC2-

✓

✓

Kubernetes

Kubernetes

✓✓

EC2

※ WatchdogまたはAWSの機能を利用-✓/※ WatchdogまたはAWSの機能を利用--© 2022 SRA OSS LLC-

4

WatchdogによるPgpool-IIの冗長化(1/3)• Watchdogとは• Pgpool-II自身の可用性を高める機能• 仮想IPがリーダーPgpool-IIに付与される• リーダーPgpool-IIの切り替え時に仮想IPの付け替えを行う• しかし、クラウドでは仮想IPが使えない
クラウド上で使用可能な仮想IPの代替案• Elastic IPの付け替え• セカンダリプライベートIPの付け替え• ルートテーブルの書き換え• DNSサービス（Route53など）のAレコードの書き換え© 2022 SRA OSS LLC

5

WatchdogによるPgpool-IIの冗長化(2/3)
クラウド上で使用可能な仮想IPの代替案
Multi-AZ対応 クライアント (接続元)

Pgpool-II EC2インスタ
ンスのサブネット

Elastic IPの付け替え○

インターネット経由で接続(パブリックサブネット)

パブリックサブネットに配置する必要ある

セカンダリ
プライベートIPの付け替え

✕

VPC内部

プライベートサブネット
で利用可

ルートテーブルの書き換え

○

VPC内部

プライベートサブネット
で利用可

VPC内部
別のピア接続VPC
オンプレミス

プライベートサブネット 設定変更の反映にで利用可
は時間がかかるDNSサービスの ○Aレコードの書き換え© 2022 SRA OSS LLC

備考6

WatchdogによるPgpool-IIの冗長化(3/3)• pgpool.confの設定例
delegate_IP = '20.0.0.50'
if_up_cmd = /etc/pgpool-II/aws_rtb_if_cmd.sh up $_IP_$ eth0 rtb-012345abcd,rtb-67890abcd /usr/local/bin/aws'
if_down_cmd = '/etc/Pgpool-II/aws_rtb_if_cmd.sh up $_IP_$ eth0 rtb-012345abcd,rtb-67890abcd /usr/local/bin/aws'
arping_cmd = 'true'• aws_rtb_if_cmd.shスクリプトの設定例 (詳細については、ドキュメントを参照してください)#!/bin/bash
CMD=$1
VIP=$2
LOCAL_INTERFACE=$3
ROUTE_TABLE_ID=$4
AWSCLI=$5
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
MAC_ADDR=$(ip -br link show dev ${LOCAL_INTERFACE} | tr -s ' ' | cut -d ' ' -f3)
NETWORK_INTERFACE_ID=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/metadata/network/interfaces/macs/${MAC_ADDR}/interface-id)

ルートテーブルの書き換えの設定例

if [ "${CMD}" == "up" ]; then
# クライアント側のルートテーブルが指しているターゲットを自身のネットワークインターフェイスIDに書き換える
for rtb in $(echo ${ROUTE_TABLE_ID} | sed -e 's/,/ /g'); do${AWSCLI} ec2 create-route --route-table-id ${rtb} ¥--destination-cidr-block ${VIP}/32 --network-interface-id ${NETWORK_INTERFACE_ID}
if [ $? -ne 0 ]; then${AWSCLI} ec2 replace-route --route-table-id ${rtb} ¥--destination-cidr-block ${VIP}/32 --network-interface-id ${NETWORK_INTERFACE_ID}fidone# IPアドレスを割り当てる/usr/bin/sudo /sbin/ip addr add ${VIP}/32 dev ${LOCAL_INTERFACE} label ${LOCAL_INTERFACE}:1fi© 2022 SRA OSS LLC

7AWSの機能によるPgpool-IIの冗長化
AWSの Elastic Load Balancing（ELB） + EC2 Auto Scalingを用いてPgpool-IIの高可用性を実現

VPC

Availability Zone a

Availability Zone b

Availability Zone c

Private subnet

Private subnet

Private subnet

Pgpool-II EC2

Pgpool-II EC2Private subnet

Private subnet

Public subnet

クライアントM

Network LoadBalancerR© 2022 SRA OSS LLC

Auto Scaling Group

Pgpool-II EC2Private subnet

R8設定例: Pgpool-II + Amazon Aurora/RDS• ストリーミングレプリケーションモード
(デフォルトで負荷分散、コネクションプールが有効)
backend_clustering_mode = 'streaming_replication'load_balance_mode = onconnection_cache = on• バックエンドノード情報にライターエンドポイントとリーダーエンドポイントを設定

Pgpool-II
Pgpool-II
Pgpool-II
更新・参照backend_hostname0 = 'ライターエンドポイント'
backend_hostname1 = 'リーダーエンドポイント'• プライマリノードを自動判別せず固定参照

backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'

AmazonAurora/RDS• フェイルオーバはAWSに任せるので、ヘルスチェックを無効にする (デフォルトで無効)

リーダー
エンドポイントライター
エンドポイント

health_check_period = 0

M

プライマリ

R

リード
レプリカ

R

リードレプリカ•

バックエンドエラーが発生した時にフェイルオーバを起こさないように
failover_on_backend_error = off• ストリーミングレプリケーション遅延チェックを無効にする© 2022 SRA OSS LLC

sr_check_period = 0

9KubernetesにおけるPgpool-IIの活用• Kubernetes上でPostgreSQLを運用するには専用のOperatorが必要• PostgreSQL Operator• PostgreSQLクラスタのPrimary/Standbyの役割管理• PostgreSQLの管理タスクの自動化• 各社がPostgreSQL Operatorを開発中• Zalando Postgres Operator• PGO, the Postgres Operator from Crunchy Data
• KubeDB• EDB Postgres for Kubernetes• など© 2022 SRA OSS LLC

10

Kubernetes全体構成図
監視ダッシュボード

Pgpool Service

Pod

Pod

PostgreSQL
Operator

Pgpool-II

GrafanaPgpool Exporter

Prometheus

参照

更新・参照
PostgreSQL
Cluster

レプリカService

プライマリService

Pod

Pod

Pod

プライマリ

S3

Grafana Service

レプリカ 1...

レプリカ N

バックアップ
Data
PV

Data
PV

© 2022 SRA OSS LLC

Data
PV

WALアーカイブ

11

KubernetesにおけるPgpool-IIの設定
機能
負荷分散最小設定これらの機能のみを有効にする

コネクションプール

ヘルスチェック# バックエンド情報# (2台のみ：Primary Service と Replica Service)
backend_hostname0='Primary Service'
backend_hostname1='Replica Service'
backend_port0='5432'
backend_port1='5432'
backend_flag0='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1='DISALLOW_TO_FAILOVER'# バックエンドエラーが発生した時にフェイルオーバを起こさないように
failover_on_backend_error = off

自動フェイルオーバ
オンラインリカバリ

Kubernetesに任せる

Watchdog (Pgpool-II の HA機能)# ヘルスチェックを無効にする
health_check_period = 0# ストリーミングレプリケーション遅延チェック (任意)
# sr_check_userのパスワードはpool_passwdファイルで設定
sr_check_period = 10sr_check_user = 'PostgreSQLユーザ名'# その他
load_balance_mode = onconnection_cache = on
© 2022 SRA OSS LLC
listen_addresses = '*'

12

まとめ
• クラウドにおけるPgpool-IIの活用• 様々なPostgreSQLの稼働環境に対応• EC2• Amazon RDS/Aurora• Kubernetes• PostgreSQLの稼働環境によって、Pgpool-IIの稼働環境や設定が異なる• クラウド上でPgpool-IIの冗長化• Pgpool-IIの機能• AWSの機能• クラウド上で使用可能な仮想IPの代替案© 2022 SRA OSS LLC

13

参考情報
• Pgpool-II• https://pgpool.net/• https://www.pgpool.net/docs/latest/ja/html/• AWSドキュメント• https://docs.aws.amazon.com/ja_jp/• Kubernetesの設定例• https://github.com/pgpool/pgpool2_on_k8s• AWS/Amazon Auroraの設定例• https://www.pgpool.net/docs/latest/ja/html/example-aws.html• https://www.pgpool.net/docs/latest/ja/html/example-aurora.html© 2022 SRA OSS LLC

14

ご清聴ありがとうございました。

© 2022 SRA OSS LLC

15