diff --git a/docs/guides/mysql/replication-mode-transform/overview/index.md b/docs/guides/mysql/replication-mode-transform/overview/index.md index 763666c8c7..0cd3a5b8f0 100644 --- a/docs/guides/mysql/replication-mode-transform/overview/index.md +++ b/docs/guides/mysql/replication-mode-transform/overview/index.md @@ -14,7 +14,46 @@ section_menu_id: guides # MySQL Replication Mode Transform -This guide will give an overview on how KubeDB Ops Manager transform replication mode of `MySQL`. Currently, you can transform `remote replica` to `group replication`. +This guide will give an overview on how KubeDB Ops Manager transforms the replication mode of a `MySQL` database — including **promoting a standalone MySQL into a clustered topology** and switching an existing cluster from one topology to another. + +Two step-by-step guides build on this overview: + +- [MySQL Topology Mode Change](/docs/guides/mysql/replication-mode-transform/topology-mode-change/index.md) — change the mode of an + existing database: standalone → `GroupReplication` (Single-Primary or Multi-Primary) / + `InnoDBCluster` / `SemiSync`, and changes between clustered topologies. +- [MySQL Remote/Read Only Replica Mode Transfer](/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/index.md) — + transform a Remote Replica into a standalone or clustered database. + +## Supported Transformations + +The target topology is selected with `spec.replicationModeTransformation.targetTopologyMode`, which accepts +`GroupReplication` (default), `InnoDBCluster` or `SemiSync`. + +Transformation is supported **from a `Standalone` or a `RemoteReplica` source**. Transforming one +clustered topology into another is not supported yet. + +| From (source) | To `GroupReplication` | To `InnoDBCluster` | To `SemiSync` | +|---------------|:---------------------:|:------------------:|:-------------:| +| **Standalone** (no `spec.topology`) | ✅ | ✅ | ✅ | +| **RemoteReplica** | ✅ | ✅ | ✅ | +| **GroupReplication** | — | ❌ not supported yet | ❌ not supported yet | +| **InnoDBCluster** | ❌ not supported yet | — | ❌ not supported yet | +| **SemiSync** | ❌ not supported yet | ❌ not supported yet | — | + +Notes: + +- **Your data is preserved.** Promotions and transformations never delete a volume. When a new + replica has to be seeded, it is seeded in place with MySQL's `CLONE INSTANCE`, which overwrites + the data directory while the `PersistentVolumeClaim` is retained. +- **Cluster-to-cluster transformation is not supported.** A database that already runs a clustered + topology (`GroupReplication`, `InnoDBCluster` or `SemiSync`) cannot be transformed into a + different one. Apply the transformation only to a `Standalone` or `RemoteReplica` database. +- A standalone database is scaled up to at least 3 members when it is promoted, since a clustered + topology needs a quorum. +- `spec.replicationModeTransformation.mode` selects the Group Replication primary mode — + **`Single-Primary`** (default) or **`Multi-Primary`** (multi-master, every member accepts writes). + It applies to the group-based targets; it is ignored for `SemiSync`. +- Replication Mode Transformation requires MySQL **8.4.2 or newer**. ## Before You Begin diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/issuer.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/issuer.yaml similarity index 100% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/issuer.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/issuer.yaml diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mode-transform-ops-request.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mode-transform-ops-request.yaml similarity index 89% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mode-transform-ops-request.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mode-transform-ops-request.yaml index 7dcd827116..5417335e27 100644 --- a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mode-transform-ops-request.yaml +++ b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mode-transform-ops-request.yaml @@ -8,7 +8,8 @@ spec: databaseRef: name: mysql-london replicationModeTransformation: - mode: Multi-Primary + targetTopologyMode: GroupReplication + mode: Single-Primary requireSSL: true issuerRef: apiGroup: cert-manager.io diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-ingress.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-ingress.yaml similarity index 100% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-ingress.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-ingress.yaml diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-london-auth.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-london-auth.yaml similarity index 100% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-london-auth.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-london-auth.yaml diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-london.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-london.yaml similarity index 100% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-london.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-london.yaml diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-singapore-auth.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-singapore-auth.yaml similarity index 100% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-singapore-auth.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-singapore-auth.yaml diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-singapore.yaml b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-singapore.yaml similarity index 100% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-singapore.yaml rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-singapore.yaml diff --git a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/index.md b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/index.md similarity index 90% rename from docs/guides/mysql/replication-mode-transform/replication-mode-transform/index.md rename to docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/index.md index ecd2f43970..95eb98464a 100644 --- a/docs/guides/mysql/replication-mode-transform/replication-mode-transform/index.md +++ b/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/index.md @@ -1,9 +1,9 @@ --- -title: MySQL Replication Mode Transform +title: MySQL Remote/Read Only Replica Mode Transfer menu: docs_{{ .version }}: - identifier: guides-mysql-replication-mode-transform - name: MySQL Replication Mode Transform + identifier: guides-mysql-remote-replica-mode-transfer + name: Remote/Read Only Replica Mode Transfer parent: guides-mysql-mode-transform weight: 12 menu_name: docs_{{ .version }} @@ -12,9 +12,22 @@ section_menu_id: guides > New to KubeDB? Please start [here](/docs/README.md). -## MySQL Replication Mode Transform +## MySQL Remote/Read Only Replica Mode Transfer -This guide will show you how to use the `KubeDB` OpsRequest operator to transform the replication mode of a MySQL database. Currently, transforming from Remote Replica to Group Replication is supported. +This guide shows how to use the `KubeDB` OpsRequest operator to transform a **Remote Replica +(read-only replica)** into a clustered topology — for example when the primary cluster is gone and +you want to promote the remote replica into a self-standing cluster. + +> Looking to change the mode of an existing database (standalone → cluster, or between clustered +> topologies)? See [MySQL Topology Mode Change](/docs/guides/mysql/replication-mode-transform/topology-mode-change/index.md). + +The target topology is chosen with `spec.replicationModeTransformation.targetTopologyMode`. See the +[overview](/docs/guides/mysql/replication-mode-transform/overview/index.md) for the full support +matrix. + +> **Note:** Replication Mode Transformation requires MySQL **8.4.2 or newer**. +> `spec.replicationModeTransformation.mode` supports both **`Single-Primary`** (default) and +> **`Multi-Primary`** (multi-master). ### MySQL Remote Replica @@ -84,7 +97,7 @@ spec: Let’s create the `Issuer` cr we have shown above, ```bash -kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/issuer.yaml +kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/issuer.yaml issuer.cert-manager.io/mysql-issuer created ``` @@ -102,7 +115,7 @@ metadata: type: kubernetes.io/basic-auth ``` ```bash -$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-singapore-auth.yaml +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-singapore-auth.yaml secret/mysql-singapore-auth created ``` ### Deploy MySQL with TLS/SSL configuration @@ -148,7 +161,7 @@ spec: ``` ```bash -$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-singapore.yaml +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-singapore.yaml mysql.kubedb.com/mysql created ``` @@ -236,7 +249,7 @@ spec: pathType: Prefix ``` ```bash -$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-ingress.yaml +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-ingress.yaml ingress.networking.k8s.io/mysql-singapore created $ kubectl get ingress -n demo NAME CLASS HOSTS ADDRESS PORTS AGE @@ -284,7 +297,7 @@ type: kubernetes.io/basic-auth ``` ```bash -kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-london-auth.yaml +kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-london-auth.yaml ``` ```yaml @@ -327,7 +340,7 @@ Here, - `spec.topology.remoteReplica.sourceref` we are referring to source to read. The mysql instance we previously created. - `spec.deletionPolicy` specifies what KubeDB should do when a user try to delete the operation of MySQL CR. *Wipeout* means that the database will be deleted without restrictions. It can also be "Halt", "Delete" and "DoNotTerminate". Learn More about these [HERE](https://kubedb.com/docs/latest/guides/mysql/concepts/database/#specdeletionpolicy). ```bash -$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/examples/mysql-london.yaml +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/examples/mysql-london.yaml mysql.kubedb.com/mysql-london created ``` @@ -393,7 +406,8 @@ spec: databaseRef: name: mysql-london replicationModeTransformation: - mode: Multi-Primary + targetTopologyMode: GroupReplication + mode: Single-Primary requireSSL: true issuerRef: apiGroup: cert-manager.io @@ -416,13 +430,17 @@ Here, - `spec.databaseRef.name` specifies that we are performing Replication Mode Transformation operation on `mysql-london` database. - `spec.type` specifies that we are performing `ReplicationModeTransformation` on our database. +- `spec.replicationModeTransformation.targetTopologyMode` specifies the topology to transform into — + `GroupReplication` (default), `InnoDBCluster` or `SemiSync`. - `spec.replicationModeTransformation.requireSSL` or `issuerRef` specifies tls or ssl enable group replication which is a optional field. -- `spec.replicationModeTransformation.mode` specifies the desired Group Replication Primary Mode (`Multi-Primary` or `Single-Primary`). +- `spec.replicationModeTransformation.mode` specifies the desired Group Replication Primary Mode — + **`Single-Primary`** (default; one writable primary) or **`Multi-Primary`** (multi-master; every + member accepts writes). This field is ignored when `targetTopologyMode` is `SemiSync`. Let's create the `MySQLOpsRequest` CR we have shown above, ```bash -$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/replication-mode-transform/mode-transform-ops-request.yaml +$ kubectl apply -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/mode-transform-ops-request.yaml mysqlopsrequest.ops.kubedb.com/mysql-replication-mode-transform created ``` diff --git a/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/my-standalone.yaml b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/my-standalone.yaml new file mode 100644 index 0000000000..c3efc2331d --- /dev/null +++ b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/my-standalone.yaml @@ -0,0 +1,16 @@ +apiVersion: kubedb.com/v1 +kind: MySQL +metadata: + name: my-standalone + namespace: demo +spec: + version: "8.4.8" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut diff --git a/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-group-replication.yaml b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-group-replication.yaml new file mode 100644 index 0000000000..b62eb93dcc --- /dev/null +++ b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-group-replication.yaml @@ -0,0 +1,14 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MySQLOpsRequest +metadata: + name: promote-to-gr + namespace: demo +spec: + type: ReplicationModeTransformation + databaseRef: + name: my-standalone + replicationModeTransformation: + targetTopologyMode: GroupReplication + mode: Single-Primary + timeout: 15m + apply: Always diff --git a/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-innodb-cluster.yaml b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-innodb-cluster.yaml new file mode 100644 index 0000000000..c99b0b62e0 --- /dev/null +++ b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-innodb-cluster.yaml @@ -0,0 +1,14 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MySQLOpsRequest +metadata: + name: promote-to-innodb + namespace: demo +spec: + type: ReplicationModeTransformation + databaseRef: + name: my-standalone + replicationModeTransformation: + targetTopologyMode: InnoDBCluster + mode: Single-Primary + timeout: 15m + apply: Always diff --git a/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-multi-primary.yaml b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-multi-primary.yaml new file mode 100644 index 0000000000..2ed567793f --- /dev/null +++ b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-multi-primary.yaml @@ -0,0 +1,14 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MySQLOpsRequest +metadata: + name: promote-to-multi-primary + namespace: demo +spec: + type: ReplicationModeTransformation + databaseRef: + name: my-standalone + replicationModeTransformation: + targetTopologyMode: GroupReplication + mode: Multi-Primary + timeout: 15m + apply: Always diff --git a/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-semisync.yaml b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-semisync.yaml new file mode 100644 index 0000000000..c1fcd09196 --- /dev/null +++ b/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-semisync.yaml @@ -0,0 +1,13 @@ +apiVersion: ops.kubedb.com/v1alpha1 +kind: MySQLOpsRequest +metadata: + name: promote-to-semisync + namespace: demo +spec: + type: ReplicationModeTransformation + databaseRef: + name: my-standalone + replicationModeTransformation: + targetTopologyMode: SemiSync + timeout: 15m + apply: Always diff --git a/docs/guides/mysql/replication-mode-transform/topology-mode-change/index.md b/docs/guides/mysql/replication-mode-transform/topology-mode-change/index.md new file mode 100644 index 0000000000..938b5a3cb1 --- /dev/null +++ b/docs/guides/mysql/replication-mode-transform/topology-mode-change/index.md @@ -0,0 +1,252 @@ +--- +title: MySQL Topology Mode Change +menu: + docs_{{ .version }}: + identifier: guides-mysql-topology-mode-change + name: Topology Mode Change + parent: guides-mysql-mode-transform + weight: 13 +menu_name: docs_{{ .version }} +section_menu_id: guides +--- + +> New to KubeDB? Please start [here](/docs/README.md). + +## MySQL Topology Mode Change + +This guide shows how to change the **mode (topology)** of an existing MySQL database with a +`ReplicationModeTransformation` `MySQLOpsRequest` — promoting a **standalone** MySQL into a +clustered topology. + +The target topology is selected with `spec.replicationModeTransformation.targetTopologyMode`: +`GroupReplication`, `InnoDBCluster` or `SemiSync`. + +> Transforming a **Remote Replica** is covered separately in +> [Remote/Read Only Replica Mode Transfer](/docs/guides/mysql/replication-mode-transform/remote-replica-mode-transfer/index.md). + +### Supported Mode Changes + +The source database must be **`Standalone`** (no `spec.topology`) or a **`RemoteReplica`**. +Changing one clustered topology into another is not supported yet. + +| From (source) | → `GroupReplication` | → `InnoDBCluster` | → `SemiSync` | +|---------------|:--------------------:|:-----------------:|:------------:| +| **Standalone** (no `spec.topology`) | ✅ | ✅ | ✅ | +| **RemoteReplica** | ✅ | ✅ | ✅ | +| **GroupReplication** | — | ❌ not supported yet | ❌ not supported yet | +| **InnoDBCluster** | ❌ not supported yet | — | ❌ not supported yet | +| **SemiSync** | ❌ not supported yet | ❌ not supported yet | — | + +Key guarantees: + +- **Your data is preserved.** A mode change never deletes a volume. When a new member has to be + seeded it is seeded in place with MySQL's `CLONE INSTANCE`, which overwrites the data directory + while the `PersistentVolumeClaim` is retained. +- A standalone database is scaled up to at least **3 members**, since a clustered topology needs a + quorum. +- Requires MySQL **8.4.2 or newer**. + +### Before You Begin + +- You need a Kubernetes cluster with the KubeDB operator installed — see [here](/docs/setup/README.md). +- This tutorial uses the `demo` namespace: + +```bash +$ kubectl create ns demo +namespace/demo created +``` + +## Promote a Standalone MySQL + +### Deploy a standalone MySQL + +```yaml +apiVersion: kubedb.com/v1 +kind: MySQL +metadata: + name: my-standalone + namespace: demo +spec: + version: "8.4.8" + replicas: 1 + storageType: Durable + storage: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + deletionPolicy: WipeOut +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/my-standalone.yaml +mysql.kubedb.com/my-standalone created + +$ kubectl get mysql -n demo my-standalone +NAME VERSION STATUS AGE +my-standalone 8.4.8 Ready 2m +``` + +Insert some data so you can confirm it survives the mode change: + +```bash +$ kubectl exec -it -n demo my-standalone-0 -c mysql -- mysql -uroot -p'pass' \ + -e "CREATE DATABASE playground; CREATE TABLE playground.t(id INT PRIMARY KEY); INSERT INTO playground.t VALUES(1),(2),(3);" +``` + +### Standalone → GroupReplication + +```yaml +apiVersion: ops.kubedb.com/v1alpha1 +kind: MySQLOpsRequest +metadata: + name: promote-to-gr + namespace: demo +spec: + type: ReplicationModeTransformation + databaseRef: + name: my-standalone + replicationModeTransformation: + targetTopologyMode: GroupReplication + mode: Single-Primary + timeout: 15m + apply: Always +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-group-replication.yaml +mysqlopsrequest.ops.kubedb.com/promote-to-gr created + +$ kubectl get mysqlopsrequest -n demo promote-to-gr +NAME TYPE STATUS AGE +promote-to-gr ReplicationModeTransformation Successful 3m +``` + +The standalone is scaled to a 3-member group and the pre-existing data is on every member: + +```bash +$ kubectl exec -it -n demo my-standalone-0 -c mysql -- mysql -uroot -p'pass' \ + -e "SELECT MEMBER_HOST, MEMBER_STATE, MEMBER_ROLE FROM performance_schema.replication_group_members;" ++-----------------------------------------+--------------+-------------+ +| MEMBER_HOST | MEMBER_STATE | MEMBER_ROLE | ++-----------------------------------------+--------------+-------------+ +| my-standalone-0.my-standalone-pods.demo | ONLINE | PRIMARY | +| my-standalone-1.my-standalone-pods.demo | ONLINE | SECONDARY | +| my-standalone-2.my-standalone-pods.demo | ONLINE | SECONDARY | ++-----------------------------------------+--------------+-------------+ +``` + +#### Multi-Primary (multi-master) + +Set `mode: Multi-Primary` to get a multi-master group where **every member accepts writes**: + +```yaml + replicationModeTransformation: + targetTopologyMode: GroupReplication + mode: Multi-Primary +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-multi-primary.yaml +mysqlopsrequest.ops.kubedb.com/promote-to-multi-primary created + +$ kubectl exec -it -n demo my-standalone-0 -c mysql -- mysql -uroot -p'pass' \ + -e "SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;" ++-----------------------------------------+-------------+ +| MEMBER_HOST | MEMBER_ROLE | ++-----------------------------------------+-------------+ +| my-standalone-0.my-standalone-pods.demo | PRIMARY | +| my-standalone-1.my-standalone-pods.demo | PRIMARY | +| my-standalone-2.my-standalone-pods.demo | PRIMARY | ++-----------------------------------------+-------------+ +``` + +All three members report `PRIMARY` and have `super_read_only=0`, so writes issued on any member are +accepted and replicated to the rest. + +### Standalone → InnoDBCluster + +```yaml + replicationModeTransformation: + targetTopologyMode: InnoDBCluster + mode: Single-Primary +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-innodb-cluster.yaml +mysqlopsrequest.ops.kubedb.com/promote-to-innodb created +``` + +In addition to the 3 database members, a **MySQL Router** is provisioned: + +```bash +$ kubectl get pods -n demo | grep my-standalone +my-standalone-0 2/2 Running 0 4m +my-standalone-1 2/2 Running 0 4m +my-standalone-2 2/2 Running 0 4m +my-standalone-router-0 1/1 Running 0 4m +``` + +### Standalone → SemiSync + +```yaml + replicationModeTransformation: + targetTopologyMode: SemiSync +``` + +```bash +$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/replication-mode-transform/topology-mode-change/examples/promote-to-semisync.yaml +mysqlopsrequest.ops.kubedb.com/promote-to-semisync created +``` + +This produces a semi-synchronous **primary** with standby replicas. The `mode` field does not apply +here (SemiSync has no group), and the pod holding the existing data is elected as the primary: + +```bash +$ kubectl get pods -n demo -L kubedb.com/role | grep my-standalone +my-standalone-0 2/2 Running 0 3m primary +my-standalone-1 2/2 Running 0 3m standby +my-standalone-2 2/2 Running 0 3m standby +``` + +## Changing the Mode of an Existing Cluster + +**Not supported yet.** A database that already runs a clustered topology +(`GroupReplication`, `InnoDBCluster` or `SemiSync`) cannot be transformed into a different one. +`ReplicationModeTransformation` applies to a **`Standalone`** or **`RemoteReplica`** source only. + +To move an existing cluster to another topology, take a backup and restore it into a new database +provisioned with the topology you want. + +## Verify + +After any mode change, confirm the new topology and that your data is intact on every member: + +```bash +$ kubectl get mysql -n demo my-standalone -o jsonpath='{.spec.topology.mode}{"\n"}' +GroupReplication + +$ for i in 0 1 2; do + kubectl exec -n demo my-standalone-$i -c mysql -- \ + mysql -uroot -p'pass' -N -e "SELECT COUNT(*) FROM playground.t;" + done +3 +3 +3 +``` + +## Cleaning up + +```bash +kubectl delete -n demo my/my-standalone +kubectl delete -n demo myops/promote-to-gr myops/promote-to-multi-primary +kubectl delete -n demo myops/promote-to-innodb myops/promote-to-semisync +kubectl delete ns demo +``` + +## Next Steps + +- Detail concepts of [MySQL object](/docs/guides/mysql/concepts/database/index.md). +- Detail concepts of [MySQLOpsRequest object](/docs/guides/mysql/concepts/opsrequest.md). +- Want to hack on KubeDB? Check our [contribution guidelines](/docs/CONTRIBUTING.md).