Pgpool-IIの構成紹介と活用事例
2021-01-19

SRA OSS, Inc. 日本支社
彭 博 (ペン ボ)© 2021 SRA OSS, Inc. Japan1

クラウドにおけるPgpool-IIの活用• Amazon Aurora PostgreSQLやKubernetesでもPgpool-IIを利用可能• クエリの振り分け• コネクションプーリング

Operator…

M© 2021 SRA OSS, Inc. JapanR

AmazonAuroraPostgreSQL

2

Kubernetes上でPgpool-IIを動かす© 2021 SRA OSS, Inc. Japan3

Kubernetesとはコンテナの管理を自動化するためのプラットフォーム

コンテナの死活監視

リソース管理スケーリングサービス
ディスカバリセルフヒーリング

スケジューリングローリングアップデート

ロードバランシング© 2021 SRA OSS, Inc. Japan

4

PostgreSQL Operator• Operator• Kubernetesの本来の機能を拡張し、様々な管理をコードとして記述し、自動化する• PostgreSQL Operator• PostgreSQLの管理タスクの自動化 (バックアップ、死活監視、フェイルオーバなど)• PostgreSQLクラスタのPrimary/Standbyの役割管理

Zalando PostgreSQL Operator

Crunchy PostgreSQL Operator

開発元

Zalando SECrunchy Data

ライセンス

MIT License

Apache License 2.0

対応バージョン

PostgreSQL 9.6以降

PostgreSQL 9.5以降

動作環境

Amazon EKS, Google Kubernetes Engine (GKE),Red Hat OpenShift

Amazon EKS, Google Kubernetes Engine (GKE), Red Hat
OpenShift, VMWare Enterprise PKS, IBM Cloud Pak Data

プロジェクトURL

https://github.com/zalando/postgres-operator

https://github.com/CrunchyData/postgres-operator© 2021 SRA OSS, Inc. Japan5

KubernetesにおけるPrimaryとReplicaへのクエリ振り分け• 既存のPostgreSQL Operatorにはクエリ振り分け機能がない• クライアントとPostgreSQLの間に位置し、PostgreSQLのクエリを解析し振り分けるツールが必要

PostgreSQL
Operator

PostgreSQL
Operator

PostgreSQL
Cluster

PostgreSQL
Cluster© 2021 SRA OSS, Inc. Japan

6

KubernetesにおけるPgpool-IIの設定
機能
クエリの振り分け
コネクションプール

最小設定

これらの機能のみを有効にする

backend_hostname0='hippo'
backend_hostname1='hippo-replica'
backend_port0='5432'
backend_port1='5432'
backend_flag0='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1='DISALLOW_TO_FAILOVER’

ヘルスチェック
自動フェイルオーバ

バックエンド情報(2台のみ：Primary Service と Replica Service)

Kubernetes に任せる

レプリケーションチェック
sr_check_period = 0

オンラインリカバリ# Default

その他

Watchdog (Pgpool-II の HA機能)

load_balance_mode = on # Default
connection_cache = on # Default
listen_addresses = '*’ # Default© 2021 SRA OSS, Inc. Japan

7

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

Pgpool Service

Grafana Service
Pod

Pod

PostgreSQL
Operator

Pgpool

GrafanaPgpool Exporter

Prometheus

参照

更新・参照
PostgreSQL
Cluster

Replica DB Service

Primary DB Service

Pod

Pod

Pod

Primary

Replica 1

Data
PVC

Data
PVC

© 2021 SRA OSS, Inc. Japan...

Replica N

DataPVC8

Pgpool-IIのデプロイ- 環境変数を用いたPgpool-IIの設定# pgpool_deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pgpool
spec:

replicas: 1•

Kubernetes上でPgpool-IIをデプロイするための各種サンプルYAMLファイル
https://github.com/pgpool/pgpool2_on_k8s•

ドキュメントhttps://www.pgpool.net/docs/latest/ja/html/example-kubernetes.html

...
spec:
containers:- name: pgpool

image: pgpool/pgpool:4.2
env:- name: PGPOOL_PARAMS_BACKEND_HOSTNAME0
value: "hippo"- name: PGPOOL_PARAMS_BACKEND_HOSTNAME1
value: "hippo-replica"- name: PGPOOL_PARAMS_BACKEND_PORT0
value: "5432"- name: PGPOOL_PARAMS_BACKEND_PORT1
value: "5432"...
- name: pgpool-stats# kubectl create namespace demo
# kubectl apply –f pgpool_deploy.yaml –namespace=demo

PGPOOL_PARAMS_<パラメータ名>
形式の環境変数が設定パラメータに変換される

環境変数を用いて任意の Pgpool-II のパラメータを設定できる

backend_hostname0='hippo'
backend_hostname1='hippo-replica'
backend_port0='5432'
backend_port1='5432'...

image: pgpool/pgpool2_exporter:1.0
env:- name: PGPOOL_SERVICE
value: "localhost"※テストや学習を目的とした必要最低限のパラメータ設定の場合© 2021 SRA OSS, Inc. Japan

9

Pgpool-IIのデプロイ- ConfigMapを用いたPgpool-IIの設定# pgpool_configmap.yaml
apiVersion: v1

kind: ConfigMap

ConfigMap• 環境変数や設定ファイルをPodに設定するための仕組み• 各種設定ファイルのパラメー
タを直接指定してConfigMapを作成可能• PodのVolumeとしてマウント可能• 暗号化されない

metadata:
name: pgpool-config
labels:app: pgpool-config
data:
pgpool.conf: |# pgpool_deploy.yaml
listen_addresses = '*'apiVersion: apps/v1
port = 9999
kind: Deployment
socket_dir = '/var/run/postgresql'...
pcp_listen_addresses = '*'spec:
pcp_port = 9898
containers:...
- image: pgpool/pgpool:4.1

mountcommand: ["sh", "-c"]args:["$PGPOOL_BINARY_DIR/pgpool -n -f
postgres:e8a48653851e28c69d0506508fb27fc5$PGPOOLCONF -F $PCP_CONF -a $POOL_HBA_CONF"]...

pcp.conf: |-env:...
postgres:md53175bce1d3201d16594cebf9d7eb3f9d
volumeMounts:
user1:md542b72f913c3201fc62660d512f5ac746- name: pgpool-config
user2:md548b83a2a920f7284c9f0e1bf03012b68
mountPath: /usr/local/pgpool-II/etc...
volumes:pool_hba.conf: |- name: pgpool-config
local
all
all
trust
configMap:
hostallall
127.0.0.1/32
trust
name: pgpool-config
hostall
all::1/128
trust
hostallall
0.0.0.0/0
md5

pool_passwd: |-© 2021 SRA OSS, Inc. Japan10

Pgpool-IIによる読み取りクエリの負荷分散$ kubectl -n demo port-forward svc/pgpool 9999:9999 &$ psql -h localhost -U postgres -c "show pool_nodes"
node_id|hostname| port |status| lb_weight |role| select_cnt | load_balance_node| replication_delay-------+-----------------+------+------+----------+---------+--------------+------------------+-----------------+

0| hippo| 5432 | up

| 0.500000| primary | 0| false| 01| hippo-replica| 5432 | up

| 0.500000| standby | 0| true

| 0

$ psql -h localhost -U postgres -c "SELECT 1"$ psql –h localhost –U postgres –c "SELECT 1"...

$ psql -h localhost -U postgres -c "show pool_nodes"
node_id |hostname| port |status| lb_weight|role| select_cnt | load_balance_node| replication_delay--------+-----------------+------+------+----------+---------+--------------+------------------+-----------------+
0| hippo| 5432 | up

| 0.500000 | primary | 3| false| 01| hippo-replica| 5432 | up

| 0.500000 | standby | 3| true| 0© 2021 SRA OSS, Inc. Japan

11

Amazon Aurora PostgreSQLにおけるPgpool-IIによるクエリ振り分け© 2021 SRA OSS, Inc. Japan

12

Amazon Aurora PostgreSQL• PostgreSQLと互換性を持ったマネージド型のリレーショナルデータベースエンジン• DBインスタンス• プライマリDBインスタンス (Writer)

アプリケーション
更新・参照

参照

読み取り
エンドポイント

クラスタ
エンドポイント• 書き込み・読み取り• リードレプリカ (Reader)

Availability Zone a• 読み取りのみ (最大15個まで)

Availability Zone b

Availability Zone c• エンドポイント• クラスタエンドポイント：プライマリDBインスタンスに接続• 読み取りエンドポイント：すべてのリードレプリカに接続 (読み取りの負荷分散)

MプライマリDBインスタンス

Ry参照

R更新

リードレプリカ

Ry参照

R

リードレプリカ

Ry参照• 自動フェイルオーバ• プライマリDBインスタンスに障害が発生した場合、リードレプリカが自動的にプライマリDBインスタンスに昇格

データコピー© 2021 SRA OSS, Inc. Japan

データコピー

データコピー

分散ストレージ

13RAmazon Aurora PostgreSQLの利点• 高可用性・耐障害性• 自動フェイルオーバ• 複数のAZにまたがるストレージとDBインスタンス• パフォーマンスの向上• Amazon RDS for PostgreSQLの最大3倍のスループット• 同時接続数を増やしてもスループットの劣化が少ない• レスポンス時間が短く、安定している• スケーラビリティ• 最大15個までリードレプリカを作成可能© 2021 SRA OSS, Inc. Japan

14

Amazon Aurora PostgreSQLにおけるPgpool-IIによるクエリ振り分け•

ストリーミングレプリケーションモード
(デフォルトではクエリの振り分け、コネクションプールが有効)
cp /etc/pgpool-II/pgpool.conf{.sample-stream,}•Pgpool-II

フェイルオーバはAuroraに任せるので、ヘルスチェックを無効にする
health_check_period = 0

更新・参照

AmazonAuroraDB Cluster•

参照

プライマリノードを自動判別せず固定
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'''•

読み取り
エンドポイント

クラスタ
エンドポイント

バックエンドノード情報にクラスタエンドポイントと読み取りエンドポイントを設定
backend_hostname0 = 'クラスタエンドポイント'
backend_hostname1 = '読み取りエンドポイント'

M

プライマリDB
インスタンス

R

リード
レプリカ

R

リードレプリカ•

ストリーミングレプリケーション遅延チェックを無効にする
sr_check_period = 0•© 2021 SRA OSS, Inc. Japan

Pgpool-II のクライアント認証でmd5認証を有効にするenable_pool_hba = on15

参考情報
• Pgpool-II• https://pgpool.net/• https://www.pgpool.net/docs/latest/ja/html/• Kubernetes の設定例
• https://github.com/pgpool/pgpool2_on_k8s• https://www.pgpool.net/docs/latest/ja/html/example-kubernetes.html• Aurora の設定例
• https://www.pgpool.net/docs/latest/ja/html/example-aurora.html• Pgpool-II Exporter• https://github.com/pgpool/pgpool2_exporter© 2021 SRA OSS, Inc. Japan16

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

© 2021 SRA OSS, Inc. Japan17