使用kubernetes的cronjob定時備份mysql數據庫


1.創建cronjob的文件

CronJob所描述的,正是定時任務。

  • 在給定時間點只運行一次
  • 在給定時間點周期性地運行

一個 CronJob 對象類似於 crontab (cron table)文件中的一行。它根據指定的預定計划周期性地運行一個 Job。在這里簡單的說一下cron,是指unix中cron表達式。比如:"*/1 * * * *",這個Cron表達式里*/1中 *表示從0開始,/表示"每",1表示偏移量,所以它的意思是:從0開始,每1個時間單位執行一次。Cron表達式中五個部分分別代表:分鍾,小時,日,月,星期。所以上述這句Cron表達式的意思是:從當前開始,每分鍾執行一次。那么我們可以利用這個機制來指定創建mysql備份任務的對象:


    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name:  mysqldump
    spec:
      jobTemplate:
        spec:
          completions: 1
          template:
            spec:
              restartPolicy: Never
              volumes:
                - name: mysql-master-script
                  hostPath:
                    path: /root/app/mysql/shell
                - name: mysql-master-backup
                  hostPath:
                    path: /root/app/db/backup
                - name: local-time
                  hostPath:
                    path: /etc/localtime
              containers:
                - name: mysqldump-container
                  image: nacos/nacos-mysql-master:latest
                  volumeMounts:
                    - name: mysql-master-script
                      mountPath: /var/db/script
                    - name: local-time
                      mountPath: /etc/localtime
                    - name: mysql-master-backup
                      mountPath: /var/db/backup
                  command:
                    - "sh"
                    - "/var/db/script/mysqldump.sh"
      schedule: "50 15 * * *"

在這個Yaml文件當中,最重要的關鍵詞就是jobTemplate。它是由job對象控制的Controller,還有幾點關鍵的屬性我在這里解釋說明一下:

  1. spec.concurrencyPolicy這個屬性主要是由於定時任務的特殊性,很可能某個job還沒執行完,另外一個新的job就產生了。它的取值分別為:Allow(job可以同時存在)Forbid(不會創建新的job,該周期會被跳過),Replace(新產生的Job替換舊的,沒有執行完的Job)
  2. 如果某一次Job創建失敗,這次創建會被標記為"Miss"。當在指定的事件窗口內,miss數目達到100時,那么CronJob會停止再創建這個Job,這個時間窗口可以有spec.startingDeadlineSeconds來指定
  3. 在Job對象中,負責並行控制的參數有兩個:spec.parallelism它定義的是一個Job在任意時間最多可以啟動多少個Pod同時運行。spec.comletions它定義的是job至少完成的Pod數目
  4. 這里容器與宿主機時差相差8小時。注意在設置定時任務的時候一定算好時間

2、備份數據庫的腳本

mysqldump.sh腳本如下:

    #!/bin/bash
    #保存備份個數
    number=3
    #備份保存路徑
    backup_dir=/var/db/backup
    #日期
    dd=`date +%Y%m%d`
    #備份工具
    tool=/usr/bin/mysqldump
    #用戶名
    username=root
    #密碼
    password=root
    #將要備份的數據庫
    database_name=test
    #簡單寫法  mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql
    $tool -u $username -p$password -hmysql-master -P3306 --databases $database_name > $backup_dir/$database_name-$dd.sql
    
    #寫創建備份日志
    echo "create $backup_dir/$database_name-$dd.sql" >> $backup_dir/log.txt
    #找出需要刪除的備份
    delfile=`ls -l -crt  $backup_dir/*.sql | awk '{print $9 }' | head -1`
    #判斷現在的備份數量是否大於$number
    count=`ls -l -crt  $backup_dir/*.sql | awk '{print $9 }' | wc -l`
    if [ $count -gt $number ]
    then
      rm $delfile  //刪除最早生成的備份只保留number數量的備份
      #寫刪除文件日志
      echo "delete $delfile" >> $backup_dir/log.txt
    fi


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM