MongoDBとKubernetesは、特に複雑さの点で優れた組み合わせです。それでも、PerconaのMongoDB(PSMDB)は、NoSQLデータベースの柔軟性を高め、今日の生産性を高めるための効率的なツールも備えています。オンプレミスだけでなく、クラウドネイティブでも利用できます。
Kubernetesの採用率は着実に増加しています。テクノロジーには、次のことを行うためのオペレーターが必要であることが合理的です:MongoDB環境用のPercona Serverのアイテムの作成、変更、および削除。 Percona MongoDB Kubernetes Operatorには、MongoDBインスタンスの一貫したPerconaサーバーを維持するために必要なk8s設定が含まれています。別のオプションとして、これをhttps://github.com/kubedb/mongodbと比較することもできますが、KubeDB for MongoDBは、特に実稼働グレードのシステムで提供できるオプションが非常に限られています。
その構成を誇るPerconaKubernetesオペレーターは、PSMDBレプリカセットの構成のベストプラクティスに基づいており、それに従っています。最も重要なことは、MongoDB自体のオペレーターには多くの利点がありますが、時間を節約するために、一貫した環境が最も重要です。このブログでは、これが特にコンテナ化された環境でどのように役立つかについて概要を説明します。
このオペレーターは何を提供できますか?
この演算子は、レプリカセットを使用するPSMDBに役立ちます。つまり、データベース設計アーキテクチャは、以下の図に準拠している必要があります
Perconaのドキュメントデザインの概要から借用した画像現在、このオペレーターがサポートしているプラットフォームは次のとおりです。
- OpenShift 3.11
- OpenShift 4.5
- Google Kubernetes Engine(GKE)1.15-1.17
- Amazon Elastic Container Service for Kubernetes(EKS)1.15
- Minikube 1.10
- VMWareタンズ
他のKubernetesプラットフォームも機能する可能性がありますが、テストされていません。
公式にサポートされているプラットフォームを実行しているクラスターには、次のリソースを備えた少なくとも3つのノードが含まれています。
- 2GBのRAM
Kubernetesはポッドを作成するときと同じように機能し、各ポッドはクラスターの内部仮想ネットワークにIPアドレスを持っています。ポッドの作成または破棄はどちらも動的なプロセスであるため、ポッド間の通信に割り当てられた特定のIPアドレスにポッドをバインドすることはお勧めしません。これにより、クラスターのスケーリング、不注意によるミス、DCの停止や災害、定期的なメンテナンスなどの結果として、時間の経過とともに状況が変化するため、問題が発生する可能性があります。その場合、オペレーターは、Kubernetes内部経由でMongoDB用のPerconaサーバーに接続することを強くお勧めします。 URI内のDNS名(例:mongodb + srv:// userAdmin:[email protected]
Minikubeを使用する場合、プラットフォーム固有の次の制限があります。 Minikubeは、Operatorのデフォルトのアフィニティ要件と衝突するローカルな性質のため、マルチノードクラスタ構成をサポートしていません。これを調整するために、MinikubeでのMongoDB用のPerconaサーバーのインストール手順には、3つ以上のノードを持つという要件をオフにする追加の手順が含まれています。
このブログの次のセクションでは、Minikubeを使用してPMSDB Kubernetes Operatorをセットアップし、それを機能させるために設定された非アフィニティ性に従います。これは、アンチアフィニティを使用する場合とどのように異なりますか。アンチアフィニティを変更すると、クラスタの可用性のリスクが高まります。たとえば、PSMDBをコンテナ化された環境にデプロイする主な目的が、分散し、より高い可用性とスケーラビリティを実現することである場合、これは目的を損なう可能性があります。ただし、Minikubeを特にオンプレミスで使用し、PSMDBセットアップをテストすることは可能ですが、本番ワークロードの場合は、ノードを別々のホストで実行するか、複数のポッドの同時障害が発生する可能性が低いような環境セットアップで実行する必要があります。
PSMDBを使用したデータセキュリティのために、オペレーターは転送中のTLS / SSLを提供し、データが保存されているときに暗号化も提供します。転送中の場合、選択できるオプションは、cert-managerを使用するか、独自の証明書を手動で生成することです。もちろん、オプションで、このオペレーターにTLSなしでPSMDBを使用できます。 TLSの使用に関するドキュメントを確認してください。
保存データの場合、githubブランチをダウンロードした後、PSMDB Kubernetesオペレーター内で変更を加え、deploy/cr.yamlファイルに変更を適用する必要があります。これを有効にするには、ドキュメントで提案されているように次の手順を実行します。
- security.enableEncryptionキーはtrue(デフォルト値)に設定する必要があります。
- security.encryptionCipherModeキーは、復号化に適切な暗号モードを指定する必要があります。値は、次の2つのバリアントのいずれかになります。
- AES256-CBC(MongoDBのOperatorおよびPercona Serverのデフォルト)
- AES256-GCM
security.encryptionKeySecret should specify a secret object with the encryption key:
mongod:
...
security:
...
encryptionKeySecret: my-cluster-name-mongodb-encryption-key
暗号化キーシークレットが存在しない場合は、自動的に作成されます。自分で作成する場合は、キーがbase64でエンコードされた32文字の文字列である必要があることを考慮してください。
PSMDB Kubernetesオペレーターは、Kubernetesシークレットを使用して機密情報を保存および管理します。 Kubernetesシークレットを使用すると、パスワード、OAuthトークン、sshキーなどの機密情報を保存および管理できます。シークレットに機密情報を保存する方が、ポッド定義やコンテナイメージにそのまま保存するよりも安全で柔軟性があります。
このオペレーターの場合、ポッド用に生成されたユーザーとパスワードが保存され、kubectl get secrets
このブログの場合、セットアップ例では、デコードされたbase64の結果で次のようになります。
kubectl get secrets mongodb-cluster-s9s-secrets -o yaml | egrep '^\s+MONGODB.*'|cut -d ':' -f2 | xargs -I% sh -c "echo % | base64 -d; echo "
WrDry6bexkCPOY5iQ
backup
gAWBKkmIQsovnImuKyl
clusterAdmin
qHskMMseNqU8DGbo4We
clusterMonitor
TQBEV7rtE15quFl5
userAdmin
バックアップ、クラスターユーザー、クラスターモニターユーザー、および管理用ユーザーの各エントリは、上記の結果に基づいて表示されます。
もう1つ、PSMDB Kubernetes Operatorは、Kubernetesシークレットを介してAWSS3アクセスキーとシークレットキーも保存します。
この演算子は、非常に優れた機能であるバックアップをサポートします。オンデマンド(手動)バックアップとスケジュールバックアップをサポートし、MongoDB用のバックアップツールPerconaBackupを使用します。バックアップはAWSS3またはS3互換のストレージにのみ保存されることに注意してください。
スケジュールされたバックアップは、deploy / cr.yamlファイルを介して定義できますが、手動バックアップの作成は、必要なときにいつでも実行できます。 S3アクセスとシークレットキーの場合、ファイルdeploy / backup-s3.yamlファイルで定義され、前述のようにKubernetesシークレットを使用して次の情報を保存します。
MinikubeでPSMDBKubernetes演算子を使用する
このセクションでは、KubernetesとMinikubeを使用した簡単なセットアップを維持します。これは、クラウドプロバイダーを必要とせずにオンプレミスで使用できます。特にエンタープライズグレードおよびプロダクショングレードの環境向けのクラウドネイティブセットアップの場合は、ドキュメントを確認してください。
手順を進める前に、前述のように、Minikubeはオペレーターのデフォルトのアフィニティ要件と競合するマルチノードクラスター構成をサポートしていないため、既知の制限があることに注意してください。これについては、以下の手順で処理する方法について説明します。
このブログでは、MinikubeがインストールされるホストOSはUbuntu 18.04(Bionic Beaver)です。
Minikubeをインストールしましょう
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
$ sudo dpkg -i minikube_latest_amd64.deb
オプションで、異なるLinuxシステムを使用している場合は、ここの手順に従うことができます。
Kubernetesパッケージを認証し、リポジトリをセットアップするために必要なキーを追加しましょう
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ cat <<eof > /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
deb https://apt.kubernetes.io/ kubernetes-yakkety main
eof
それでは、必要なパッケージをインストールしましょう
$ sudo apt-get update
$ sudo apt-get install kubelet kubeadm kubectl
Minikubeを起動して、メモリ、CPUの数、およびノードを割り当てるCIDRを定義します。
$ minikube start --memory=4096 --cpus=3 --extra-config=kubeadm.pod-network-cidr=192.168.0.0/16
結果の例は次のようになります。
minikube v1.14.2 on Ubuntu 18.04
Automatically selected the docker driver
docker is currently using the aufs storage driver, consider switching to overlay2 for better performance
Starting control plane node minikube in cluster minikube
Creating docker container (CPUs=3, Memory=4096MB) ...
Preparing Kubernetes v1.19.2 on Docker 19.03.8 ...
kubeadm.pod-network-cidr=192.168.0.0/16
> kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm: 37.30 MiB / 37.30 MiB [---------------] 100.00% 1.46 MiB p/s 26s
> kubectl: 41.01 MiB / 41.01 MiB [---------------] 100.00% 1.37 MiB p/s 30s
> kubelet: 104.88 MiB / 104.88 MiB [------------] 100.00% 1.53 MiB p/s 1m9s
Verifying Kubernetes components...
Enabled addons: default-storageclass, storage-provisioner
Done! kubectl is now configured to use "minikube" by default
お気づきのとおり、ノードまたはポッドを管理するためのユーティリティツールもインストールされます。
それでは、次のコマンドを実行してノードとポッドを確認しましょう。
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-f9fd979d6-gwngd 1/1 Running 0 45s
kube-system etcd-minikube 0/1 Running 0 53s
kube-system kube-apiserver-minikube 1/1 Running 0 53s
kube-system kube-controller-manager-minikube 0/1 Running 0 53s
kube-system kube-proxy-m25hm 1/1 Running 0 45s
kube-system kube-scheduler-minikube 0/1 Running 0 53s
kube-system storage-provisioner 1/1 Running 1 57s
$ kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready master 2d4h v1.19.2 192.168.49.2 <none> Ubuntu 20.04 LTS 4.15.0-20-generic docker://19.3.8
次に、PSMDBKubernetesオペレーターをダウンロードします
$ git clone -b v1.5.0 https://github.com/percona/percona-server-mongodb-operator
$ cd percona-server-mongodb-operator
これで、オペレーターをデプロイする準備が整いました。
$ kubectl apply -f deploy/bundle.yaml
前述のように、Minikubeの制限により、期待どおりに動作するように調整する必要があります。次のことをしましょう:
- 現在のハードウェア容量に応じて、ドキュメントで提案されているように、以下を変更する場合があります。 minikubeはローカルで実行されるため、デフォルトのdeploy / cr.yamlファイルを編集して、限られたリソースでのローカルインストールにOperatorを適合させる必要があります。 replsetsセクションで次のキーを変更します。
- resources.requests.memoryキーとresources.requests.cpuキーにコメントします(これは、minikubeのデフォルトの制限でOperatorに適合します)
- アフィニティ.antiAffinityTopologyKeyキーを「none」に設定します(オペレーターはクラスターを複数のノードに分散できなくなります)
- また、allowUnsafeConfigurationsキーをtrueに切り替えます(このオプションは、クラスター構成に対するオペレーターの制御をオフにし、Percona Server for MongoDBを1ノードクラスターとしてデプロイできるようにします)。
これで、deploy/cr.yamlファイルに加えられた変更を適用する準備が整いました。
$ kubectl apply -f deploy/cr.yaml
この時点で、ポッドのステータスを確認できる可能性があり、次のような進行状況に気付くでしょう。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
percona-server-mongodb-operator-588db759d-qjv29 0/1 ContainerCreating 0 15s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 0/2 Init:0/1 0 4s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 34s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 0/2 PodInitializing 0 119s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2m29s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 0/2 PodInitializing 0 2m1s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2m31s
kubectl get pods
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 33m
mongodb-cluster-s9s-rs0-1 2/2 Running 1 31m
mongodb-cluster-s9s-rs0-2 2/2 Running 0 30m
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 33m
もうすぐです。作成されたPSMDBポッドに接続できるように、オペレーターによって生成されたシークレットを取得します。これを行うには、最初にシークレットオブジェクトを一覧表示してから、yamlの値を取得して、ユーザーとパスワードの組み合わせを取得できるようにする必要があります。一方、以下の組み合わせコマンドは、username:password形式で使用できます。以下の例を参照してください
$ kubectl get secrets
NAME TYPE DATA AGE
default-token-c8frr kubernetes.io/service-account-token 3 2d4h
internal-mongodb-cluster-s9s-users Opaque 8 2d4h
mongodb-cluster-s9s-mongodb-encryption-key Opaque 1 2d4h
mongodb-cluster-s9s-mongodb-keyfile Opaque 1 2d4h
mongodb-cluster-s9s-secrets Opaque 8 2d4h
percona-server-mongodb-operator-token-rbzbc kubernetes.io/service-account-token 3 2d4h
$ kubectl get secrets mongodb-cluster-s9s-secrets -o yaml | egrep '^\s+MONGODB.*'|cut -d ':' -f2 | xargs -I% sh -c "echo % | base64 -d; echo" |sed 'N; s/\(.*\)\n\(.*\)/
\2:\1/'
backup:WrDry6bexkCPOY5iQ
clusterAdmin:gAWBKkmIQsovnImuKyl
clusterMonitor:qHskMMseNqU8DGbo4We
userAdmin:TQBEV7rtE15quFl5
これで、username:password形式を基にして、安全な場所に保存できます。
MongoDBノードのPerconaサーバーに直接接続できないため、mongodbクライアントを含む新しいポッドを作成する必要があります。
$ kubectl run -i --rm --tty percona-client --image=percona/percona-server-mongodb:4.2.8-8 --restart=Never -- bash -il
これで、PSMDBノードに接続する準備が整いました。
bash-4.2$ mongo "mongodb+srv://userAdmin:[email protected]/admin?replicaSet=rs0&ssl=false"
または、個々のノードに接続して、その状態を確認することもできます。たとえば、
bash-4.2$ mongo --host "mongodb://clusterAdmin:[email protected]:27017/?authSource=admin&ssl=false"
Percona Server for MongoDB shell version v4.2.8-8
connecting to: mongodb://mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb&ssl=false
Implicit session: session { "id" : UUID("9b29b9b3-4f82-438d-9857-eff145be0ee6") }
Percona Server for MongoDB server version: v4.2.8-8
Welcome to the Percona Server for MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://www.percona.com/doc/percona-server-for-mongodb
Questions? Try the support group
https://www.percona.com/forums/questions-discussions/percona-server-for-mongodb
2020-11-09T07:41:59.172+0000 I STORAGE [main] In File::open(), ::open for '/home/mongodb/.mongorc.js' failed with No such file or directory
Server has startup warnings:
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten] ** WARNING: While invalid X509 certificates may be used to
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten] ** connect to this server, they will not be considered
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten] ** permissible for authentication.
2020-11-09T06:41:16.838+0000 I CONTROL [initandlisten]
rs0:SECONDARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2020-11-09T07:42:04.984Z"),
"myState" : 2,
"term" : NumberLong(5),
"syncingTo" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceHost" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceId" : 0,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"lastCommittedWallTime" : ISODate("2020-11-09T07:42:03.395Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"readConcernMajorityWallTime" : ISODate("2020-11-09T07:42:03.395Z"),
"appliedOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"durableOpTime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"lastAppliedWallTime" : ISODate("2020-11-09T07:42:03.395Z"),
"lastDurableWallTime" : ISODate("2020-11-09T07:42:03.395Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1604907678, 3),
"lastStableCheckpointTimestamp" : Timestamp(1604907678, 3),
"members" : [
{
"_id" : 0,
"name" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3632,
"optime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDurable" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDate" : ISODate("2020-11-09T07:42:03Z"),
"optimeDurableDate" : ISODate("2020-11-09T07:42:03Z"),
"lastHeartbeat" : ISODate("2020-11-09T07:42:04.246Z"),
"lastHeartbeatRecv" : ISODate("2020-11-09T07:42:03.162Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1604904092, 1),
"electionDate" : ISODate("2020-11-09T06:41:32Z"),
"configVersion" : 3
},
{
"_id" : 1,
"name" : "mongodb-cluster-s9s-rs0-1.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3632,
"optime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDurable" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDate" : ISODate("2020-11-09T07:42:03Z"),
"optimeDurableDate" : ISODate("2020-11-09T07:42:03Z"),
"lastHeartbeat" : ISODate("2020-11-09T07:42:04.244Z"),
"lastHeartbeatRecv" : ISODate("2020-11-09T07:42:04.752Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceHost" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceId" : 2,
"infoMessage" : "",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "mongodb-cluster-s9s-rs0-2.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3651,
"optime" : {
"ts" : Timestamp(1604907723, 4),
"t" : NumberLong(5)
},
"optimeDate" : ISODate("2020-11-09T07:42:03Z"),
"syncingTo" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceHost" : "mongodb-cluster-s9s-rs0-0.mongodb-cluster-s9s-rs0.default.svc.cluster.local:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 3,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604907723, 4),
"signature" : {
"hash" : BinData(0,"HYC0i49c+kYdC9M8KMHgBdQW1ac="),
"keyId" : NumberLong("6892206918371115011")
}
},
"operationTime" : Timestamp(1604907723, 4)
}
オペレーターがクラスターの整合性を管理するため、障害が発生した場合、またはポッドが削除された場合はいつでも。オペレーターは自動的に新しいものを開始します。たとえば、
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m7s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
$ kubectl delete po mongodb-cluster-s9s-rs0-1
pod "mongodb-cluster-s9s-rs0-1" deleted
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 0/2 Init:0/1 0 3s
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m29s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 0/2 PodInitializing 0 10s
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m36s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mongodb-cluster-s9s-rs0-0 2/2 Running 0 2d5h
mongodb-cluster-s9s-rs0-1 2/2 Running 0 26s
mongodb-cluster-s9s-rs0-2 2/2 Running 0 2d5h
percona-client 1/1 Running 0 3m52s
percona-server-mongodb-operator-588db759d-qjv29 1/1 Running 0 2d5h
これですべての設定が完了しました。もちろん、ポートを公開する必要があるかもしれないので、deploy/cr.yamlで調整を処理する必要があるかもしれません。ここを参照して対処できます。
PSMDBのPerconaKubernetesオペレーターは、特にMongoDBセットアップ用のPerconaサーバーのコンテナー化された環境の完全なソリューションになります。レプリカセットに冗長性が組み込まれているにもかかわらず、オペレーターがバックアップ、スケーラビリティ、高可用性、およびセキュリティをサポートしているため、ほぼ完全なソリューションです。