KubeBlocks
BlogsKubeBlocks Cloud
⌘K
​
Overview
Quickstart

Topologies

MySQL Semi-Synchronous Cluster
MySQL Cluster with ProxySQL
MySQL Group Replication Cluster
MySQL Group Replication with ProxySQL
MySQL Cluster with Orchestrator
MySQL with Orchestrator & ProxySQL

Operations

Lifecycle Management
Vertical Scaling
Horizontal Scaling
Volume Expansion
Manage MySQL Services
Minor Version Upgrade
Modify MySQL Parameters
Planned Switchover in MySQL
Decommission MySQL Replica
Recovering MySQL Replica

Backup And Restores

Create BackupRepo
Create Full Backup
Scheduled Backups
Scheduled Continuous Backup
Restore MySQL Cluster
Restore with PITR

Custom Secret

Custom Password
Custom Password Policy

TLS

MySQL Cluster with TLS
MySQL Cluster with User-Provided TLS
MySQL Cluster with mTLS

Monitoring

Observability for MySQL Clusters

Advanced Pod Management

Custom Scheduling Policies
Custom Pod Resources
Pod Management Parallelism
Using OnDelete for Controlled Pod Updates
Gradual Rolling Update
  1. Prerequisites
  2. Deploy a MySQL Semi-Synchronous Cluster
  3. Verifying the Deployment
  4. Check the BackupSchedule Resource
  5. Validate Backup in S3 Repository
  6. Cleanup
  7. Summary

Setting Up a MySQL Cluster with Scheduled Backups in KubeBlocks

This guide demonstrates how to deploy a MySQL cluster using KubeBlocks and configure scheduled backups with retention in an S3 repository.

Prerequisites

Before proceeding, ensure the following:

  • Environment Setup:
    • A Kubernetes cluster is up and running.
    • The kubectl CLI tool is configured to communicate with your cluster.
    • KubeBlocks CLI and KubeBlocks Operator are installed. Follow the installation instructions here.
  • Namespace Preparation: To keep resources isolated, create a dedicated namespace for this tutorial:
kubectl create ns demo namespace/demo created

Deploy a MySQL Semi-Synchronous Cluster

KubeBlocks uses a declarative approach for managing MySQL clusters. Below is an example configuration for deploying a MySQL cluster with 2 nodes (1 primary, 1 replicas) in semi-synchronous mode and scheduled backups.

Cluster Configuration

kubectl apply -f - <<EOF apiVersion: apps.kubeblocks.io/v1 kind: Cluster metadata: name: example-mysql-cluster namespace: demo spec: clusterDef: mysql topology: semisync terminationPolicy: WipeOut componentSpecs: - name: mysql serviceVersion: 8.0.35 replicas: 2 resources: limits: cpu: '0.5' memory: 0.5Gi requests: cpu: '0.5' memory: 0.5Gi volumeClaimTemplates: - name: data spec: storageClassName: "" accessModes: - ReadWriteOnce resources: requests: storage: 20Gi backup: enabled: true retentionPeriod: 30d method: xtrabackup cronExpression: '0 0 * * *' repoName: s3-repo EOF

Explanation of Key Fields

  • terminationPolicy: WipeOut:
    • When set to 'WipeOut', deleting the cluster also deletes all associated data, including backups.
    • For production environments, it is recommended to use terminationPolicy: Delete, which retains backup data even after the cluster is deleted.
  • backup.enabled: true: Enables scheduled backups for the cluster.
  • method: xtrabackup: Specifies the backup tool to be used (e.g., Percona XtraBackup).
  • cronExpression: '0 0 * * *': Configures the backup schedule to run daily at midnight (UTC).
  • retentionPeriod: 30d: Retains backups for 30 days.
  • repoName: s3-repo: Specifies the S3 repository for storing backups.

Verifying the Deployment

Monitor the cluster status until it transitions to Running:

kubectl get cluster example-mysql-cluster -n demo

Example Output:

NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE example-mysql-cluster mysql Delete Running 38s

Once the status is Running, the MySQL cluster is successfully deployed.

Check the BackupSchedule Resource

KubeBlocks automatically creates a BackupSchedule resource when scheduled backups are enabled. Verify the configuration using the following command:

kubectl get backupschedule example-mysql-cluster-mysql-backup-schedule -n demo -oyaml

Example Output:

apiVersion: dataprotection.kubeblocks.io/v1alpha1 kind: BackupSchedule ... spec: backupPolicyName: example-mysql-cluster-mysql-backup-policy schedules: - backupMethod: xtrabackup cronExpression: 0 0 * * * enabled: true name: xtrabackup retentionPeriod: 30d

This confirms that the BackupSchedule resource is properly configured with the retention period and cron schedule.

Validate Backup in S3 Repository

After the scheduled backup task has been executed, verify the backup files in the configured S3 bucket with the following command:

TZ=":UTC" aws s3 ls s3://kubeblocks-backup-repo/ --recursive

Example Output:

2025-02-06 00:00:52 3087203 demo/example-mysql-cluster-5f46be4f-c9ac-414e-9d66-2dfe0a281b83/mysql/example-mysql-cluster-xtrabackup-20250206000001/example-mysql-cluster-xtrabackup-20250206000001.xbstream.zst 2025-02-06 00:01:03 5348 demo/example-mysql-cluster-5f46be4f-c9ac-414e-9d66-2dfe0a281b83/mysql/example-mysql-cluster-xtrabackup-20250206000001/kubeblocks-backup.json

Backup Files:

  • Compressed Backup Data: 'example-mysql-cluster-xtrabackup-20250206000001.xbstream.zst'
  • Backup Metadata: 'kubeblocks-backup.json'

Cleanup

To remove all created resources, delete the MySQL cluster along with its namespace:

kubectl delete cluster example-mysql-cluster -n demo kubectl delete ns demo

Summary

In this guide:

  • The backup was executed at midnight UTC (2025-02-06 00:00:52), as defined in the cronExpression field of the backup configuration.
  • The backup files were successfully stored in the specified S3 repository. These include:
    • The compressed backup data file ('example-mysql-cluster-xtrabackup-20250206000001.xbstream.zst').
    • The metadata file ('kubeblocks-backup.json') which contains information about the backup.

By following this guide, you can automate regular backups for your MySQL clusters, ensuring data availability and recovery options.

© 2025 ApeCloud PTE. Ltd.