Gitlab 服务器跨主机迁移

Gitlab 不愧有版本帝之称,三天发一小版,五天发一大版,更新之快令人敬佩。 因此, Gitlab 的升级一般采用 小步迭代 方式升级,每次跨度不能太大,以免架构差异导致升级出现问题。 本次迁移使用 gitlab 自带数据备份工具 gitlab-rake 进行操作,要求备份和还原的两台服务器必须安装相同版本的gitlab。

Gitlab 服务器跨主机迁移

update @2018/01/17
update @2018/12/19

1. 迁移背景

因先前的git服务器配置较低4C/4G/40G, 在大量开发人员使用的情况下经常出现服务无法访问的问题,现在将服务器进行了迁移升级,现有配置16C/24G/100G;
新服务器在新的OpenStack开发环境中,IP地址自动获取为192.168.100.125

本次迁移使用gitlab自带数据备份工具gitlab-rake进行操作,要求备份和还原的两台服务器必须安装相同版本的gitlab。

2. 旧服务器数据备份导出

2.1 停止gitlab服务

ssh登录原服务器192.168.100.29,停止 gitlab依赖的unicorn sidekiq nginx服务,防止新的数据写入。

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
sudo gitlab-ctl stop nginx

2.2 使用gitlab自带工具gitlab-rake进行数据备份:

sudo gitlab-rake gitlab:backup:create
#输出如下,中间省略

> Dumping database ... 
> Dumping PostgreSQL database gitlabhq_production ... [DONE]
> done
> Dumping repositories ...
>  * foton-borgward-app/foton-borgward-ios ... [DONE]
>  * foton-borgward-app/foton-borgward-ios.wiki ...  [SKIPPED]
>  * tdp/guide ... [DONE]
>  ...
> Creating backup archive: 1502903527_gitlab_backup.tar ... done
> Uploading backup archive to remote storage  ... skipped
> Deleting tmp directories ... done
> Deleting old backups ... skipping

3. 新服务器安装相同版本gitlab

由于gitlab-ce安装包存储在S3上, 国内几乎不能下载. 我们从清华大学镜像源下载:

https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/

我这里直接复制之前升级gitlab时使用的rpm包。

使用rpm包的好处是,便于升级维护,当有新版需要升级时,可按照小跨度的方式 ,使用 rpm -ivh xxx.rpm 直接进行升级。

scp gitlab-ce-8.10.4-ce.0.el6.x86_64.rpm  192.168.100.125:/root
ssh 192.168.100.125 “rpm -ivh gitlab-ce-8.10.4-ce.0.el6.x86_64.rpm”

4. 配置gitlab独立硬盘

为了防止出现系统挂掉时损坏数据,我们使用了单独的硬盘来存储gitlab的数据。

在openstack上给gitlab实例外挂1块1TB硬盘,使用parted格式化成gpt分区,并挂载到gitlab的数据目录 /var/opt/gitlab/ 。
思考

对于有大容量硬盘的需求来说,我们是使用块存储还是直接将文件写入 ceph的目录,哪一种方式性能更好、对ceph是否有较大压力,需要做一下调研并给出结论)。

#硬盘分区
parted -s /dev/vdb mklabel gpt
parted -s /dev/vdb mkpart vdb1 0% 100%
parted -s /dev/vdb print
 
#挂载硬盘,将独立硬盘挂载到gitlab默认的目录 /var/opt/gitlab
sudo gitlab-ctl stop
mkdir /data/
mount /dev/vdb1/ /data/
mv /var/opt /data/ && cd /var/ && ln -sf /data/opt/ ./
sudo gitlab-ctl start
 
#检查应用状态
sudo gitlab-ctl status

5. 复制备份数据和配置文件

scp /var/opt/gitlab/backups/1502903527_gitlab_backup.tar  192.168.100.125:/var/opt/gitlab/backups
scp /etc/gitlab/gitlab.rb 192.168.100.125:/etc/gitlab/gitlab.rb
scp /etc/gitlab/gitlab-secrets.json 192.168.100.125:/etc/gitlab/gitlab-secrets.json

6. 在新服务器进行数据恢复

#先重新生成yml格式的配置文件
sudo gitlab-ctl reconfigure
 
#修改备份的数据文件权限为git用户所有
chown -R git.git /var/opt/gitlab/backups/*
 
#使用gitlab-rake进行数据恢复
sudo gitlab-rake gitlab:backup:restore BACKUP=1502903527

7. 重启服务并登录web进行验证

sudo gitlab-ctl restart

登录web界面,检查仓库及提交记录是否完整恢复,经验证无问题
image

8. 修改域名映射

需要将域名绑定指向新的IP地址

http://git.xxxxx.cn -- 192.168.100.125

9. 定时任务备份

https://docs.gitlab.com/ce/raketasks/backup_restore.html#configuring-cron-to-make-daily-backups

vim /etc/crontab
#每天晚上2:00 定时备份所有gitlab仓库、配置、和数据库
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1

#调整备份保留周期为30天。因为使用默认目录,无需打开配置文件调整
vim /etc/gitlab/gitlab.rb
#gitlab_rails['manage_backup_path'] = true
#gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
 
# limit backup lifetime to 30 days - 2592000 seconds
gitlab_rails['backup_keep_time'] = 2592000

#执行reconfigure重新生成配置文件
#Make sure to run sudo gitlab-ctl reconfigure after editing /etc/gitlab/gitlab.rb to reflect the changes.
 sudo gitlab-ctl reconfigure 

说明

The CRON=1 environment setting tells the backup script to suppress all progress output if there are no errors. This is recommended to reduce cron spam

10. 参考资料

https://docs.gitlab.com/ce/raketasks/backup_restore.html#prerequisites
https://docs.gitlab.com/omnibus/settings/backups.html
http://blog.csdn.net/jenyzhang/article/details/53928438