From 4bb76cd0fba04f7336b5dcffaac734a59dd526e1 Mon Sep 17 00:00:00 2001 From: Christopher De Vries Date: Fri, 14 Aug 2020 08:04:50 -0400 Subject: [PATCH] Change secondary to replica and use primary as an adjective consistently --- .../run-replicated-stateful-application.md | 52 +++++++++---------- .../application/mysql/mysql-configmap.yaml | 4 +- .../application/mysql/mysql-statefulset.yaml | 4 +- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/content/en/docs/tasks/run-application/run-replicated-stateful-application.md b/content/en/docs/tasks/run-application/run-replicated-stateful-application.md index 5dad8f2027..4bcc2e8582 100644 --- a/content/en/docs/tasks/run-application/run-replicated-stateful-application.md +++ b/content/en/docs/tasks/run-application/run-replicated-stateful-application.md @@ -15,7 +15,7 @@ weight: 30 This page shows how to run a replicated stateful application using a [StatefulSet](/docs/concepts/workloads/controllers/statefulset/) controller. -The example is a MySQL single-primary topology with multiple secondaries running +The example is a MySQL single-primary topology with multiple replicas running asynchronous replication. {{< note >}} @@ -69,9 +69,9 @@ kubectl apply -f https://k8s.io/examples/application/mysql/mysql-configmap.yaml ``` This ConfigMap provides `my.cnf` overrides that let you independently control -configuration on the MySQL primary and secondaries. -In this case, you want the primary to be able to serve replication logs to secondaries -and you want secondaries to reject any writes that don't come via replication. +configuration on the primary MySQL server and replicas. +In this case, you want the primary server to be able to serve replication logs to replicas +and you want replicas to reject any writes that don't come via replication. There's nothing special about the ConfigMap itself that causes different portions to apply to different Pods. @@ -96,12 +96,12 @@ cluster and namespace. The Client Service, called `mysql-read`, is a normal Service with its own cluster IP that distributes connections across all MySQL Pods that report -being Ready. The set of potential endpoints includes the MySQL primary and all -secondaries. +being Ready. The set of potential endpoints includes the primary MySQL server and all +replicas. Note that only read queries can use the load-balanced Client Service. -Because there is only one MySQL primary, clients should connect directly to the -MySQL primary Pod (through its DNS entry within the Headless Service) to execute +Because there is only one primary MySQL server, clients should connect directly to the +primary MySQL Pod (through its DNS entry within the Headless Service) to execute writes. ### StatefulSet @@ -168,32 +168,32 @@ controller into the domain of MySQL server IDs, which require the same properties. The script in the `init-mysql` container also applies either `primary.cnf` or -`secondary.cnf` from the ConfigMap by copying the contents into `conf.d`. -Because the example topology consists of a single MySQL primary and any number of -secondaries, the script simply assigns ordinal `0` to be the primary, and everyone -else to be secondaries. +`replica.cnf` from the ConfigMap by copying the contents into `conf.d`. +Because the example topology consists of a single primary MySQL server and any number of +replicas, the script simply assigns ordinal `0` to be the primary server, and everyone +else to be replicas. Combined with the StatefulSet controller's [deployment order guarantee](/docs/concepts/workloads/controllers/statefulset/#deployment-and-scaling-guarantees/), -this ensures the MySQL primary is Ready before creating secondaries, so they can begin +this ensures the primary MySQL server is Ready before creating replicas, so they can begin replicating. ### Cloning existing data -In general, when a new Pod joins the set as a secondary, it must assume the MySQL -primary might already have data on it. It also must assume that the replication +In general, when a new Pod joins the set as a replica, it must assume the primary MySQL +server might already have data on it. It also must assume that the replication logs might not go all the way back to the beginning of time. These conservative assumptions are the key to allow a running StatefulSet to scale up and down over time, rather than being fixed at its initial size. The second Init Container, named `clone-mysql`, performs a clone operation on -a secondary Pod the first time it starts up on an empty PersistentVolume. +a replica Pod the first time it starts up on an empty PersistentVolume. That means it copies all existing data from another running Pod, -so its local state is consistent enough to begin replicating from the primary. +so its local state is consistent enough to begin replicating from the primary server. MySQL itself does not provide a mechanism to do this, so the example uses a popular open-source tool called Percona XtraBackup. During the clone, the source MySQL server might suffer reduced performance. -To minimize impact on the MySQL primary, the script instructs each Pod to clone +To minimize impact on the primary MySQL server, the script instructs each Pod to clone from the Pod whose ordinal index is one lower. This works because the StatefulSet controller always ensures Pod `N` is Ready before starting Pod `N+1`. @@ -206,15 +206,15 @@ server, and an `xtrabackup` container that acts as a [sidecar](https://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns). The `xtrabackup` sidecar looks at the cloned data files and determines if -it's necessary to initialize MySQL replication on the secondary. +it's necessary to initialize MySQL replication on the replica. If so, it waits for `mysqld` to be ready and then executes the `CHANGE MASTER TO` and `START SLAVE` commands with replication parameters extracted from the XtraBackup clone files. -Once a secondary begins replication, it remembers its MySQL primary and +Once a replica begins replication, it remembers its primary MySQL server and reconnects automatically if the server restarts or the connection dies. -Also, because secondaries look for the primary at its stable DNS name -(`mysql-0.mysql`), they automatically find the primary even if it gets a new +Also, because replicas look for the primary server at its stable DNS name +(`mysql-0.mysql`), they automatically find the primary server even if it gets a new Pod IP due to being rescheduled. Lastly, after starting replication, the `xtrabackup` container listens for @@ -224,7 +224,7 @@ case the next Pod loses its PersistentVolumeClaim and needs to redo the clone. ## Sending client traffic -You can send test queries to the MySQL primary (hostname `mysql-0.mysql`) +You can send test queries to the primary MySQL server (hostname `mysql-0.mysql`) by running a temporary container with the `mysql:5.7` image and running the `mysql` client binary. @@ -291,7 +291,7 @@ it running in another window so you can see the effects of the following steps. ## Simulating Pod and Node downtime -To demonstrate the increased availability of reading from the pool of secondaries +To demonstrate the increased availability of reading from the pool of replicas instead of a single server, keep the `SELECT @@server_id` loop from above running while you force a Pod out of the Ready state. @@ -409,9 +409,9 @@ Now uncordon the Node to return it to a normal state: kubectl uncordon ``` -## Scaling the number of secondaries +## Scaling the number of replicas -With MySQL replication, you can scale your read query capacity by adding secondaries. +With MySQL replication, you can scale your read query capacity by adding replicas. With StatefulSet, you can do this with a single command: ```shell diff --git a/content/en/examples/application/mysql/mysql-configmap.yaml b/content/en/examples/application/mysql/mysql-configmap.yaml index 297971515f..519334bc82 100644 --- a/content/en/examples/application/mysql/mysql-configmap.yaml +++ b/content/en/examples/application/mysql/mysql-configmap.yaml @@ -9,8 +9,8 @@ data: # Apply this config only on the primary. [mysqld] log-bin - secondary.cnf: | - # Apply this config only on secondaries. + replica.cnf: | + # Apply this config only on replicas. [mysqld] super-read-only diff --git a/content/en/examples/application/mysql/mysql-statefulset.yaml b/content/en/examples/application/mysql/mysql-statefulset.yaml index 3c2853e945..bb61537fcf 100644 --- a/content/en/examples/application/mysql/mysql-statefulset.yaml +++ b/content/en/examples/application/mysql/mysql-statefulset.yaml @@ -31,7 +31,7 @@ spec: if [[ $ordinal -eq 0 ]]; then cp /mnt/config-map/primary.cnf /mnt/conf.d/ else - cp /mnt/config-map/secondary.cnf /mnt/conf.d/ + cp /mnt/config-map/replica.cnf /mnt/conf.d/ fi volumeMounts: - name: conf @@ -108,7 +108,7 @@ spec: # Determine binlog position of cloned data, if any. if [[ -f xtrabackup_slave_info && "x$( change_master_to.sql.in # Ignore xtrabackup_binlog_info in this case (it's useless). rm -f xtrabackup_slave_info xtrabackup_binlog_info