当前位置:首页 > 科技  > 软件

我们一起聊聊K8s定时备份MySQL并发送到指定邮箱

来源: 责编: 时间:2024-01-02 09:31:32 305观看
导读一、背景:一开始的初衷是,想写一个脚本来监控服务器的高占用率进程并通过邮件发送给我,然后突发奇想,可以使用这种方式来备份我的数据库,开始动手!二、设计思路:通过编写Shell脚本,调用Linux的mail工具,MySQLDump的方式来保存

一、背景:

一开始的初衷是,想写一个脚本来监控服务器的高占用率进程并通过邮件发送给我,然后突发奇想,可以使用这种方式来备份我的数据库,开始动手!9xO28资讯网——每日最新资讯28at.com

二、设计思路:

通过编写Shell脚本,调用Linux的mail工具,MySQLDump的方式来保存数据库的sql文件,通过Mail工具添加到附件,最后发送到我的邮箱。9xO28资讯网——每日最新资讯28at.com

三、编写启动脚本

首先我们来编写一个启动脚本 为了方便以后的个性化配置,我们将脚本中的变量都提取到一个application.yml文件中,文件如下:9xO28资讯网——每日最新资讯28at.com

RUNTIME: 084900 HOST: 172.16.1.2USER: rootPORT: 3306PASSWORD: 123456DATABASE: deanTARGETMAIL: deanmr@qq.com

接下来我们来写一下shell脚本,逻辑也很简单,当前时间与启动时间相同时,则调用sendmail函数发送邮件9xO28资讯网——每日最新资讯28at.com

#!/bin/bashRUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')USER=$(cat ./application.yml | grep USER| awk '{print $2}')PORT=$(cat ./application.yml | grep PORT| awk '{print $2}')PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')function  sendmail(){  echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL  sleep 1}while truedo   CURRENT_TIME=$(date +%H%M%S)  if [ $CURRENT_TIME = $RUNTIME ];then    echo "starting bak mysql database"    sendmail    continue  else    echo $CURRENT_TIME    sleep 1  fidone

四、构建镜像

因为我们最后要放到k8s平台上的,所以我们要构建一个镜像,在构建镜像之前,请先把application.yml demo.sh Dockerfile放在同一目录下 Dockerfile如下:PS:添加了mysql的客户端,邮件mail客户端9xO28资讯网——每日最新资讯28at.com

FROM centosRUN mkdir /app && yum install -y mysql.x86_64 sendmail  mailx libreport-plugin-mailx WORKDIR /appCOPY demo.sh .COPY application.yml .CMD ["/bin/sh","demo.sh"]

使用docker build命令构建镜像,要记得加一下最后的点9xO28资讯网——每日最新资讯28at.com

docker build -t mysqlmail-bak:1.0.1 .

五、添加边车容器

边车容器(sidecar):边车容器就是与主容器一起在一个pod中运行的容器,为业务容器赋能,共享一个网络空间,所以可以用127.0.0.1:3306连接主容器的数据库。9xO28资讯网——每日最新资讯28at.com

5.1 创建配置文件

为了方便调试,我把里面的shell脚本也挂载出来。创建两个configmap,分别对应容器内的配置文件与shell脚本,后面如果不需要调试可以取消mysqlshell的挂载。9xO28资讯网——每日最新资讯28at.com

apiVersion: v1kind: ConfigMapmetadata:  name: mysqlmail-conf  namespace: deandata:  application.yml: |     RUNTIME: 105800    HOST: 127.0.0.1    USER: root    PASSWORD: 123456    DATABASE: dean    TARGETMAIL: deanmr@qq.com---apiVersion: v1kind: ConfigMapmetadata:  name: mysqlmail-shell  namespace: deandata:  demo.sh: |    #!/bin/bash    RUNTIME=$(cat ./application.yml | grep RUNTIME| awk '{print $2}')    HOST=$(cat ./application.yml | grep HOST| awk '{print $2}')    USER=$(cat ./application.yml | grep USER| awk '{print $2}')    PASSWORD=$(cat ./application.yml | grep PASSWORD| awk '{print $2}')    DATABASE=$(cat ./application.yml | grep DATABASE| awk '{print $2}')    TARGETMAIL=$(cat ./application.yml | grep TARGETMAIL| awk '{print $2}')        function  sendmail(){      mysqldump -h$HOST  -u$USER -p$PASSWORD  --complete-insert --skip-add-drop-table  --column-statistics=0 --hex-blob $DATABASE  > $DATABASE.sql      echo -e "mysqlbak_$CURRENT_TIME" |mail -s "mysqlbak_$CURRENT_TIME" -a $DATABASE.sql $TARGETMAIL      sleep 1    }    while true    do       CURRENT_TIME=$(date +%H%M%S)      if [ $CURRENT_TIME = $RUNTIME ];then        echo "starting bak mysql database"        sendmail        continue      else        echo $CURRENT_TIME        sleep 1      fi    done

5.2 创建有状态服务部署文件

我们的deploy文件使用的是上篇文章中创建的mysql有状态服务的yaml9xO28资讯网——每日最新资讯28at.com

apiVersion: apps/v1kind: StatefulSetmetadata:  name: mysql  namespace: deanspec:  serviceName: mysql-service  selector:    matchLabels:      app: mysql  replicas: 1  template:    metadata:      labels:        app: mysql    spec:      containers:      - name: mysqlmail-bak        imagePullPolicy: IfNotPresent        image: mysqlmail-bak:1.0.1        volumeMounts:        - name: mysqlmail-conf          mountPath: /app/application.yml          subPath: application.yml        - name: mysqlmail-shell          mountPath: /app/demo.sh          subPath: demo.sh      - name: mysql-pod        imagePullPolicy: IfNotPresent        image: mysql:5.7        env:        - name: MYSQL_ROOT_PASSWORD          value: "123456"        ports:        - containerPort: 3306          name: msyql-listin        volumeMounts:        - name: mysql-data            mountPath: /var/lib/mysql          subPath: mysql-data        - name: mysql-conf          mountPath: /etc/mysql/conf.d/my.cnf          subPath: my.cnf      volumes:      - name: mysql-data        hostPath:          path: /data/mysql      - name: mysql-conf        configMap:          name: mysql-conf      - name: mysqlmail-conf        configMap:           name: mysqlmail-conf      - name: mysqlmail-shell        configMap:          name: mysqlmail-shell---apiVersion: v1kind: Servicemetadata:  name: mysql-service  namespace: dean  labels:    app: mysqlspec:  ports:  - targetPort: 3306    port: 3306  clusterIP: None  selector:     app: mysql

六、测试

我们上面给他定的时间是RUNTIME: 105800,上海时区也就是18点58分,我们来看一下效果 查看日志, 注意:当一个pod包含多个容器时,要使用 -c 参数指定查看哪个容器9xO28资讯网——每日最新资讯28at.com

[root@VM-24-15-centos solo]# kubectl logs -n solo mysql-0  -c mysqlmail-bak | grep mysql -C 5105755105756105757105758105759starting bak mysql databasemysqldump: [Warning] Using a password on the command line interface can be insecure.105801105802

从日志可以看到,邮件已经发送成功了!我们来去邮箱看一下,发现也已经成功了,至此我们的实验完美完成!9xO28资讯网——每日最新资讯28at.com


9xO28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-55253-0.html我们一起聊聊K8s定时备份MySQL并发送到指定邮箱

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 我们一起聊聊K8s定时备份MySQL并发送到指定邮箱

下一篇: 你是否想知道如何应对高并发?Go语言为你提供了答案!

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top