Gitlab 服务器跨主机迁移
Gitlab 不愧有版本帝之称,三天发一小版,五天发一大版,更新之快令人敬佩。 因此, Gitlab 的升级一般采用 小步迭代 方式升级,每次跨度不能太大,以免架构差异导致升级出现问题。 本次迁移使用 gitlab 自带数据备份工具 gitlab-rake 进行操作,要求备份和还原的两台服务器必须安装相同版本的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界面,检查仓库及提交记录是否完整恢复,经验证无问题
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