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は削除されるからね！`**とあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/0136e766-6a8c-b6ee-9d7c-9d447af2b728.png)

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日と
もう直ぐではありませんか。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/6c58c55c-e983-af00-5bb4-f97d45294191.png)

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


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/410ae846-4723-ff8f-b307-4be6acbc3b07.png)
自動的にバージョンアップされるはずですが、されていませんでしたので手動で対応します。

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

# 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して問題ないことを確認

```bash
$ 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のバイナリがあるかどうか確認します。
以下、コマンドを間違えています！:relaxed:

`sudo ls -la /opt/gitlab/embedded/postgresql/11/bin/` 
で確認してください。

```bash
$ 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領域使用量

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

現在のDisk使用量

```bash
$ 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以降の場合です。

```bash
$ sudo gitlab-ctl pg-upgrade
```

12.8以前の場合は、

```bash
$ 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です。

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

```bash
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/

```bash
$ 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が古いディレクトリです。

容量を確認します。

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

移行前よりもコンパクトになっています...(まあ、いいでしょう)

## 1-9. 実行バイナリーの確認

PostgreSQL 11が実行されているかどうか確認しましょう。

```bash
$ 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がどこを見ているか確認します。

```bash
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/3c421951-ee45-cae2-6394-8f5256be22ba.png)

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

# 4. 古いデータを削除

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

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