最近,我将安装了GitLab12.10的Omnibus的PostgreSQL数据库从10.12升级到了11.7

我們提供每次瀏覽都找不到的小趣聞。這篇文章是筆者個人的觀點,與作者所屬的任何組織無關。

0. 开篇

GitLab 12.10已发布了!关于该版本的发布说明中似乎提到了以下的内容。

PostgreSQL 11 现在成为 GitLab 自托管版的默认版本。
(https://about.gitlab.com/releases/2020/04/22/gitlab-12-10-released/#postgresql-11-is-now-the-default-version-of-postgresql-for-gitlab-self-managed)

基本上,從GitLab 12.10開始,預設安裝的PostgreSQL版本已經升級到11了。它提到了升級到PostgreSQL 11會提升性能並降低CPU使用率之類的事情,但我更關心以下內容。

Note that PostgreSQL 9.6 and PostgreSQL 10 will no longer be supported as of GitLab 13.0. 
You will need to upgrade your PostgreSQL version prior to upgrading to 13.0.

在GitLab 13中,已不再支持PostgreSQL 9.6和10!

image.png

升级至GitLab 12.10的重要注意事项,请参阅:https://about.gitlab.com/releases/2020/04/22/gitlab-12-10-released/#upgrade

正如上述文章所提到的,终于到了必须升级到PostgreSQL 11的时候了。
这里有篇关于如何将Omnibus安装的GitLab的PostgreSQL从9.6.14升级到10.9的故事——Qiita
https://qiita.com/ynott/items/653236f1a5c2ab8cf69f

image.png

GitLab即将发布的版本 | GitLab
https://about.gitlab.com/upcoming-releases/

目前的PostgreSQL版本如下所示。

image.png

升级似乎可以通过相似的方法进行。
那么,让我们试一试吧。

把Postgresql升级到11版本。

仔细阅读文件

首先,让我们仔细阅读文件。
数据库设置 | GitLab
https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server

注意:

    • アップグレードする前にコマンドを確認する

 

    • アップグレードするときのダウンタイムを考慮する

 

    バックアップを取る

在升级之前,建议进行以下检查:

    1. 最新版的GitLab能够正常运行

 

    1. 即使运行sudo gitlab-ctl reconfigure也不会出现错误

 

    能够提供足够的数据空间供迁移使用

在计划中产生停机时间是需要注意的要点。
让我们在今年的黄金周长假期间安排。

1-2. 我们要确认一下是否是最新版本的GitLab。

已经更新为最新版本了。

1-3. 确认重新配置不会有问题

$ sudo gitlab-ctl reconfigure
Starting Chef Client, version 14.14.29
resolving cookbooks for run list: ["gitlab"]
   ---- <中略> ---
Chef Client finished, 12/779 resources updated in 46 seconds

Warnings:
The version of the running postgresql service is different than what is installed.
Please restart postgresql to start the new version.

sudo gitlab-ctl restart postgresql

gitlab Reconfigured!

我们已经重新配置完成。

确认是否安装了PostgreSQL 11的二进制文件。

我相信他是强壮的,但为了确保,我会确认一下是否有 PostgreSQL 11 的二进制文件。
以下是错误的命令!

请运行 `sudo ls -la /opt/gitlab/embedded/postgresql/11/bin/` 来进行确认。

$ sudo ls -la /opt/gitlab/embedded/postgresql/
total 20
drwxr-xr-x  5 root root 4096 Feb 23 02:44 .
drwxr-xr-x 18 root root 4096 May  3 17:03 ..
drwxr-xr-x  5 root root 4096 May 23  2019 10
drwxr-xr-x  5 root root 4096 Feb 23 02:44 11
drwxr-xr-x  5 root root 4096 Dec 23  2018 9.6
lrwxrwxrwx  1 root root   35 Jun 12  2019 9.6.8 -> /opt/gitlab/embedded/postgresql/9.6
$ sudo ls -la /opt/gitlab/embedded/postgresql/11/bin/
total 11484
drwxr-xr-x 2 root root    4096 May  2 02:44 .
drwxr-xr-x 5 root root    4096 May 23  2019 ..
-rwxr-xr-x 1 root root   64056 May  1 00:38 clusterdb
-rwxr-xr-x 1 root root   63840 May  1 00:38 createdb
-rwxr-xr-x 1 root root   68696 May  1 00:38 createuser
-rwxr-xr-x 1 root root   59184 May  1 00:38 dropdb
-rwxr-xr-x 1 root root   59152 May  1 00:38 dropuser
-rwxr-xr-x 1 root root  941952 May  1 00:38 ecpg
-rwxr-xr-x 1 root root  132568 May  1 00:38 initdb
-rwxr-xr-x 1 root root   34128 May  1 00:38 oid2name
-rwxr-xr-x 1 root root   30640 May  1 00:38 pg_archivecleanup
-rwxr-xr-x 1 root root  116176 May  1 00:38 pg_basebackup
-rwxr-xr-x 1 root root  141152 May  1 00:38 pgbench
-rwxr-xr-x 1 root root   34152 May  1 00:38 pg_config
-rwxr-xr-x 1 root root   42952 May  1 00:38 pg_controldata
   ---- <後略> ---

在Postgresql 11中有一个名为/opt/gitlab/embedded/postgresql/11/bin/的目录,其中包含了二进制文件。
看起来没有问题。

1-5. 确认是否有足够的可用容量进行迁移。

※原因:由于需要同时保留旧数据和创建新的数据库,所以需要两倍的容量。
现有数据库的使用量。

$ sudo du -sh /var/opt/gitlab/postgresql/data
187M	/var/opt/gitlab/postgresql/data

当前的磁盘使用量

$ sudo df -h 
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdb        50G   17G   34G  34% /var/opt/gitlab

1-6. 备份

在发生问题时,我们要进行备份,以便可以回溯到之前的状态。可以跳过数据库以外的数据,按照以下方式进行备份将会更加轻松。

sudo gitlab-backup create SKIP=uploads,repositories,builds,artifacts,lfs,registry,pages

※注意:GitLab从版本12.1开始

执行升级命令

好了好了,心跳加速了,让我们试着升级一下吧。

如果您使用的是GitLab 12.10及更高版本,请执行以下命令。

$ sudo gitlab-ctl pg-upgrade

如果是在12.8之前的情况下,

$ sudo gitlab-ctl pg-upgrade -V 11

听说会这样。

$ sudo gitlab-ctl pg-upgrade
Checking for an omnibus managed postgresql: OK
Checking if postgresql['version'] is set: OK
Checking if we already upgraded: NOT OK
Checking for a newer version of PostgreSQL to install
Upgrading PostgreSQL to 11.7
Checking if PostgreSQL bin files are symlinked to the expected location: 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.

当您升级到PostgreSQL 10时,情况与以前的情况相同。
您将有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: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: prometheus: 1s, normally up
ok: down: puma: 0s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: registry: 1s, normally up
ok: down: sidekiq: 0s, 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
Saving the old version information: OK
Configuring PostgreSQL

由於以下部分是與正常的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, 4/771 resources updated in 06 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 25892) 0s
ok: run: gitaly: (pid 25902) 1s
ok: run: gitlab-exporter: (pid 25921) 0s
ok: run: grafana: (pid 25923) 1s
ok: run: logrotate: (pid 25944) 0s
ok: run: node-exporter: (pid 25950) 1s
ok: run: postgres-exporter: (pid 25955) 0s
ok: run: prometheus: (pid 25963) 0s
ok: run: puma: (pid 26048) 1s
ok: run: redis-exporter: (pid 26056) 0s
ok: run: registry: (pid 26063) 1s
ok: run: sidekiq: (pid 26072) 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.10
sudo rm -f /var/opt/gitlab/postgresql-version.old

如果没有任何问题,/var/opt/gitlab/postgresql/data.10可以被删除而不会有任何问题。

1-8. 数据确认

让我们确认一下以下目录的情况:
/var/opt/gitlab/postgresql/

$ sudo ls -la /var/opt/gitlab/postgresql/
total 28
drwxr-xr-x  4 gitlab-psql root         155 May  3 17:23 .
drwxr-xr-x 23 root        root        4096 May  3 17:23 ..
-rwx------  1 gitlab-psql gitlab-psql  795 May  3 17:22 analyze_new_cluster.sh
drwx------ 19 gitlab-psql gitlab-psql 4096 May  3 17:23 data
drwx------ 19 gitlab-psql gitlab-psql 4096 May  3 17:22 data.10
-rwx------  1 gitlab-psql gitlab-psql   52 May  3 17:22 delete_old_cluster.sh
-rw-------  1 gitlab-psql root          52 Jul 23  2017 .profile
srwxrwxrwx  1 gitlab-psql gitlab-psql    0 May  3 17:22 .s.PGSQL.5432
-rw-------  1 gitlab-psql gitlab-psql   81 May  3 17:22 .s.PGSQL.5432.lock

有两个数据,data和data.10。
data.10是一个过时的目录。

我会检查容量。

$ sudo du -sh /var/opt/gitlab/postgresql/data
107M	/var/opt/gitlab/postgresql/data

比之前更加紧凑…(嗯,还可以吧)

1-9. 检查执行二进制文件

让我们确认一下是否正在运行 PostgreSQL 11。

$ ps axwwu | grep bin/postgres
gitlab-+ 25509  0.0  1.3 1100208 55676 ?       Ss   17:22   0:00 /opt/gitlab/embedded/bin/postgres -D /var/opt/gitlab/postgresql/data

由于仅凭这个信息无法得知,我将确认/opt/gitlab/embedded/bin/postgres正在查看哪个位置。

$ ls -la /opt/gitlab/embedded/bin/postgres
lrwxrwxrwx 1 root root 47 May  3 17:22 /opt/gitlab/embedded/bin/postgres -> /opt/gitlab/embedded/postgresql/11/bin/postgres

我确认/opt/gitlab/embedded/postgresql/11/bin/postgres没有问题。

2. 核实动作

让我们确认一下相关的行为。

image.png

一切沒問題,PostgreSQL已更新至11.7版。

4. 删除旧数据

只需要删除旧数据,但由于我天生胆小,所以只会做移动操作。

sudo mv /var/opt/gitlab/postgresql/data.10 /root/backup
bannerAds