OmnibusインストールされたGitLab 12.10のPostgreSQLを10.12から11.7にアップグレードした話


毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

0. はじめに

GitLab 12.10がリリースされましたね!
そのリリースノートの内容に何やら以下のような話が書いてありました。

PostgreSQL 11 is now the default version of PostgreSQL for GitLab Self-Managed
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はサポートされない!とあります。

UpgradeにもGitLab 13.0ではPostgreSQL 9.6と10は削除されるからね!とあります。

Important notes on upgrading to 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

さてさて、GitLab 13っていつリリースされるのだっけ?と見てみたら、2020年5月22日と
もう直ぐではありませんか。。。

GitLab upcoming releases | GitLab
https://about.gitlab.com/upcoming-releases/

現在のPostgreSQLのバージョンは以下の通りです。


自動的にバージョンアップされるはずですが、されていませんでしたので手動で対応します。

アップグレードは同じような方法でできるようです。
では、やってみましょう。

1. Postgresqlをバージョン11に移行する

1-1. ドキュメントをよく読む

まずは、ドキュメントをよく読みましょう。
Database settings | GitLab
https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server

Note:

  • アップグレードする前にコマンドを確認する
  • アップグレードするときのダウンタイムを考慮する
  • バックアップを取る

アップグレード前に以下のことをチェックすることが推奨です。
1. 最新版のGitLabがちゃんと動いていること
2. sudo gitlab-ctl reconfigureが実行してもエラーが出ないこと
3. 移行できるだけのデータ領域が確保されていること

ダウンタイムが発生するというのは注意ポイントですね。
今回はゴールデンウィークの大型連休中にやってしまいましょう。

1-2. 最新版のGitLabになっているか確認します。

最新版になっています。

1-3. reconfigureして問題ないことを確認

$ 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!

reconfigureできました。

1-4. 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
   ---- <後略> ---

/opt/gitlab/embedded/postgresql/11/bin/というPostgresql 11のディレクトリがあって、その下にバイナリが入っています。
問題なさそうです。

1-5. 移行できる容量があるか確認

※理由:古いデータを残したまま新しいDBを作るので2倍容量が必要になるから。
既存DB領域使用量

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

現在のDisk使用量

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

1-6. バックアップ

何かあった時に戻せるようにバックアップをとりましょう。DB以外はスキップしていいので、以下のようにするとバックアップが楽にできるでしょう。

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

※注: GitLab 12.1以降

1-7. アップグレードコマンドを実行する

さてさて、ドキドキしますが、アップグレードしてみましょう。

以下のコマンドは、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 が書き換わるのでDiffが盛大に出ます。
しかし、/etc/gitlab/gitlab.rbを元に再設定されるので気にしなくてOKです。

最後にこんなメッセージが出ます。

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. 動作確認

一通り挙動を確認しましょう。

無事、PostgreSQL 11.7になりました。

4. 古いデータを削除

あとは古いデータを削除するだけなのですが、根っから小心者なので移動だけしておきます。

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