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