设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11603|回复: 0

Docker容器定时备份数据库并发送到指定邮箱(设计思路)

[复制链接]

77

主题

498

回帖

997

积分

高级会员

Rank: 4

积分
997
发表于 2022-3-26 11:01:51 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录

项目地址及使用说明: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
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表