티스토리 뷰

cronjob을 이용한 mariadb 백업 수행

cronjob을 이용하여 mariadb backup을 수행해보자.
아래 작업은 다음과 같은 사항이 기반되어 있다고 가정하고 시작하였다.

  • mariadb 는 k8s내에 deployment로 배포되어 있다라고 가정
  • mariadb 라는 service로 해당 cluster내에서 접근이 가능한 상황(별도의 nodeport, loadbalancer로 동작되지 않음)

manifest 작성

아래 내용을 사전에 확인하자.

  • mariadb password 및 host 정보등을 정확히 확인해놓아야 한다.
  • hostpath로 지정한 directory(/data) 가 사전에 생성되어 있어야 한다.

아래와 같은 cronjob manifest를 생성하여 배포를 진행한다.

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: backup-mariadb
  namespace: testlab
spec:
  schedule: "0 3 * * *"
  successfulJobsHistoryLimit: 2
  failedJobsHistoryLimit: 2
  jobTemplate:
    spec:
      template:
        spec:
          nodeSelector:
            kubernetes.io/hostname: worker001
          containers:
            - name: backup-mariadb
              image: bigtruedata/mysqldump
              command: ["/bin/sh"]
              args: ["-c", "mysqldump -h mariadb.testlab.svc.cluster.local -u root -ppassword --all-databases > /data/tdb-$(date +%Y%m%d).sql"]
              volumeMounts:
                - name: local-storage
                  mountPath: /data
          restartPolicy: OnFailure
          restartPolicy: OnFailure
          volumes:
          - name: local-storage
            hostPath:
              path: /data
              type: Directory

백업파일은 별도의 구성된 저장소가 아닌 로컬에다가 저장하는 방식으로 진행하였다.
(권장안은 백업전용 스토리지를 따로 두고 해당 디스크로 연결하는것을 추천한다.)

...
              volumeMounts:
                - name: local-storage
                  mountPath: /data
...
          volumes:
          - name: local-storage
            hostPath:
              path: /data
              type: Directory
...

당연히 mount된 디렉토리 상에 sql 파일을 redirection 한다.

              args: ["-c", "mysqldump -h mariadb.testlab.svc.cluster.local -u root -ppassword --all-databases > /data/tdb-$(date +%Y%m%d).sql"]

또한 다수의 노드에 산발적으로 백업파일(tdb.sql)이 저장되는것을 방지하기 위해
특정한 노드를 지정하여 해당 node에서만 backup이 이루어지도록 한다.

          nodeSelector:
            kubernetes.io/hostname: worker001

여기서 인지해야 하는것은 다음 설정을 필히 추가해야 한다는 것이다.
job의 경우 지속적으로 pod를 생성하기때문에 다음 항목이 존재하지 않는다면 지속적으로 garbage pod가 생성되게 된다.
간단하게 생각하여 history 관리를 하여 지정된 갯수 만큼 최신의 pod를 남기고 삭제하게 된다.

  successfulJobsHistoryLimit: 2
  failedJobsHistoryLimit: 2

'Cloud > Architecture&Tech' 카테고리의 다른 글

how to make a scheduled mysqldump with k8s cronjob  (0) 2020.02.12
댓글
댓글쓰기 폼