因为公司代码仓库是用gitlab,最近一直在想数据丢失了如何处理,硬盘坏了如何处理,今天好好研究了下,发现gitlab备份还是挺简单的。
首先设定备份目录我设置的本地目录是/usr/backup
vim /etc/gitlab/gitlab.rb
gitlab_rails[‘backup_path’] = “/usr/backup”
设置完保存然后重载配置
gitlab-ctl reconfigure
使用
gitlab-rake gitlab:backup:create进行数据的备份
gitlab-rake gitlab:backup:create进行备份的目录是根据
git_data_dirs({ “default” => { “path” => “/data/gitlab/git-data” } })
但是在备份的时候我遇到一个问题
报pcack-objects died of signal 9
这个的一时是内存不足导致发送kill 9的指令结束报错
然后看了下内存的确不够用
之前不知道备份和内存有什么关系只知道gitlab运行需要大量内存,如果内存不够web会报500错误
由于我的服务器只有4G内存,备份代码每次备份中都在使用内存,导致内存不足,后来我想到代码库里有几个项目有2个G的大小
所以我的想法是如果排除这两个代码库执行备份,但是skip无法达到这个效果,我试着将数据目录里面的2个git文件重命名(因为备份是备份.git结尾的文件),但是重命名后如果去刷新web会导致无法找到该项目,如果想备份后正常使用该项目就要重新导入该项目
刚好看下skip的参数:
排除特定目录
可以通过加环境变量skip来选择要备份的内容。可用的选项有:
db
(数据库)uploads
(附件)repositories
(Git repositories 数据)builds
(CI job output logs)artifacts
(CI job artifacts)lfs
(LFS objects)registry
(Container Registry images)pages
(Pages content)具体流程是:
然后创建一个同名的项目。
确保管理员所在机器的ssh 公钥已经保存在gitlab网站上。这样管理员可以在自己的机器上和gitlab系统交互。
现在在管理员自己的机器上,进入项目目录(项目目录拷贝自git server,目录后缀名是.git), 运行几个命令:
cd your_project.git/
git remote add origin git@gitlab_host:admin/your_project.git
git push -u origin master
这个方法的确可以但是需要手动去删除创建项目然后导入,那这个太麻烦,所以被我排除了
另外一种方法是因为内存不足,所以我试着加入SWAP虚拟内存,
我在根目录用dd if创建了2个G 的swapfile文件
sudo dd if=/dev/zero of=/swapfile bs=1024 count=2048k
mkswap /swapfile
swapon /swapfile
chmod 600 /swapfile
然后free -m查看发现是有swap了
然后重新执行gitlab-rake gitlab:backup:create成功了
但是如果后续文件越来越大的话 估计要加物理内存或者将项目分割多个项目(暂时没有尝试过)
备份完毕之后会在备份目录产生类似的tar包(如果中途报错的话会生成两个目录db 和repository目录)
但是进过备份之后会产生缓存,需要手动清理缓存
sync && echo 1 > /proc/sys/vm/drop_caches
sync && echo 2 > /proc/sys/vm/drop_caches
sync && echo 3 > /proc/sys/vm/drop_caches
但是我这里一般都是凌晨执行备份
所以我这边设置了定时任务crontab 每天一点执行备份
0 1 * * * root /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
CRON=1的意思是可以当在计划任务备份时没有错误输出时不向系统发送垃圾邮件
并且我这里还会在1点之前 1点半之前执行清理缓存,所以我这里需要写个清理缓存的脚本,这个我在前面讲过详细见:
gitlab恢复:
# 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 从1393513186编号备份中恢复
gitlab-rake gitlab:backup:restore BACKUP=1510940304_2017_11_18
# 启动Gitlab
sudo gitlab-ctl start
数据迁移:
迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups
目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups
即可(如果你没修改过默认备份目录的话). 但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.
也就是gitlab的版本必须相同不然会报错