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

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

# 0. はじめに

Omnibus GitLabでバージョンGitLab 11.11より前にインストールされた方は、恐らくPostgreSQLが9.6.14であるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/17ccbc0e-6887-4f0b-8b74-ba012dd44da3.png)

しかし、以下のリリースノートを見て気がつきました。

GitLab 12.5 with EKS Cluster Creation & Environments Dashboard | 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がサポートされなくなります！！！`*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/595b9b47-0cfa-c704-0165-0e38a6f9c312.png)

これによると何やら、PostgreSQL 11のパーティショニングの性能がいいからGitLab 13.xではPostgreSQL11または12にバージョンアップすることを計画中で、GitLab 13からは、PostgreSQL 11が必須になる予定なんだそうです。ちなみに、GitLab 13は2020年05月22日にリリース予定です。

おやおや大変です。自前管理のGitLabを見て見てみましたが、上記のようにPostgreSQL 9.6.14です。

Database settings | GitLab
https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server
によると「バージョン12以降は、明示的に指定しないと自動的にアップグレードされる」とあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/1a1d740c-84a2-54f0-9f7a-33f3db610336.png)

の筈なのですが、移行はされていないようです。
なので手動で移行してみます。

# 1. Postgresqlをバージョン10に移行する
## 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になっているか確認します。

再掲
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/9022ef6b-1d4f-db69-f6fb-43b0505e33b0.png)
大丈夫そうです。

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

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

reconfigureできました。

## 1-4. Postgresql 10のバイナリが入っているか確認する

大丈夫だと思いますが、念のためPostgreSQL 10のバイナリがあるかどうか確認します。

```bash
~$ 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. 移行できる容量があるか確認
※理由：古いデータを残したまま新しいDBを作るので2倍容量が必要になるから。

既存DBはこれぐらいですね。

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

Disk使用率はこんなものなので大丈夫でしょう。

```bash
~$ sudo df -h 
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvdb        20G   15G  5.8G  72% /var/opt/gitlab
```

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

```
sudo gitlab-backup create SKIP=uploads,repositories,builds,artifacts,lfs,registry,pages
```
※注： GitLab 12.1以降

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

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

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

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

```bash
~$ 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を確認

動作を確認したら、再起動してみます。
(ComponentsがPostgreSQL10にならなかったからです)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/17646a86-b4f9-6605-f6a8-819a940a81e9.png)

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

# 4. 古いデータを削除

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

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