高可用性・耐障害性のデータベースを構築（Azure＋PostgreSQL）

#Azureリージョン（東日本）の[可用性ゾーン](https://azure.microsoft.com/ja-jp/global-infrastructure/availability-zones/)にて高可用性データベース（PostgreSQL）を構築

##AKS上にCrunchy PostgreSQL Operatorを構築する

###システムイメージ
<strong>【アクティブ/スタンバイ構成】</strong>
システムは通常時に使用する稼働系（アクティブ）と通常時は使わずに待機している待機系（スタンドバイ）で構成され、稼動系に障害が発生して処理の続行が不可能になると、直ちに待機系が起動する。
<strong>Azure可用性ゾーンSAL：99.99</strong>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/3a0ad4c8-8b3e-3134-17c4-071d30021eaf.png)



###メリット
バックアップ・リカバリの自動化
負荷に応じて、レプリカの台数を増減可能
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
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/13883fdf-afc4-f64d-5cc2-8d2e7227c174.png)

###事前準備
クライアントにインストールする必要なライブライブ
1.azure-cli
2.jq
3.libpq
####macのインストールコマンド

``` terminal
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 クラスターの作成

``` terminal
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
```

③複数のゾーンへのノードの分散を確認する

``` terminal
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"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/86a0392d-3afd-f099-1d7c-e39644ce3ecc.png)

``` terminal
kubectl get nodes -o custom-columns=NAME:'{.metadata.name}',REGION:'{.metadata.labels.topology\.kubernetes\.io/region}',ZONE:'{metadata.labels.topology\.kubernetes\.io/zone}'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/61deb657-28d5-6da7-f5ef-0c30d7d418c9.png)

##(2)Crunchy PostgreSQL Operatorのインストール
補足：v4.5.1はMACで動かなかったので、v4.4.1を使用



``` terminal
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を変更してください

デプロイメントの確認

``` terminal
kubectl -n pgo get deployments

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
postgres-operator             1/1     1            1           ５m
```

違うタブ/ウインドウで下記コマンドを実行

``` terminal
kubectl -n pgo port-forward svc/postgres-operator 8443:8443
```

元タブ/ウインドウで下記コマンドを実行

``` terminal
pgo version
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/87ea717f-cda8-0a8c-4f29-fbd3d1f3304f.png)

##(3)データベースクラスター作成
違うタブ/ウインドウで下記コマンドを実行

``` terminal
kubectl -n pgo port-forward svc/postgres-operator 8443:8443
```

元タブ/ウインドウで下記コマンドを実行

``` terminal
pgo create cluster iot-db \
  --service-type=LoadBalancer \
  --replica-count 3 \
  --pvc-size 100.10Gi
```

備考：クラスター名、レプリカ数、サイズを必要に応じて変更してください
※完了するまでに少し時間かかる


``` terminal
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アドレスです。
元タブ/ウインドウで下記コマンドを実行してデータベースユーザー情報を取得する。

``` terminal
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  
```

接続テスト

``` terminal
psql -h 20.48.81.148 -U testuser iot-db
xxxxxxxxxxxxxxxxxxxxxxxx
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/06248ce8-47b2-cd05-cfa0-a6ca85335206.png)

<font color='red'>
下記のコマンドでデータベースのインスタンスが
３つのゾーンに展開されていることを確認できる</font>

``` terminal
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をインストールする場合
元タブに下記コマンドを実行する

``` terminal
pgo create pgadmin -n pgo iot-db
```

別タブに下記コマンドを実行

``` terminal
kubectl -n pgo port-forward svc/iot-db-pgadmin 5050:5050
```

ブラウザに「[http://localhost:5050](http://localhost:5050)」にアクセスして、testuserでログインする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/0bf6eb08-0112-ddd7-649d-43ff0a97876b.png)

#####モニタリングについて
Azureモニタが簡単
クラスター：
![クラスター](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/56dfe1e2-9cb7-62ad-3ab9-a4a240e3704a.png)
ノード：
![ノード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/a4287ac9-18ea-70f9-7efd-e9664f48e1a2.png)
コントローラー：
![コントローラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/9d902aba-fc1b-18c7-f29e-c5f7329a0a26.png)
コンテナー：
![コンテナー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/f883859f-577c-87a1-fd86-b790155de142.png)

メトリクスもインストールできる
クラスター作成時に「--metrics」フラグをつけて、
別タブで下記コマンドを実行

``` terminal
kubectl -n pgo port-forward svc/crunchy-grafana 3000:3000
```

ブラウザに「[http://localhost:3000](http://localhost:3000)」にアクセスして、admin/adminでログインする。
ダッシュボードウィザードを使って、PostgreSQLを追加する。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/967700/8a469d05-e4ce-26ad-e010-3cf9a41828bb.png)

■大きいデータベースを作成してテストする場合
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/