Skip to content

Commit

Permalink
refactor volumesnapshot
Browse files Browse the repository at this point in the history
Signed-off-by: SK Ali Arman <[email protected]>
  • Loading branch information
sheikh-arman committed Dec 3, 2024
1 parent 5b73374 commit 54585c2
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 48 deletions.
8 changes: 7 additions & 1 deletion docs/guides/mysql/pitr/restic/archiver.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ mysql-archiver-full-backup-1733120326-4n8nd 0/1 Comple
mysql-archiver-manifest-backup-1733120326-9gw4f 0/1 Completed 0 10m
mysql-sidekick 1/1 Running 0 10m
retention-policy-mysql-archiver-full-backup-1733120326-7rx9t 0/1 Completed 0 9m31s
retention-policy-mysql-archiver-manifest-backup-1733120326l79mb 0/1 Completed 0 9m56s 28h
retention-policy-mysql-archiver-manifest-backup-1733120326l79mb 0/1 Completed 0 9m56s
```

`mysql-sidekick` is responsible for uploading binlog files
Expand All @@ -243,6 +243,12 @@ $ kubectl get backupsession -n demo
NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE
mysql-archiver-full-backup-1733120326 BackupConfiguration mysql-archiver Succeeded 50s 14m
mysql-archiver-manifest-backup-1733120326 BackupConfiguration mysql-archiver Succeeded 25s 14m
$ kubectl get repository.storage.kubestash.com -n demo
NAME INTEGRITY SNAPSHOT-COUNT SIZE PHASE LAST-SUCCESSFUL-BACKUP AGE
mysql-full true 1 2.073 KiB Ready 14m 14m
mysql-manifest true 1 2.073 KiB Ready 14m 14m
```

## Data Insert and Switch Binlog File
Expand Down
89 changes: 52 additions & 37 deletions docs/guides/mysql/pitr/volumesnapshot/archiver.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,26 @@ BackupStorage is a CR provided by KubeStash that can manage storage from various
apiVersion: storage.kubestash.com/v1alpha1
kind: BackupStorage
metadata:
name: linode-storage
name: storage
namespace: demo
spec:
storage:
provider: s3
s3:
bucket: mehedi-mysql-wal-g
endpoint: https://ap-south-1.linodeobjects.com
region: ap-south-1
prefix: backup
secretName: storage
endpoint: s3.amazonaws.com
bucket: mysql-archiver
region: us-east-1
prefix: my-demo
secretName: s3-secret
usagePolicy:
allowedNamespaces:
from: All
default: true
deletionPolicy: WipeOut
```
```bash
$ kubectl apply -f backupstorage.yaml
backupstorage.storage.kubestash.com/linode-storage created
backupstorage.storage.kubestash.com/storage created
```

### secrets for backup-storage
Expand All @@ -73,17 +72,18 @@ apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: storage
name: s3-secret
namespace: demo
stringData:
AWS_ACCESS_KEY_ID: "*************26CX"
AWS_SECRET_ACCESS_KEY: "************jj3lp"
AWS_ENDPOINT: https://ap-south-1.linodeobjects.com
AWS_ENDPOINT: s3.amazonaws.com
```
```

```bash
$ kubectl apply -f storage-secret.yaml
secret/storage created
secret/s3-secret created
```

### Retention policy
Expand All @@ -98,7 +98,7 @@ metadata:
spec:
maxRetentionPeriod: "30d"
successfulSnapshots:
last: 100
last: 10
failedSnapshots:
last: 2
```
Expand All @@ -123,16 +123,16 @@ spec:
from: Selector
selector:
matchLabels:
kubernetes.io/metadata.name: demo
kubernetes.io/metadata.name: demo
selector:
matchLabels:
archiver: "true"
retentionPolicy:
name: mysql-retention-policy
namespace: demo
encryptionSecret:
encryptionSecret:
name: "encrypt-secret"
namespace: "demo"
namespace: "demo"
fullBackup:
driver: "VolumeSnapshotter"
task:
Expand All @@ -146,12 +146,12 @@ spec:
manifestBackup:
scheduler:
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
schedule: "*/30 * * * *"
sessionHistoryLimit: 2
backupStorage:
ref:
name: "linode-storage"
name: "storage"
namespace: "demo"
```
Expand All @@ -175,7 +175,7 @@ stringData:
$ kubectl create -f https://github.com/kubedb/docs/raw/{{< param "info.version" >}}/docs/guides/mysql/pitr/volumesnapshot/yamls/encryptionSecret.yaml
```

## Ensure volumeSnapshotClass
## Ensure VolumeSnapshotClass

```bash
$ kubectl get volumesnapshotclasses
Expand Down Expand Up @@ -206,7 +206,7 @@ $ kubectl apply -f volumesnapshotclass.yaml
Note: Ensure that the VolumeSnapshotClass is provisioned with the same storage class driver used for provisioning your MySQL database. In our case, we are using the longhorn storage class as our database provisioner, with the driver set to `driver.longhorn.io`.

# Deploy MySQL
So far we are ready with setup for continuously archive MySQL, We deploy a mysqlql referring the MySQL archiver object
We are now ready with the setup for continuous MySQL archiving. We will deploy a MySQL object that references the MySQL archiver object.

```yaml
apiVersion: kubedb.com/v1
Expand Down Expand Up @@ -241,13 +241,16 @@ spec:

```bash
$ kubectl get pod -n demo
NAME READY STATUS RESTARTS AGE
mysql-0 2/2 Running 0 28h
mysql-1 2/2 Running 0 28h
mysql-2 2/2 Running 0 28h
mysql-backup-config-full-backup-1703680982-vqf7c 0/1 Completed 0 28h
mysql-backup-config-manifest-1703680982-62x97 0/1 Completed 0 28h
mysql-sidekick 1/1 Running 0 28h
NAME READY STATUS RESTARTS AGE
mysql-0 2/2 Running 0 28h
mysql-1 2/2 Running 0 28h
mysql-2 2/2 Running 0 28h
mysql-archiver-full-backup-1733206003-hq4pb 0/1 Completed 0 28h
mysql-archiver-manifest-backup-1733206003-q78jj 0/1 Completed 0 28h
mysql-sidekick 1/1 Running 0 28h
retention-policy-mysql-archiver-full-backup-1733206003-b2b42 0/1 Completed 0 28h
retention-policy-mysql-archiver-manifest-backup-1733206003skwqc 0/1 Completed 0 28h
```

`mysql-sidekick` is responsible for uploading binlog files
Expand All @@ -256,23 +259,34 @@ mysql-sidekick 1/1 Running 0

`mysql-backup-config-manifest-1703680982-62x97` are the pod of the manifest backup related to MySQL object

`retention-policy-mysql-archiver-full-backup-1733206003-b2b42` will automatically clean up previous full-backup of volumesnapshots according to the rules defined in the `mysql-retention-policy` custom resource (CR).

`retention-policy-mysql-archiver-manifest-backup-1733206003skwqc` will automatically clean up previous manifest-backup snapshots according to the rules specified in the `mysql-retention-policy` custom resource (CR).



### Validate BackupConfiguration and VolumeSnapshots

```bash
$ kubectl get backupconfigurations -n demo
NAME PHASE PAUSED AGE
mysql-backup-config Ready 2m43s
mysql-archiver Ready 2m43s
$ kubectl get backupsession -n demo
NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE
mysql-backup-config-full-backup-1702388088 BackupConfiguration mysql-backup-config Succeeded 74s
mysql-backup-config-manifest-1702388088 BackupConfiguration mysql-backup-config Succeeded 74s
NAME INVOKER-TYPE INVOKER-NAME PHASE DURATION AGE
mysql-archiver-full-backup-1733206003 BackupConfiguration mysql-backup-config Succeeded 74s
mysql-archiver-manifest-backup-1733206003 BackupConfiguration mysql-backup-config Succeeded 74s
kubectl get volumesnapshots -n demo
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE
mysql-1702388096 true data-mysql-1 1Gi longhorn-snapshot-vsc snapcontent-735e97ad-1dfa-4b70-b416-33f7270d792c 2m5s 2m5s
$ kubectl get repository.storage.kubestash.com -n demo
NAME INTEGRITY SNAPSHOT-COUNT SIZE PHASE LAST-SUCCESSFUL-BACKUP AGE
mysql-full true 1 2.073 KiB Ready 2m43s 2m43s
mysql-manifest true 1 2.073 KiB Ready 2m43s 2m43s
```

## Data Insert and Switch Binlog File
Expand Down Expand Up @@ -310,11 +324,7 @@ mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2023-12-28 17:10:54 |mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2023-12-28 17:10:54 |
| 2024-12-03 06:09:34 |
+---------------------+
+---------------------+

Expand Down Expand Up @@ -351,7 +361,7 @@ mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2023-12-28 17:10:54 |
| 2024-12-03 06:09:34 |
+---------------------+
```
### Restore MySQL
Expand All @@ -371,7 +381,7 @@ spec:
fullDBRepository:
name: mysql-repository
namespace: demo
recoveryTimestamp: "2023-12-28T17:10:54Z"
recoveryTimestamp: "2024-12-03T06:09:34Z"
version: "8.2.0"
replicas: 3
topology:
Expand Down Expand Up @@ -452,6 +462,11 @@ The base backup volumesnapshot and binlog files are restored exclusively on pod-
The base backup and binlog files are restored on pod-0. The data is then copied from pod-0's data directory to the data directories of other replicas using file system copy. Once the data transfer is complete, the group replication process begins. Please note that `fscopy` does not support cross-zone operations.
***clone***
If you have a different type of base backup(ex: VolumeSnapshot, Restic), the clone process will ensure that the VolumeSnapshot is restored as the base backup. Each MySQL replica independently restores the base backup volumesnapshot and binlog files. After completing the restore process, the replicas individually join the replication group.
Choose the replication strategy that best fits your restoration and replication requirements. On this demonstration, we have used the sync replication strategy.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
apiVersion: storage.kubestash.com/v1alpha1
kind: BackupStorage
metadata:
name: storage
namespace: demo
spec:
storage:
provider: s3
s3:
endpoint: s3.amazonaws.com
bucket: mysql-archiver
region: us-east-1
prefix: my-demo
secretName: s3-secret
usagePolicy:
allowedNamespaces:
from: All
deletionPolicy: WipeOut
# for restricted namespace
runtimeSettings:
pod:
securityContext:
runAsUser: 65535
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
container:
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
15 changes: 7 additions & 8 deletions docs/guides/mysql/pitr/volumesnapshot/yamls/backupstorage.yaml
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
apiVersion: storage.kubestash.com/v1alpha1
kind: BackupStorage
metadata:
name: linode-storage
name: storage
namespace: demo
spec:
storage:
provider: s3
s3:
bucket: mehedi-pg-wal-g
endpoint: https://ap-south-1.linodeobjects.com
region: ap-south-1
prefix: backup
secretName: storage
endpoint: s3.amazonaws.com
bucket: mysql-archiver
region: us-east-1
prefix: my-demo
secretName: s3-secret
usagePolicy:
allowedNamespaces:
from: All
default: true
deletionPolicy: WipeOut
deletionPolicy: WipeOut
28 changes: 28 additions & 0 deletions docs/guides/mysql/pitr/volumesnapshot/yamls/mysql-restore.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
apiVersion: kubedb.com/v1
kind: MySQL
metadata:
name: restore-mysql
namespace: demo
spec:
init:
archiver:
replicationStrategy: sync
encryptionSecret:
name: encrypt-secret
namespace: demo
fullDBRepository:
name: mysql-full
namespace: demo
recoveryTimestamp: "2024-12-03T06:09:34Z"
version: "8.2.0"
replicas: 3
topology:
mode: GroupReplication
storageType: Durable
storage:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
deletionPolicy: WipeOut
24 changes: 24 additions & 0 deletions docs/guides/mysql/pitr/volumesnapshot/yamls/mysql.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: kubedb.com/v1
kind: MySQL
metadata:
name: mysql
namespace: demo
labels:
archiver: "true"
spec:
version: "8.2.0"
replicas: 3
topology:
mode: GroupReplication
storageType: Durable
storage:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
archiver:
ref:
name: mysqlarchiver-sample
namespace: demo
deletionPolicy: WipeOut
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,5 @@ spec:
sessionHistoryLimit: 2
backupStorage:
ref:
name: "linode-storage"
name: "storage"
namespace: "demo"
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ metadata:
spec:
maxRetentionPeriod: "30d"
successfulSnapshots:
last: 100
last: 10
failedSnapshots:
last: 2

0 comments on commit 54585c2

Please sign in to comment.