gitlab的自动备份经历

前提

之前休假的时候,公司里搭建的gitlab服务器莫名宕机,为此还被召唤回公司。到公司以后鼓捣了一下,发现是硬盘损坏,这下没辙了只能放弃。
休假完以后到公司重新更换硬盘、重装系统、安装gitlab,让大家重新申请账号、提交版本库。整个过程耗时耗力,回头想想当时要是要是做了双硬盘备份,也就不会有这么麻烦的事情了。
花费了时间把自动备份功能完成,在此做个记录。

gitlab手动备份

当完成gitlab搭建,所有用户完成备份以后,修改/etc/gitlab/gitlab.rb里面的默认存放备份文件的目录:

gitlab_rails['backup_path'] = '/home/backup'

修改完以后保存,使用如下命令来重载配置文件:

sudo gitlab-ctl reconfigure

当完成以上操作以后,我们用下面的命令来完成备份:

gitlab-rake gitlab:backup:create

等待命令完成,我们可以到/home/backup目录下查看,会发现多了一个”**.tar”的文件。

gitlab自动备份?

当我们完成上面的操作以后,已经可以手动备份gitlab了。但是不可能每天都去服务器敲一下命令,备份一次。我们需要一个自动备份的机制,这里我们就需要用到linux的crontab工具。

crontab

在ubuntu版本下,crontab工具是默认安装的,配置文件在/etc/crontab里,用编辑器打开,我们看到如下的东西:

# m h dom mon dow user command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly 
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

在crontab文件里面,每一行代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,每个字段之间用空格分割,没用的段用*代替,格式如下:

m h dom mon dow user command

其中:

  • m: 表示分钟,可以是从0到59之间的任何整数。
  • h:表示小时,可以是从0到23之间的任何整数。
  • dom:表示日期,可以是从1到31之间的任何整数。
  • mon:表示月份,可以是从1到12之间的任何整数。
  • dow:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • user : 表示执行的用户。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件(如shell文件)。

我们在/home/backup目录下创建auto_backup.sh文件,同时赋予执行权限,操作如下:

sudo chmod +x auto_backup.sh
sudo vim auto_backup.sh

进入编辑界面,添加如下代码:

gitlab-rake gitlab:backup:create

然后保存退出。我们可以执行一遍该脚本,可以发现在bakcup目录下又创建了一个备份。
修改crontab文件,添加一行:

0 20 * * * root /home/backup/auto_backup.sh -D 1

上面的命令就是让crontab每天的20:00自动执行auto_backup.sh脚本。

find和rm

当上面的操作完成以后,我们已经完成了自动备份的功能,但是每天备份一次,备份的文件大概300M,一、两个月以后我们的硬盘就没有剩余空间了。所以我们还需要添加删除过期文件的功能。
首先我们要查找出备份目录下面过期的文件,然后在删除,指令如下,具体的find指令介绍见这里

find "/home/backup/" -name "*.tar" -ctime +1 -type f -exec rm -rf {}

上面指令的意思就是查找备份目录下面后缀名是tar的所有普通文件,判断他们的创建时间,如果是1天前创建的,那么就删除。

双备份机制

好了,到这里我们想要的功能才完成了10%(什么?才10%?),因为我们最重要的功能没有做,双备份(想想开头,为什么要重新搭建服务器,因为我们的硬盘彻底坏了)。

这里我使用一个U盘(不要问我为什么只有U盘,公司不给换硬盘,你让我怎么变)。首先我们插上U盘,查看一下U盘在哪里:

sudo fdisk -l

正常会看到下面的信息:
fdisk信息
我们可以看到U盘在这里是/dev/sdc1,有可能是/dev/sdb1,看实际情况。
操作U盘我们可以如下:

sudo mkdir /media/usb
# 把U盘挂载到了/media/usb目录下;
sudo mount -t vfat /dev/sdc1 /media/usb

# 把U盘卸载掉
sudo umount /media/usb

上面的操作,让我们知道了怎么挂载与卸载U盘,熟悉了上面的操作以后,我们就在auto_backup.sh里面添加一些命令:

if mount -t vfat /dev/sdb1 /media/usb;then
   if cp *.tar /media/usb;then
      find "/home/backup/" -name "*.tar" -ctime +1 -type f -exec rm -rf {} \;
      umount /media/usb;
   fi
else
   echo "mount failed";
fi

上面的指令就完成了U盘里面过期备份文件删除,同时把备份文件拷贝到U盘。

代码

最后完整的代码见下:

#!/bin/bash

BACKUP_PATH1="/home/backup/"
BACKUP_PATH2="/media/usb/"
DAY=2

gitlab-rake gitlab:backup:create;
find $BACKUP_PATH1 -name "*.tar" -ctime +$DAY -type f -exec rm -rf {} \;

if mount -t vfat /dev/sdb1 /media/usb;then
   if cp *.tar /media/usb;then
      find "/home/backup/" -name "*.tar" -ctime +1 -type f -exec rm -rf {} \;
      umount /media/usb;
   fi
else
   echo "mount failed";
fi

好了,提交上面的代码,服务器可以放心的运行了。至少当服务器在此宕机的时候,我们已经有了备份资料。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值