Vitess の helm の完成後がまだまだっぽくて Issue を上げたりもしてるけど Shard 不要な要件なら他の選択肢も持っておくべきだろうなということで探してみると mysql-operator が Oracle からと Presslabs から公開されていた。Oracle の方は開発が停滞しているっぽいので除外。Presslabs は WordPress のホスティング業者で wordpress-operator も公開されている。利用者のサイト単位で wordpress と mysql がデプロイされるっぽい。
デプロイ方法は Getting started with MySQL operator にあります。
とりあえず動かすだけなら helm で mysql-operator をインストールして
helm repo add presslabs https://presslabs.github.io/charts
helm install presslabs/mysql-operator --name mysql-operatorユーザー、パスワード用の Secrets (example-cluster-secret.yaml) を登録後に kind: MysqlCluster を apply するだけです。
kubectl apply -f https://raw.githubusercontent.com/presslabs/mysql-operator/master/examples/example-cluster-secret.yaml
kubectl apply -f https://raw.githubusercontent.com/presslabs/mysql-operator/master/examples/example-cluster.yamlexample-cluster.yaml はコメントを除くとこれだけです。コメントを見るといろいろ調整できそうなことがわかります。
| |
Minikube への deploy
Minikube の起動
パラメータは適当に。
| |
helm の install
helm 3 にも対応しているようですが、ここでは都合により helm 2 を使っています。
helm バイナリのダウンロードは GitHub などから。
| |
PersistentVolume の作成
MySQL の Data ディレクトリにも使えますが、mysql-operator 内の orchestrator が SQLite のファイルを保存する先として使います。
| |
| |
mysql-operator の deploy
ここでは minikube なので orchestrator の Web UI へのアクセスに NodePort を使うように mysql-operator の deploy 時にちょっとカスタマイズしてみます。次の内容の mysql-operator-values.yaml というファイルを用意して
| |
次のコマンドで deploy します。
helm repo add presslabs https://presslabs.github.io/charts
helm install presslabs/mysql-operator --name mysql-operator -f mysql-operator-values.yamlこれで mysqlbackups.mysql.presslabs.org と mysqlclusters.mysql.presslabs.org という2つの Custom Resource Definitions (CRD) が作成されています。また、mysql-operator と orchestrator を含む StatefulSets が deploy されています。
MySQL クラスタの depeloy
最初に書いたように kubectl apply でも deploy 可能ですが、 mysql-operator を使って MySQL クラスタを deploy するための mysql-cluster chart もあるのでこれを使います。
次の内容で mysql-cluster-values.yaml というファイルを作成します。(ファイル名は何でも良いですが)
| |
helm install presslabs/mysql-cluster --name mycluster -f mysql-cluster-values.yamlすると、しばらくして次のような状況になります。
$ kubectl get all,secrets,configmaps
NAME READY STATUS RESTARTS AGE
pod/mycluster-mysql-cluster-db-mysql-0 4/4 Running 0 6m4s
pod/mycluster-mysql-cluster-db-mysql-1 4/4 Running 0 4m33s
pod/mycluster-mysql-cluster-db-mysql-2 4/4 Running 0 3m42s
pod/mysql-operator-0 2/2 Running 0 52m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 36h
service/mycluster-mysql-cluster-db-mysql ClusterIP 10.105.17.16 3306/TCP 6m4s
service/mycluster-mysql-cluster-db-mysql-master ClusterIP 10.98.186.169 3306/TCP 6m4s
service/mysql ClusterIP None 3306/TCP,9125/TCP 6m4s
service/mysql-operator NodePort 10.108.47.3 80:32328/TCP 52m
service/mysql-operator-0-svc ClusterIP 10.102.82.83 80/TCP,10008/TCP 52m
NAME READY AGE
statefulset.apps/mycluster-mysql-cluster-db-mysql 3/3 6m4s
statefulset.apps/mysql-operator 1/1 52m
NAME TYPE DATA AGE
secret/default-token-92lnd kubernetes.io/service-account-token 3 36h
secret/mycluster-mysql-cluster-db Opaque 5 6m4s
secret/mycluster-mysql-cluster-db-backup Opaque 3 6m4s
secret/mycluster-mysql-cluster-db-mysql-operated Opaque 10 6m4s
secret/mysql-operator-orc Opaque 2 52m
secret/mysql-operator-token-h82jw kubernetes.io/service-account-token 3 52m
NAME DATA AGE
configmap/mycluster-mysql-cluster-db-mysql 1 6m4s
configmap/mysql-operator-leader-election 0 52m
configmap/mysql-operator-orc 2 52m Database 確認
service/mycluster-mysql-cluster-db-mysql-master の 3306/tcp にアクセスすれば Master の MySQL に接続することができます。-master suffix がつかない方の Service は Master も含んだ healthy=yes の Pod の集合です。
| |
指定した wordpress というデータベースの他に sys_operator というデータベースが存在します。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| sys_operator |
| wordpress |
+--------------------+
6 rows in set (0.00 sec)この sys_operator は mysql-operator の中で監視やら起動確認に使われています。
mysql> show tables;
+------------------------+
| Tables_in_sys_operator |
+------------------------+
| heartbeat |
| status |
+------------------------+
2 rows in set (0.00 sec)Orchestrator の Web UI を確認する
mysql-operator はクラスタの topology 管理に Orchestrator を採用しています。Orchestrator については “「MySQL High Availability tools」のフォローアップとorchestratorの追加” かその原文(作者著)が詳しいです。
これには Web UI がついているので次のコマンドでアクセスしてみます。これでアクセス出来るように operator の deploy 時に NodePort に変更しました。
minikube service mysql-operatorOrchestrator の Dashboard にはクラスタの一覧が表示されます。mysql-operator で deploy されるクラスタは一組の orchestrator で管理されるのでここに追加されていきます。

クラスタを選択すると replication の topology が見えます。これは 3 node クラスタの例。

mysql-operator の helm chart は replica 数がデフォルトで1ですが、orchestrator は Raft でクラスタが組めるようになっているため冗長構成にもできそうです。
先ほどの sys_operator.heartbeat テーブルは orchestrator の SlaveLagQuery という設定から参照されています。
続く
長くなったので failover とか backup とかは別記事にしよう。
おまけ
Vitess は PlanetScale の vitess-operator の方が出来が良さそうです。こちらは彼らが Vitess をサービスとして提供しておりそこで使われているものをベースに彼らの infra に依存する部分を無くして公開しているようです。まだ PRE-RELEASE 状態だということですが。

