前回はカスタム構成でのインストールとして、異なるディスクタイプの利用と replicaset の数の変更、およびクラスタ名の変更を試しましたが、今回は SQL Server マスターインスタンスの高可用性構成を見ていきます。
SQL Server 2019 BDC の高可用性
高可用性対応は以下の 3 つのコンポーネントで行えます。
- SQL Server マスターインスタンス
- Spark
- HDFS
SQL Server マスターインスタンス
SQL Server 2019 BDC は k8s 上で稼働していることから、ポッドの状態監視や自動的な再起動など、もともと高可用性を備えています。しかし、よりミッションクリティカルで継続性が求められる状況において、可用性グループを利用することができます。
可用性グループはもともと SQL Server の機能です。参照: AlwaysOn 可用性グループの概要 (SQL Server)
BDC で可用性グループを利用する場合、以下の動作となります。
- containedag という可用性グループが作成される
- 既定で 3 つのレプリカが作成される
- すべての CRUD 操作は内部的に処理されるため、可用性グループの作成や追加はできない
- すべてのシステムとユーザーデータベースはそれぞれのインスタンスにコピーされる
- 可用性グループ固有のデータベースがいくつか追加される
- 読み取り専用セカンダリ用のエンドポイントが作成される
Spark の高可用性
Spark を高可用性にする場合、SparkHead ポッドを複数用意するだけでなく、処理を分散するよう Zookeeper も複数構成とします。Active/Standby 構成となります。
HDFS の高可用性
HDFS を高可用性にする場合、Name node ポッドを複数用意し、こちらも Zookeeper で管理します。Active/Standby 構成となります。
zookeeper の詳細は Apache Zookeeper を参照してください。
高可用性構成でのインストール
高可用性は azdata の既定の構成でサポートされているため、今回はそちらを利用してインストールします。
構成ファイルの確認
以下コマンドで高可用性用構成をコピー
azdata bdc config init -s aks-dev-test-ha -t custom-ha
code custom-ha
このテンプレートは SQL Server マスターインスタンスの高可用性の他、HDFS のネームノードおよび Spark の高可用性も設定がされています。
[HDFS 関連]
- nmnode, sparkhead ともに Active/Standby として replicas が 2 に設定
- zookeeper の replicas が 3 に設定
- 記憶域プールの replicas が 3 に設定
- hdfs サービスの設定で replication が 3 に設定
{
...
"spec": {
"resources": {
"nmnode-0": {
"spec": {
"replicas": 2
}
},
"sparkhead": {
"spec": {
"replicas": 2
}
},
"zookeeper": {
"spec": {
"replicas": 3
}
},
...
"storage-0": {
...
"spec": {
"type": "Storage",
"replicas": 3,
...
}
}
...
},
"services": {
...
"hdfs": {
...
"settings": {
"hdfs-site.dfs.replication": "3"
}
},
ノードの追加
現在利用している L8s サイズの VM はディスクを最大で 32 までしかアタッチできませんが、HA 構成を既定のまま実施するとそれを超えます。また他のリソースも不足する可能性があるため、現在 1 台のノードを 2 台にスケールします。
az aks nodepool scale --cluster-name sqlbdc -g sqlbdcrg --name nodepool1 -c 2
インストールの実施
azdata コマンドで aks-dev-test-ha 構成をインストール
1. 以下コマンドを実行。
SET AZDATA_USERNAME=admin
SET AZDATA_PASSWORD=<password>
azdata bdc create --config-profile aks-dev-test-ha --accept-eula yes
2. インストールは 15-30 分程度かかる為、BDC 構成のビデオでも見て待つ。
3. 作成完了後、ポッドを確認。
- 各ポッドが指定された数だけ存在
>kubectl get pods --namespace=mssql-cluster
NAME READY STATUS RESTARTS AGE
appproxy-cnxnq 2/2 Running 0 25m
compute-0-0 3/3 Running 0 25m
control-k2z6g 3/3 Running 0 41m
controldb-0 2/2 Running 0 41m
controlwd-mc9mb 1/1 Running 0 37m
data-0-0 3/3 Running 0 25m
data-0-1 3/3 Running 0 25m
gateway-0 2/2 Running 0 25m
logsdb-0 1/1 Running 0 37m
logsui-b9fqz 1/1 Running 0 37m
master-0 4/4 Running 0 24m
master-1 4/4 Running 0 24m
master-2 4/4 Running 0 24m
metricsdb-0 1/1 Running 0 37m
metricsdc-94tbx 1/1 Running 0 37m
metricsdc-tbzmw 1/1 Running 0 37m
metricsui-wrvbk 1/1 Running 0 37m
mgmtproxy-z86nr 2/2 Running 0 37m
nmnode-0-0 2/2 Running 0 25m
nmnode-0-1 2/2 Running 0 25m
operator-79lkd 1/1 Running 0 25m
sparkhead-0 4/4 Running 0 24m
sparkhead-1 4/4 Running 0 24m
storage-0-0 4/4 Running 0 24m
storage-0-1 4/4 Running 0 24m
storage-0-2 4/4 Running 0 24m
zookeeper-0 2/2 Running 0 25m
zookeeper-1 2/2 Running 0 25m
zookeeper-2 2/2 Running 0 25m
4. SQL Server マスターインスタンスのセカンダリエンドポイントを確認。
>kubectl get svc master-secondary-svc-external master-svc-external --namespace=mssql-cluster
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
master-secondary-svc-external LoadBalancer 10.0.36.208 52.xxx.xx.244 31436:31997/TCP 26m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
master-svc-external LoadBalancer 10.0.215.32 52.xxx.xx.171 31433:30076/TCP 26m
5. リソースの状況を確認。
>kubectl describe node aks-nodepool1-41170276-vmss000000
...
Non-terminated Pods: (16 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system kube-proxy-kpnqd 100m (1%) 0 (0%) 0 (0%) 0 (0%) 54m
mssql-cluster appproxy-cnxnq 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 28m
mssql-cluster compute-0-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 28m
mssql-cluster control-k2z6g 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 44m
mssql-cluster controlwd-mc9mb 0 (0%) 0 (0%) 0 (0%) 0 (0%) 40m
mssql-cluster data-0-1 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 28m
mssql-cluster logsdb-0 500m (6%) 0 (0%) 1Gi (1%) 2Gi (3%) 40m
mssql-cluster logsui-b9fqz 0 (0%) 0 (0%) 0 (0%) 0 (0%) 40m
mssql-cluster master-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 27m
mssql-cluster master-2 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 27m
mssql-cluster metricsdc-tbzmw 500m (6%) 0 (0%) 256Mi (0%) 1Gi (1%) 40m
mssql-cluster nmnode-0-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 28m
mssql-cluster operator-79lkd 0 (0%) 0 (0%) 0 (0%) 0 (0%) 28m
mssql-cluster sparkhead-1 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 27m
mssql-cluster storage-0-1 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 27m
mssql-cluster zookeeper-0 600m (7%) 0 (0%) 2148Mi (3%) 0 (0%) 28m
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 2600m (33%) 0 (0%)
memory 4328Mi (7%) 3Gi (5%)
ephemeral-storage 0 (0%) 0 (0%)
attachable-volumes-azure-disk 0 0
...
>kubectl describe node aks-nodepool1-41170276-vmss000001
...
Non-terminated Pods: (21 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system coredns-866fc6b6c8-2sdks 100m (1%) 0 (0%) 70Mi (0%) 170Mi (0%) 59m
kube-system coredns-866fc6b6c8-kbk75 100m (1%) 0 (0%) 70Mi (0%) 170Mi (0%) 55m
kube-system coredns-autoscaler-5d5695b54f-8c4xn 20m (0%) 0 (0%) 10Mi (0%) 0 (0%) 59m
kube-system kube-proxy-n4ht9 100m (1%) 0 (0%) 0 (0%) 0 (0%) 56m
kube-system kubernetes-dashboard-6f697bd9f5-dvg9l 100m (1%) 100m (1%) 50Mi (0%) 500Mi (0%) 59m
kube-system metrics-server-566bd9b4f7-f7bfx 0 (0%) 0 (0%) 0 (0%) 0 (0%) 59m
kube-system tunnelfront-54d584d6c7-n9wkj 10m (0%) 0 (0%) 64Mi (0%) 0 (0%) 59m
mssql-cluster controldb-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 46m
mssql-cluster data-0-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster gateway-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster master-1 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster metricsdb-0 0 (0%) 0 (0%) 0 (0%) 0 (0%) 41m
mssql-cluster metricsdc-94tbx 500m (6%) 0 (0%) 256Mi (0%) 1Gi (1%) 41m
mssql-cluster metricsui-wrvbk 0 (0%) 0 (0%) 0 (0%) 0 (0%) 41m
mssql-cluster mgmtproxy-z86nr 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 41m
mssql-cluster nmnode-0-1 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster sparkhead-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster storage-0-0 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster storage-0-2 100m (1%) 0 (0%) 100Mi (0%) 0 (0%) 29m
mssql-cluster zookeeper-1 600m (7%) 0 (0%) 2148Mi (3%) 0 (0%) 29m
mssql-cluster zookeeper-2 600m (7%) 0 (0%) 2148Mi (3%) 0 (0%) 29m
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 3030m (38%) 100m (1%)
memory 5716Mi (9%) 1864Mi (3%)
ephemeral-storage 0 (0%) 0 (0%)
attachable-volumes-azure-disk 0 0
...
6. ストレージを確認。
- 合計 44 本
>kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-2aefad27-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-nmnode-0-0 default 30m
pvc-2af0f46e-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-nmnode-0-0 default 30m
pvc-2af56cd9-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-nmnode-0-1 default 30m
pvc-2afc3216-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-nmnode-0-1 default 30m
pvc-2b224d13-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-compute-0-0 default 30m
pvc-2b244ec7-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-compute-0-0 default 30m
pvc-2c3b49ba-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-data-0-0 default 30m
pvc-2c40353a-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-data-0-0 default 30m
pvc-2c57b45c-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-data-0-1 default 30m
pvc-2c5e3f11-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-data-0-1 default 30m
pvc-2df0dc93-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-gateway-0 default 30m
pvc-2df46634-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-gateway-0 default 30m
pvc-2e05da4b-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-zookeeper-0 default 30m
pvc-2e0a55a4-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-zookeeper-0 default 30m
pvc-2e15c91c-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-zookeeper-1 default 30m
pvc-2e1d5eb1-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-zookeeper-1 default 30m
pvc-2e28190f-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-zookeeper-2 default 30m
pvc-2e2fc20a-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-zookeeper-2 default 30m
pvc-38b9bc73-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-master-0 default 30m
pvc-38bd5e90-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-master-0 default 30m
pvc-38c41485-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-master-1 default 30m
pvc-38c74637-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-master-1 default 30m
pvc-38cec031-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-master-2 default 30m
pvc-38d4ca12-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-master-2 default 30m
pvc-3da710d8-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-sparkhead-0 default 30m
pvc-3da861a7-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-sparkhead-0 default 30m
pvc-3db16c8e-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-sparkhead-1 default 30m
pvc-3db85731-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-sparkhead-1 default 30m
pvc-3dd12237-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-storage-0-0 default 30m
pvc-3dd2eb0b-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-storage-0-0 default 30m
pvc-3ddba73f-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-storage-0-1 default 30m
pvc-3de3b549-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-storage-0-1 default 30m
pvc-3de9b1d4-1cbe-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-storage-0-2 default 30m
pvc-3ded9b05-1cbe-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-storage-0-2 default 30m
pvc-7dc2e05b-1cbc-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-metricsdb-0 default 42m
pvc-7dc64f44-1cbc-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-metricsdb-0 default 42m
pvc-7ee0d66f-1cbc-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-logsdb-0 default 42m
pvc-7ee414ad-1cbc-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-logsdb-0 default 42m
pvc-d6ed6120-1cbb-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-controller default 47m
pvc-d7004244-1cbb-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-controller default 47m
pvc-d710af64-1cbb-11ea-a20b-dab52d93f0d4 10Gi RWO Delete Bound mssql-cluster/logs-controldb default 47m
pvc-d72065ea-1cbb-11ea-a20b-dab52d93f0d4 15Gi RWO Delete Bound mssql-cluster/data-controldb default 47m
azdata を使った確認
kubectl だけでなく、azdata でクラスタを確認、操作することができます。
1. クラスタへログイン。
azdata login -n mssql-cluster -n admin -p <password>
2. SQL Server プライマリインスタンスのエンドポイントをクエリ。
>azdata bdc endpoint list -e sql-server-master -o table
Description Endpoint Name Protocol
------------------------------------ ------------------- ----------------- ----------
SQL Server Master Instance Front-End 52.xxx.xx.171,31433 sql-server-master tds
3. SQL Server セカンダリインスタンスのエンドポイントをクエリ。
>azdata bdc endpoint list -e sql-server-master-readonly -o table
Description Endpoint Name Protocol
--------------------------------------------- ------------------- -------------------------- ---あ-------
SQL Server Master Readable Secondary Replicas 52.xxx.xx.244,31436 sql-server-master-readonly tds
4. ステータスを確認。
>azdata bdc status show
Mssql-cluster: ready Health Status: healthy
=======================================================================================================
Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Servicename State Healthstatus Details
sql ready healthy -
hdfs ready healthy -
spark ready healthy -
control ready healthy -
gateway ready healthy -
app ready healthy -
Sql Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Resourcename State Healthstatus Details
master ready healthy StatefulSet master is healthy
compute-0 ready healthy StatefulSet compute-0 is healthy
data-0 ready healthy StatefulSet data-0 is healthy
storage-0 ready healthy StatefulSet storage-0 is healthy
Hdfs Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Resourcename State Healthstatus Details
nmnode-0 ready healthy StatefulSet nmnode-0 is healthy
zookeeper ready healthy StatefulSet zookeeper is healthy
storage-0 ready healthy StatefulSet storage-0 is healthy
sparkhead ready healthy StatefulSet sparkhead is healthy
Spark Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Resourcename State Healthstatus Details
sparkhead ready healthy StatefulSet sparkhead is healthy
storage-0 ready healthy StatefulSet storage-0 is healthy
Control Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Resourcename State Healthstatus Details
controldb ready healthy StatefulSet controldb is healthy
control ready healthy ReplicaSet control is healthy
metricsdc ready healthy DaemonSet metricsdc is healthy
metricsui ready healthy ReplicaSet metricsui is healthy
metricsdb ready healthy StatefulSet metricsdb is healthy
logsui ready healthy ReplicaSet logsui is healthy
logsdb ready healthy StatefulSet logsdb is healthy
mgmtproxy ready healthy ReplicaSet mgmtproxy is healthy
controlwd ready healthy ReplicaSet controlwd is healthy
Gateway Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Resourcename State Healthstatus Details
gateway ready healthy StatefulSet gateway is healthy
App Services: ready Health Status: healthy
-------------------------------------------------------------------------------------------------------
Resourcename State Healthstatus Details
appproxy ready healthy ReplicaSet appproxy is healthy
ADS からの接続
最後に ADS から接続して操作をしてみます。
1. ADS からプライマリエンドポイントへ接続。以下のクエリを発行。
CREATE DATABASE TestDB;
GO
USE TestDB;
GO
CREATE TABLE TestTable1(ID int);
INSERT INTO TestTable1 VALUES(0),(1),(2),(3);
SELECT * FROM TestTable1;
2. セカンダリエンドポイントに接続。以下のクエリを発行して読み取りができることを確認。
USE TestDB;
SELECT * FROM TestTable1;
3. 引き続き以下のクエリを発行して読み取り以外はできないことを確認。
INSERT INTO TestTable1 VALUES (5);
環境の停止
使わない場合は、これまで通り必要に応じて環境を停止してください。
まとめ
以前は SQL Server の高可用性を構成するために Windows クラスターを組んだり、いろいろ大変でしたが、今回は通常の構成と同じ手順で作成ができました。必要となるリソースだけ事前に計算してしっかり確保してから構築を行ってください。次回はクラスタの管理についてみていきます。