在Omnibus安装的GitLab中,从9.6.14升级到10.9的PostgreSQL的故事
我们介绍一些无法通过谷歌搜索到的小趣闻。
本文是我个人的观点,与我所属的任何组织无关。
首先
如果您在 Omnibus GitLab 中安装的是版本 GitLab 11.11 之前的,那么很可能您的 PostgreSQL 版本是 9.6.14。

然而,我在查看以下版本说明时注意到了。
GitLab 12.5 即将推出 EKS 集群创建和环境仪表盘的功能。详见 GitLab 官方博客:https://about.gitlab.com/blog/2019/11/22/gitlab-12-5-released/#planned-deprecation-of-postgresql-9.6-and-10.x-in-gitlab-13.0
在GitLab 13中,将不再支持PostgreSQL 9.6和PostgreSQL 10.x版本!!!

根据这个,听说PostgreSQL 11的分区性能很好,所以GitLab 13.x计划升级到PostgreSQL 11或12版本,从GitLab 13开始,要求使用PostgreSQL 11。顺便提一下,GitLab 13预计在2020年05月22日发布。
哎呀,糟糕了。我去看了一下自己管理的GitLab,结果发现它使用的是PostgreSQL 9.6.14版本。

应该是这样的,但好像没有进行迁移。
所以我会尝试手动迁移。
将Postgresql迁移到10版本。
仔细阅读文件
首先,让我们仔细阅读文档。
数据库设置 | GitLab
https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server
请注意:
-
- アップグレードする前にコマンドを確認する
-
- アップグレードするときのダウンタイムを考慮する
- バックアップを取る
建议在升级之前检查以下事项。
-
- 确保最新版本的GitLab可以正常运行。
-
- 确保执行sudo gitlab-ctl reconfigure时没有出现错误。
- 确保有足够的数据存储空间以进行迁移。
发生停机是需要注意的地方。
可以考虑在年末或者新年期间进行。
1-2. 我们要确认我们使用的是最新版本的GitLab。

确认可以重新配置并且没有问题
xxxx:/var/opt/gitlab/postgresql$ sudo gitlab-ctl reconfigure
Starting Chef Client, version 14.13.11
resolving cookbooks for run list: ["gitlab"]
---- <中略> ---
Running handlers:
Running handlers complete
Chef Client finished, 3/813 resources updated in 09 seconds
gitlab Reconfigured!
我已经重新配置完成。
只需要一个选项:
1-4. 检查是否安装了Postgresql 10的二进制文件。
我认为他是个顶天立地的人,但为了安全起见,我会确认一下是否有PostgreSQL 10的二进制文件。
~$ sudo ls -la /opt/gitlab/embedded/postgresql/
total 16
drwxr-xr-x 4 root root 4096 Jun 12 02:44 .
drwxr-xr-x 16 root root 4096 Dec 10 14:17 ..
drwxr-xr-x 5 root root 4096 May 23 2019 10
drwxr-xr-x 5 root root 4096 Dec 23 2018 9.6
~$ sudo ls -la /opt/gitlab/embedded/postgresql/10/bin/
total 11480
drwxr-xr-x 2 root root 4096 Dec 4 02:44 .
drwxr-xr-x 5 root root 4096 May 23 2019 ..
-rwxr-xr-x 1 root root 64056 Dec 3 21:07 clusterdb
-rwxr-xr-x 1 root root 63840 Dec 3 21:07 createdb
-rwxr-xr-x 1 root root 68616 Dec 3 21:07 createuser
-rwxr-xr-x 1 root root 59184 Dec 3 21:07 dropdb
-rwxr-xr-x 1 root root 59152 Dec 3 21:07 dropuser
-rwxr-xr-x 1 root root 941952 Dec 3 21:07 ecpg
-rwxr-xr-x 1 root root 132568 Dec 3 21:07 initdb
-rwxr-xr-x 1 root root 34128 Dec 3 21:07 oid2name
-rwxr-xr-x 1 root root 30640 Dec 3 21:07 pg_archivecleanup
-rwxr-xr-x 1 root root 116216 Dec 3 21:07 pg_basebackup
-rwxr-xr-x 1 root root 141112 Dec 3 21:07 pgbench
-rwxr-xr-x 1 root root 34152 Dec 3 21:07 pg_config
-rwxr-xr-x 1 root root 42952 Dec 3 21:07 pg_controldata
---- <中略> ---
有一个名为/opt/gitlab/embedded/postgresql/10/bin/的PostgreSQL 10目录,其中包含二进制文件。
看起来没有问题。
1-5. 确认是否有可用的存储容量进行迁移
理由:由于需要将旧数据保留在新数据库中,因此需要两倍的容量。
现有的数据库就是这样了。
~$ sudo du -sh /var/opt/gitlab/postgresql/data
310M /var/opt/gitlab/postgresql/data
由于磁盘利用率只是这样的,所以应该没问题。
~$ sudo df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvdb 20G 15G 5.8G 72% /var/opt/gitlab
1-6. 备份
为了在发生任何问题时能够恢复,请备份数据。你可以跳过除了数据库之外的其他内容,按照以下方式进行备份会更轻松。
sudo gitlab-backup create SKIP=uploads,repositories,builds,artifacts,lfs,registry,pages
请注意:GitLab 12.1及以上版本。
执行升级命令
~$ sudo gitlab-ctl pg-upgrade
Checking for an omnibus managed postgresql: OK
Checking for a newer version of PostgreSQL to install
Upgrading PostgreSQL to 10.9
Checking if we already upgraded: NOT OK
Checking if PostgreSQL bin files are symlinked to the expected location: OK
Checking if postgresql['version'] is set: OK
Waiting 30 seconds to ensure tasks complete before PostgreSQL upgrade.
See https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server for details
If you do not want to upgrade the PostgreSQL server at this time, enter Ctrl-C and see the documentation for details
Please hit Ctrl-C now if you want to cancel the operation.
你将有30秒的执行时间。
啊,如果忘了备份的话,请使用Ctrl-C来取消。
下文如下所示。
Toggling deploy page:cp /opt/gitlab/embedded/service/gitlab-rails/public/deploy.html /opt/gitlab/embedded/service/gitlab-rails/public/index.html
Toggling deploy page: OK
Toggling services:ok: down: alertmanager: 1s, normally up
ok: down: gitaly: 0s, normally up
ok: down: gitlab-exporter: 0s, normally up
ok: down: grafana: 0s, normally up
ok: down: logrotate: 1s, normally up
ok: down: mattermost: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis-exporter: 1s, normally up
ok: down: registry: 0s, normally up
ok: down: sidekiq: 1s, normally up
Toggling services: OK
Running stop on postgresql:ok: down: postgresql: 0s, normally up
Running stop on postgresql: OK
Symlink correct version of binaries: OK
Creating temporary data directory: OK
Initializing the new database: OK
Upgrading the data: OK
Move the old data directory out of the way: OK
Rename the new data directory: OK
Configuring PostgreSQL
Starting Chef Client, version 14.13.11
resolving cookbooks for run list: ["gitlab::config", "postgresql::enable"]
以下是与普通的sudo gitlab-ctl reconfigure相同的部分,所以将其省略。
与普通的sudo gitlab-ctl reconfigure不同的是,
会修改/var/opt/gitlab/postgresql/data/postgresql.conf,因此会有很大的差异。
但是,它会基于/etc/gitlab/gitlab.rb进行重新配置,所以不用担心。
最后会出现这样的消息。
Running handlers:
Running handlers complete
Chef Client finished, 5/813 resources updated in 09 seconds
Running reconfigure: OK
Waiting for Database to be running.
Database upgrade is complete, running analyze_new_cluster.sh
Toggling deploy page:rm -f /opt/gitlab/embedded/service/gitlab-rails/public/index.html
Toggling deploy page: OK
Toggling services:ok: run: alertmanager: (pid 15506) 1s
ok: run: gitaly: (pid 15518) 0s
ok: run: gitlab-exporter: (pid 15538) 1s
ok: run: grafana: (pid 15547) 0s
ok: run: logrotate: (pid 15560) 0s
ok: run: mattermost: (pid 15567) 1s
ok: run: node-exporter: (pid 15575) 0s
ok: run: postgres-exporter: (pid 15585) 1s
ok: run: prometheus: (pid 15594) 0s
ok: run: redis-exporter: (pid 15678) 0s
ok: run: registry: (pid 15688) 1s
ok: run: sidekiq: (pid 15696) 0s
Toggling services: OK
==== Upgrade has completed ====
Please verify everything is working and run the following if so
sudo rm -rf /var/opt/gitlab/postgresql/data.9.6
如果操作没有问题的话,删除/var/opt/gitlab/postgresql/data.9.6应该没有问题。
1-8. 数据确认
我们来确认一下以下目录的状态:
/var/opt/gitlab/postgresql/
~$ sudo ls -la /var/opt/gitlab/postgresql/
total 28
drwxr-xr-x 4 gitlab-psql root 156 Dec 10 14:17 .
drwxr-xr-x 23 root root 4096 Dec 10 14:17 ..
-rwx------ 1 gitlab-psql gitlab-psql 795 Dec 10 14:17 analyze_new_cluster.sh
drwx------ 19 gitlab-psql gitlab-psql 4096 Dec 10 14:17 data
drwx------ 19 gitlab-psql root 4096 Dec 10 14:17 data.9.6
-rwx------ 1 gitlab-psql gitlab-psql 52 Dec 10 14:17 delete_old_cluster.sh
-rw------- 1 gitlab-psql root 52 Jul 23 2017 .profile
srwxrwxrwx 1 gitlab-psql gitlab-psql 0 Dec 10 14:17 .s.PGSQL.5432
-rw------- 1 gitlab-psql gitlab-psql 81 Dec 10 14:17 .s.PGSQL.5432.lock
有两个数据,data和data.9.6。
data.9.6是一个旧文件。
2. 核实行动
让我们确认一下行为方式。
3. 重新启动并检查组件。
一旦确认了操作后,我会尝试重新启动。(因为Components没有升级到PostgreSQL10)

一切无虞,PostgreSQL 已升级至 10.9 版本。
4. 清除旧数据
剩下的只需删除旧数据,但我是一个害怕的人,所以只做移动的工作。
sudo mv /var/opt/gitlab/postgresql/data.9.6 /root/backup