• 售前

  • 售后

热门帖子
入门百科

Docker容器定时备份数据库并发送到指定邮箱(操持思绪)

[复制链接]
Aim_yuan 显示全部楼层 发表于 2022-1-7 17:53:24 |阅读模式 打印 上一主题 下一主题
目次


  • 一、背景:
  • 二、设计思绪:
  • 三、编写启动脚本
  • 四、构建镜像
  • 五、添加边车容器

    • 5.1 创建配置文件
    • 5.2 创建有状态服务部署文件

  • 六、测试
项目所在及利用说明:https://gitee.com/noovertime/mysqlmail

一、背景:

一开始的初志是,想写一个脚本来监控服务器的高占用率进程并通过邮件发送给我,然后突发奇想,可以利用这种方式来备份我的数据库,开始动手!

二、设计思绪:

通过编写shell脚本,调用linux的mail工具,mysqldump的方式来保存数据库的sql文件,通过mail工具添加到附件,末了发送到我的邮箱。

三、编写启动脚本

首先我们来编写一个启动脚本
为了方便以后的个性化配置,我们将脚本中的变量都提取到一个application.yml文件中,文件如下:
  1. RUNTIME: 084900 ##启动时间,因为容器时区问题,需要当前时间减去8小时
  2. HOST: 172.17.0.3 ##数据库IP地址
  3. USER: root ##数据库用户
  4. PASSWORD: 123456 ##数据库密码
  5. DATABASE: solo ##数据库名
  6. TARGETMAIL: 1849539179@qq.com ##发送的邮箱地址
复制代码
接下来我们来写一下shell脚本,逻辑也很简朴,当前时间与启动时间雷同时,则调用sendmail函数发送邮件
  1. #!/bin/bash
  2. #author: chenteng
  3. RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')
  4. HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')
  5. USER=$(cat ./application.yml | grep USER| awk '{print $2}')
  6. PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')
  7. DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')
  8. TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')
  9. function  sendmail(){
  10.   mysqldump -h$HOST  -u$USER -p$PASSWORD  --complete-insert --skip-add-drop-table  --hex-blob $DATABASE  > $DATABASE.sql
  11.   echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL
  12.   sleep 1
  13. }
  14. while true
  15. do
  16.   CURRENT_TIME=$(date +%H%M%S)
  17.   if [ $CURRENT_TIME = $RUNTIME ];then
  18.     echo "starting bak mysql database"
  19.     sendmail
  20.     continue
  21.   else
  22.     echo $CURRENT_TIME
  23.     sleep 1
  24.   fi
  25. done
复制代码
四、构建镜像

因为我们末了要放到k8s平台上的,以是我们要构建一个镜像,在构建镜像之前,请先把application.yml demo.sh Dockerfile放在同一目次下
Dockerfile如下:
PS:添加了mysql的客户端,邮件mail客户端
  1. FROM centos
  2. RUN mkdir /app && yum install -y mysql.x86_64 sendmail  mailx libreport-plugin-mailx
  3. WORKDIR /app
  4. COPY demo.sh .
  5. COPY application.yml .
  6. CMD ["/bin/sh","demo.sh"]
复制代码
利用docker build下令构建镜像,要记得加一下末了的点
  1. docker build -t mysqlmail-bak:1.0.1 .
复制代码
五、添加边车容器

边车容器(sidecar):边车容器就是与主容器一起在一个pod中运行的容器,为业务容器赋能,共享一个网络空间,以是可以用127.0.0.1:3306连接主容器的数据库。

5.1 创建配置文件

为了方便调试,我把里面的shell脚本也挂载出来。
创建两个configmap,分别对应容器内的配置文件与shell脚本,背面假如不必要调试可以取消mysqlshell的挂载。
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: mysqlmail-conf
  5.   namespace: solo
  6. data:
  7.   application.yml: |
  8.     RUNTIME: 105800
  9.     HOST: 127.0.0.1
  10.     USER: root
  11.     PASSWORD: 123456
  12.     DATABASE: solo
  13.     TARGETMAIL: 1849539179@qq.com
  14. ---
  15. apiVersion: v1
  16. kind: ConfigMap
  17. metadata:
  18.   name: mysqlmail-shell
  19.   namespace: solo
  20. data:
  21.   demo.sh: |
  22.     #!/bin/bash
  23.     #author: chenteng
  24.     RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')
  25.     HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')
  26.     USER=$(cat ./application.yml | grep USER| awk '{print $2}')
  27.     PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')
  28.     DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')
  29.     TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')
  30.     function  sendmail(){
  31.       mysqldump -h$HOST  -u$USER -p$PASSWORD  --complete-insert --skip-add-drop-table  --column-statistics=0 --hex-blob $DATABASE  > $DATABASE.sql
  32.       echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL
  33.       sleep 1
  34.     }
  35.     while true
  36.     do
  37.       CURRENT_TIME=$(date +%H%M%S)
  38.       if [ $CURRENT_TIME = $RUNTIME ];then
  39.         echo "starting bak mysql database"
  40.         sendmail
  41.         continue
  42.       else
  43.         echo $CURRENT_TIME
  44.         sleep 1
  45.       fi
  46.     done
复制代码
5.2 创建有状态服务部署文件

我们的deploy文件利用的是上篇文章中创建的mysql有状态服务的yaml,有兴趣的可以看下我上篇迁移的文章
  1. apiVersion: apps/v1
  2. kind: StatefulSet
  3. metadata:
  4.   name: mysql
  5.   namespace: solo
  6. spec:
  7.   serviceName: mysql-service
  8.   selector:
  9.     matchLabels:
  10.       app: mysql
  11.   replicas: 1
  12.   template:
  13.     metadata:
  14.       labels:
  15.         app: mysql
  16.     spec:
  17.       containers:
  18.       - name: mysqlmail-bak
  19.         imagePullPolicy: IfNotPresent
  20.         image: mysqlmail-bak:1.0.1
  21.         volumeMounts:
  22.         - name: mysqlmail-conf
  23.           mountPath: /app/application.yml
  24.           subPath: application.yml
  25.         - name: mysqlmail-shell
  26.           mountPath: /app/demo.sh
  27.           subPath: demo.sh
  28.       - name: mysql-pod
  29.         imagePullPolicy: IfNotPresent
  30.         image: mysql:5.7
  31.         env:
  32.         - name: MYSQL_ROOT_PASSWORD
  33.           value: "123456"
  34.         ports:
  35.         - containerPort: 3306
  36.           name: msyql-listin
  37.         volumeMounts:
  38.         - name: mysql-data
  39.           mountPath: /var/lib/mysql
  40.           subPath: mysql-data
  41.         - name: mysql-conf
  42.           mountPath: /etc/mysql/conf.d/my.cnf
  43.           subPath: my.cnf
  44.       volumes:
  45.       - name: mysql-data
  46.         hostPath:
  47.           path: /data/mysql
  48.       - name: mysql-conf
  49.         configMap:
  50.           name: mysql-conf
  51.       - name: mysqlmail-conf
  52.         configMap:
  53.           name: mysqlmail-conf
  54.       - name: mysqlmail-shell
  55.         configMap:
  56.           name: mysqlmail-shell
  57. ---
  58. apiVersion: v1
  59. kind: Service
  60. metadata:
  61.   name: mysql-service
  62.   namespace: solo
  63.   labels:
  64.     app: mysql
  65. spec:
  66.   ports:
  67.   - targetPort: 3306
  68.     port: 3306
  69.   clusterIP: None
  70.   selector:
  71.      app: mysql
复制代码
六、测试

我们上面给他定的时间是RUNTIME: 105800,上海时区也就是18点58分,我们来看一下结果
检察日记,
留意: 当一个pod包含多个容器时,要利用 -c 参数指定检察哪个容器
  1. [root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0  -c mysqlmail-bak | grep mysql -C 5
  2. 105755
  3. 105756
  4. 105757
  5. 105758
  6. 105759
  7. starting bak mysql database
  8. mysqldump: [Warning] Using a password on the command line interface can be insecure.
  9. 105801
  10. 105802
复制代码
从日记可以看到,邮件已经发送乐成了!我们往复邮箱看一下,发现也已经乐成了,至此我们的实行完善完成!

到此这篇关于Docker容器定时备份数据库并发送到指定邮箱的文章就介绍到这了,更多相干Docker定时备份数据库内容请搜索草根技术分享以前的文章或继续欣赏下面的相干文章希望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作