#Azureリージョン(東日本)の可用性ゾーンにて高可用性データベース(PostgreSQL)を構築
##AKS上にCrunchy PostgreSQL Operatorを構築する
###システムイメージ
【アクティブ/スタンバイ構成】
システムは通常時に使用する稼働系(アクティブ)と通常時は使わずに待機している待機系(スタンドバイ)で構成され、稼動系に障害が発生して処理の続行が不可能になると、直ちに待機系が起動する。
Azure可用性ゾーンSAL:99.99
###メリット
バックアップ・リカバリの自動化
負荷に応じて、レプリカの台数を増減可能
Namespace により、PostgreSQL クラスタをサービスごとに隔離可能 (Multi-Tenant)
高可用性・耐障害性の向上 (Multi-Cluster、Multi-Zone)
High Availability & Automated Failover Backup
Restore and Disaster Recovery
Geospatial Data Management
Integrated Administration Dashboard
Database Monitoring
###事前準備
クライアントにインストールする必要なライブライブ
1.azure-cli
2.jq
3.libpq
####macのインストールコマンド
brew update && brew install azure-cli
brew install jq
brew install libpq
brew link --force libpq
##デプロイ手順
##(1)AKSのデプロイ
詳細説明について、下記のリンクを参照
https://docs.microsoft.com/ja-jp/azure/aks/availability-zones
①リソースグループ作成
az group create --name rg_aks --location japaneast
②複数の可用性ゾーンでの AKS クラスターの作成
az aks create \
--resource-group rg_aks \
--name aksClusterPG \
--generate-ssh-keys \
--vm-set-type VirtualMachineScaleSets \
--load-balancer-sku standard \
--node-count 3 \
--zones 1 2 3
③複数のゾーンへのノードの分散を確認する
az aks get-credentials --resource-group rg_esd_west_aks --name aksClusterPG
kubectl describe nodes | grep -e "Name:" -e "failure-domain.beta.kubernetes.io/zone"
kubectl get nodes -o custom-columns=NAME:'{.metadata.name}',REGION:'{.metadata.labels.topology\.kubernetes\.io/region}',ZONE:'{metadata.labels.topology\.kubernetes\.io/zone}'
##(2)Crunchy PostgreSQL Operatorのインストール
補足:v4.5.1はMACで動かなかったので、v4.4.1を使用
kubectl create namespace pgo
kubectl create -f https://raw.githubusercontent.com/CrunchyData/postgres-operator/v4.4.1/installers/kubectl/postgres-operator.yml
kubectl wait --for=condition=complete --timeout=180s -n pgo job/pgo-deploy
curl https://raw.githubusercontent.com/CrunchyData/postgres-operator/master/installers/kubectl/client-setup.sh > client-setup.sh
chmod +x client-setup.sh
./client-setup.sh
cat <<EOF >> ~/.bashrc
export PGOUSER="${HOME?}/.pgo/pgo/pgouser"
export PGO_CA_CERT="${HOME?}/.pgo/pgo/client.crt"
export PGO_CLIENT_CERT="${HOME?}/.pgo/pgo/client.crt"
export PGO_CLIENT_KEY="${HOME?}/.pgo/pgo/client.key"
export PGO_APISERVER_URL='https://127.0.0.1:8443'
export PGO_NAMESPACE=pgo
EOF
source ~/.bashrc
備考:他のシェールを使っている場合、例)ZSH、bashrcをzshrcを変更してください
デプロイメントの確認
kubectl -n pgo get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
postgres-operator 1/1 1 1 5m
違うタブ/ウインドウで下記コマンドを実行
kubectl -n pgo port-forward svc/postgres-operator 8443:8443
元タブ/ウインドウで下記コマンドを実行
pgo version
##(3)データベースクラスター作成
違うタブ/ウインドウで下記コマンドを実行
kubectl -n pgo port-forward svc/postgres-operator 8443:8443
元タブ/ウインドウで下記コマンドを実行
pgo create cluster iot-db \
--service-type=LoadBalancer \
--replica-count 3 \
--pvc-size 100.10Gi
備考:クラスター名、レプリカ数、サイズを必要に応じて変更してください
※完了するまでに少し時間かかる
kubectl -n pgo get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
iot-db LoadBalancer 10.0.194.127 20.48.81.148 2022:32095/TCP,5432:30140/TCP 77s
iot-db-backrest-shared-repo ClusterIP 10.0.48.50 <none> 2022/TCP 77s
postgres-operator ClusterIP 10.0.220.87 <none> 8443/TCP,4171/TCP,4150/TCP 15h
20.48.81.148がクライアントからアクセスするためのパブリックIPアドレスです。
元タブ/ウインドウで下記コマンドを実行してデータベースユーザー情報を取得する。
pgo show user -n pgo iot-db --show-system-accounts
CLUSTER USERNAME PASSWORD EXPIRES STATUS ERROR
------- ----------- ------------------------ ------- ------ -----
iot-db crunchyadm never ok
iot-db postgres xxxxxxxxxxxxxxxxxxxxxxxx never ok
iot-db primaryuser xxxxxxxxxxxxxxxxxxxxxxxx never ok
iot-db testuser xxxxxxxxxxxxxxxxxxxxxxxx never ok
接続テスト
psql -h 20.48.81.148 -U testuser iot-db
xxxxxxxxxxxxxxxxxxxxxxxx
kubectl describe pod -n pgo| grep -e "^Name:" -e "^Node:"
Name: backrest-backup-hippo-vk6ng
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: backrest-backup-iot-db-bttmp
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: hippo-68d4998d46-d5nqf
Node: aks-nodepool1-18262813-vmss000000/10.240.0.4
Name: hippo-backrest-shared-repo-76d8bf98b4-2dmrc
Name: backrest-backup-iot-db-8qz6v
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: iot-db-5dc7cfcf99-cq5h7
Node: aks-nodepool1-18262813-vmss000002/10.240.0.6
Name: iot-db-backrest-shared-repo-598f765bc5-h6pjh
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: iot-db-hbvz-59df58c58c-krnw4
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: iot-db-kioo-7b79cbbd59-q2g77
Node: aks-nodepool1-18262813-vmss000000/10.240.0.4
Name: iot-db-seee-77f788fc9f-jhcc9
Node: aks-nodepool1-18262813-vmss000002/10.240.0.6
Name: iot-db-stanza-create-vm2jm
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: pgo-deploy-p47hz
Node: aks-nodepool1-18262813-vmss000000/10.240.0.4
Name: pgo-metrics-deploy-wxntk
Node: aks-nodepool1-18262813-vmss000001/10.240.0.5
Name: postgres-operator-689598d795-w4qcm
Node: aks-nodepool1-18262813-vmss000000/10.240.0.4
####おまけに
pgadminをインストールする場合
元タブに下記コマンドを実行する
pgo create pgadmin -n pgo iot-db
別タブに下記コマンドを実行
kubectl -n pgo port-forward svc/iot-db-pgadmin 5050:5050
ブラウザに「http://localhost:5050」にアクセスして、testuserでログインする。
#####モニタリングについて
Azureモニタが簡単
クラスター:
ノード:
コントローラー:
コンテナー:
メトリクスもインストールできる
クラスター作成時に「--metrics」フラグをつけて、
別タブで下記コマンドを実行
kubectl -n pgo port-forward svc/crunchy-grafana 3000:3000
ブラウザに「http://localhost:3000」にアクセスして、admin/adminでログインする。
ダッシュボードウィザードを使って、PostgreSQLを追加する。
■大きいデータベースを作成してテストする場合
https://wiki.postgresql.org/wiki/Sample_Databases
https://postgrespro.com/docs/postgrespro/10/demodb-bookings-installation.html
リソース:
PGO QuickStart: https://access.crunchydata.com/documentation/postgres-operator/4.5.1/quickstart/
Installation (general steps): https://crunchydata.github.io/postgres-operator/3.5.1/installation/
Connecting to a cluster: https://access.crunchydata.com/documentation/postgres-operator/4.5.1/tutorial/connect-cluster/