Scale for an ApeCloud MySQL cluster
You can scale a MySQL cluster in two ways, vertical scaling and horizontal scaling.
Vertical scaling
You can vertically scale a cluster by changing resource requirements and limits (CPU and storage). For example, if you need to change the resource class from 1C2G to 2C4G, vertical scaling is what you need.
During the vertical scaling process, all pods restart in the order of learner -> follower -> leader and the leader pod may change after the restarting.
Before you start
Check whether the cluster status is Running
. Otherwise, the following operations may fail.
kbcli cluster list mysql-cluster
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mysql-cluster default apecloud-mysql ac-mysql-8.0.30 Delete Running Jan 29,2023 14:29 UTC+0800
Steps
Change configuration. There are 3 ways to apply vertical scaling.
Option 1. (Recommended) Use kbcli
Configure the parameters
--components
,--memory
, and--cpu
and run the command.kbcli cluster vscale mysql-cluster \
--components="mysql" \
--memory="4Gi" --cpu="2" \--components
describes the component name ready for vertical scaling.--memory
describes the requested and limited size of the component memory.--cpu
describes the requested and limited size of the component CPU.
Option 2. Create an OpsRequest
Apply an OpsRequest to the specified cluster. Configure the parameters according to your needs.
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-vertical-scaling
spec:
clusterRef: mysql-cluster
type: VerticalScaling
verticalScaling:
- componentName: mysql
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "4Gi"
cpu: "2000m"
EOFOption 3. Change the YAML file of the cluster
Change the configuration of
spec.componentSpecs.resources
in the YAML file.spec.componentSpecs.resources
controls the requirement and limit of resources and changing them triggers a vertical scaling.Example
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mysql-cluster
namespace: default
spec:
clusterDefinitionRef: apecloud-mysql
clusterVersionRef: ac-mysql-8.0.30
componentSpecs:
- name: mysql
componentDefRef: mysql
replicas: 1
resources: # Change the values of resources.
requests:
memory: "2Gi"
cpu: "1000m"
limits:
memory: "4Gi"
cpu: "2000m"
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
terminationPolicy: HaltCheck the cluster status to validate the vertical scaling.
kbcli cluster list mysql-cluster
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mysql-cluster default apecloud-mysql ac-mysql-8.0.30 Delete VerticalScaling Jan 29,2023 14:29 UTC+0800STATUS=VerticalScaling: it means the vertical scaling is in progress.
STATUS=Running: it means the vertical scaling operation has been applied.
STATUS=Abnormal: it means the vertical scaling is abnormal. The reason may be that the number of the normal instances is less than that of the total instance or the leader instance is running properly while others are abnormal.
To solve the problem, you can manually check whether this error is caused by insufficient resources. Then if AutoScaling is supported by the Kubernetes cluster, the system recovers when there are enough resources. Otherwise, you can create enough resources and troubleshoot with
kubectl describe
command.noteVertical scaling does not synchronize parameters related to CPU and memory and it is required to manually call the OpsRequest of configuration to change parameters accordingly. Refer to Configuration for instructions.
Check whether the corresponding resources change.
kbcli cluster describe mysql-cluster
Horizontal scaling
Horizontal scaling changes the amount of pods. For example, you can apply horizontal scaling to scale pods up from three to five. The scaling process includes the backup and restore of data.
Before you start
Check whether the cluster STATUS is Running
. Otherwise, the following operations may fail.
kbcli cluster list mysql-cluster
>
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
mysql-cluster default apecloud-mysql ac-mysql-8.0.30 Delete Running Jan 29,2023 14:29 UTC+0800
Steps
Change configuration. There are 3 ways to apply horizontal scaling.
Option 1. (Recommended) Use kbcli
Configure the parameters
--components
and--replicas
, and run the command.kbcli cluster hscale mysql-cluster \
--components="mysql" --replicas=3--components
describes the component name ready for horizontal scaling.--replicas
describes the replica amount of the specified components.
Option 2. Create an OpsRequest
Apply an OpsRequest to a specified cluster. Configure the parameters according to your needs.
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: ops-horizontal-scaling
spec:
clusterRef: mysql-cluster
type: HorizontalScaling
horizontalScaling:
- componentName: mysql
replicas: 3
EOFOption 3. Change the YAML file of the cluster
Change the configuration of
spec.componentSpecs.replicas
in the YAML file.spec.componentSpecs.replicas
stands for the pod amount and changing this value triggers a horizontal scaling of a cluster.Example
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mysql-cluster
namespace: default
spec:
clusterDefinitionRef: apecloud-mysql
clusterVersionRef: ac-mysql-8.0.30
componentSpecs:
- name: mysql
componentDefRef: mysql
replicas: 1 # Change the pod amount.
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
terminationPolicy: HaltValidate the horizontal scaling operation.
Check the cluster STATUS to identify the horizontal scaling status.
kbcli cluster list mysql-cluster
- STATUS=HorizontalScaling: it means horizontal scaling is in progress.
- STATUS=Running: it means horizontal scaling has been applied.
Check whether the corresponding resources change.
kbcli cluster describe mysql-cluster
Handle the snapshot exception
If STATUS=ConditionsError
occurs during the horizontal scaling process, you can find the cause from cluster.status.condition.message
for troubleshooting.
In the example below, a snapshot exception occurs.
Status:
conditions:
- lastTransitionTime: "2023-02-08T04:20:26Z"
message: VolumeSnapshot/mysql-cluster-mysql-scaling-dbqgp: Failed to set default snapshot
class with error cannot find default snapshot class
reason: ApplyResourcesFailed
status: "False"
type: ApplyResources
Reason
This exception occurs because the VolumeSnapshotClass
is not configured. This exception can be fixed after configuring VolumeSnapshotClass
, but the horizontal scaling cannot continue to run. It is because the wrong backup (volumesnapshot is generated by backup) and volumesnapshot generated before still exist. First delete these two wrong resources and then KubeBlocks re-generates new resources.
Steps:
Configure the VolumeSnapshotClass by running the command below.
kubectl create -f - <<EOF
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-aws-vsc
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
driver: ebs.csi.aws.com
deletionPolicy: Delete
EOFDelete the wrong backup (volumesnapshot is generated by backup) and volumesnapshot resources.
kubectl delete backup -l app.kubernetes.io/instance=mysql-cluster
kubectl delete volumesnapshot -l app.kubernetes.io/instance=mysql-cluster
Result
The horizontal scaling continues after backup and volumesnapshot are deleted and the cluster restores to running status.