系列文章目录
golang实现mysql全量备份工具
golang命令行框架cobra
文章目录
前言
在顶部文章中,通过golang编写了一个mysql的全量备份工具,经过验证备份工具没有问题,可以正常使用。但是在正式的生产环境中,作为运维的你怎么确认昨天的备份是成功的?最普通的方式是登上服务器手动查看,这种方式在当前的自动化运维中显得有些low了。因为生产环境中避免不了prometheus监控的接入,因此,为了解决手动确认备份成功的问题,并结合Prometheus实现备份检查告警,通过golang的cobra命令行框架编写一个备份检查工具脚本和mysql实例存活探测脚本来实现。Cobra 的命令行工具 cobra-cli 进一步提高了编写命令行程序的效率,非常推荐使用它来实现命令行工具的开发,可以加快开发速度。
一、引入cobra命令行框架
因为要开发的工具最终是以二进制命令的方式在linux服务器中执行,恰好golang的标准库cobra满足该条件,因此使用它为基础实现备份检查和实例存活检查工具的开发
在阅读下方的开发脚本过程前,先阅读顶部的第二篇文章golang命令行框架cobra,
对cobra的概念和命令使用有个整体了解后,阅读下方代码会更加容易
二、工具开发过程
1.引入库
命令如下(示例):
[root@python2 ~]# go get -u -v github.com/spf13/cobra
[root@python2 ~]# go install github.com/spf13/cobra-cli@latest
2.cobra-cli初始化项目
[root@python2 ~]# cobra-cli init mysql_golang_tools
[root@python2 ~]# tree mysql_golang_tools
├── mysql_golang_tools
│ ├── cmd
│ │ └── root.go
│ ├── LICENSE
│ └── main.go
3.修改cmd/root.go文件
因为备份检查和存活检查工具是分别写在不同的文件中的,所以在root.go文件中将不必要的代码先删除掉
代码如下(示例):
/*
Copyright © 2024 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"os"
"github.com/spf13/cobra"
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "mysql_golang_tools",
Short: "include mysql backupfile check and mysql alive check",
Long: `这是一个检查mysql 全量备份及mysql实例存活的golang脚本`,
//Run: func(cmd *cobra.Command, args []string) { fmt.Println("hello cobra") },
}
// Execute adds all child commands to the root command and sets flags appropriately.
// 命令执行入口处
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
4.编写备份检查代码
mysql全量备份可参考顶部文章golang实现mysql全量备份
采用上述工具备份完成后,备份日志及备份存放目录截图如下
代码功能(示例):
1、检查指定备份存放目录下是否存在对应的备份文件
2、检查指定备份日志文件中是否包含‘compeleted OK!’字样,如果包含则说明备份是成功且完整的,反之,备份失败
3、执行构建好的二进制程序后,返回值是 mysqlbackupcheck,port=xxxx status=0/1i
4、因为这个返回值后期在对接Prometheus的自定义监控时会使用到,这个后续再说
5、status=0i代表备份失败,反之status=1i代表备份成功。只有这两种状态
代码如下(示例):
//backupFileCheck.go
package cmd
import (
"bufio"
"fmt"
"os"
"path/filepath"
"strings"
"time"
"github.com/spf13/cobra"
)
var mysqlBackupDirectory, mysqlBackupLogDir string
// 备份文件检查子命令入口
var backupFileCheck = &cobra.Command{
Use: "mysqlbackupcheck",
Short: "这是mysql全量备份文件检查工具",
Args: cobra.ArbitraryArgs, //接收任意参数
Run: func(cmd *cobra.Command, args []string) {
CheckBackup(