こんにちは。弊社では自社でリポジトリサーバを立てておりGitLabを利用しています。
今年5月にGitLabのアップグレード作業をしましたので、そのことについてまとめてみようかと思います。
はじめに
アップグレード前の弊社の環境は以下のようなものでした。
- GitLab CE 11.0.2
- MySQL(5.7)で動いている
- ソースインストール版を使っている
- 700以上のリポジトリ、200以上のユーザーが存在
GitLab 12.1以降、MySQLのサポートがなくなりPostgreSQLのみがサポートされるようになりました。Subgroupsなどの機能はPostgreSQLのみでしか使えません。最新版の機能を使うためにはPostgreSQLへ移行する必要があります。
また、GitLabはソースファイルを使って手動でセットアップしインストールするソースインストール版と、パッケージを使ってインストールするオムニバスパッケージ版があります。
公式ではオムニバスパッケージ版を推奨しており、オムニバスパッケージ版はソースインストール版に比べてアップグレードも簡単にできます。
そのため今回のアップグレードではPostgreSQLへの移行、オムニバスパッケージ版への移行も同時に行いました。
この記事ではMySQLからPostgreSQLへの移行手順について紹介します。OSはUbuntu 16.04.4 LTSです。
MySQLからPostgreSQLへ移行
移行のためにやることは以下です。
- PostgresSQLをインストール
- PGloaderをインストール
- スキーマ更新
- データ移行
GitLabの公式ドキュメントにMySQLからPostgreSQLへの移行手順が紹介されているので、それを元にやっていきます。
PostgreSQLをインストール
PostgreSQLをインストールします。
拡張機能を使用する必要があるため、少なくともPostgreSQL 9.2が必要です。
作業時点のPostgresSQLの最新バージョンは9.5だったのでそれをインストールしました。
# PostgreSQLのパッケージをインストールする
sudo apt-get install -y postgresql postgresql-client libpq-dev postgresql-contrib
# GitLab用のデータベースユーザーを作成する
sudo -u postgres psql -d template1 -c "CREATE USER git CREATEDB;"
# 全文検索モジュールのpg_trgmを読み込む
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
# Production環境のデータベースを作成する
sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
sudo -u git -H psql -d gitlabhq_production
ALTER USER git WITH PASSWORD 'secure password';
PGloaderをインストール
MySQLのデータをPostgresSQLへ移行するにはPGLoaderを使います。GitLabでは3.4.1以上を推奨しています。
作業時点の最新バージョンは3.5.2だったのでそれをインストールしました。
# リポジトリを追加
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# キーを追加
sudo apt-get install wget ca-certificates
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# PGloaderをインストール
sudo apt-get update
sudo apt-get install pgloader
# PGloaderのログ出力でパーミッションエラーを防ぐための変更
sudo chown postgres:postgres /tmp/pgloader
スキーマ更新
GitLabのデータベースをPostgreSQLへ切り替えます。
sudo service gitlab stop
sudo su - git
cd /home/git/gitlab
# PostgreSQL用のdatabase.ymlを使うように変更
mv config/database.yml config/database.yml.bak
cp config/database.yml.postgresql config/database.yml
chmod o-rwx config/database.yml
# Postgresqlに関連するGemをインストールする
rm .bundle/config
bundle install --deployment --without development test mysql aws kerberos
# 変更したconfig/database.ymlを読み込んでデータベース、テーブルを作成
bundle exec rake db:create db:migrate RAILS_ENV=production
データ移行
データ移行のために pgloader
コマンドを実行します。
移行用のスニペットとしてcommands.load
ファイルを作成し、それを pgloader
コマンドの引数として渡して実行します。MySQLのユーザ名、パスワード、ホストは環境に合わせて変更してください。
データサイズによってはPGloaderのオプションに prefetch rows
を指定しないと、 Heap exhausted, game over
になるので適切な値を指定する必要があるかもしれません。
以下では prefetch rows = 10000
を指定しています。
# commands.loadを作成
sudo tee -a commands.load <<'EOF'
LOAD DATABASE
FROM mysql://gitlab:gitlab@unix://var/run/mysqld/mysqld.sock:/gitlab
INTO postgresql://postgres@unix://var/run/postgresql:/gitlabhq_production
WITH include no drop, truncate, disable triggers, create no tables,
create no indexes, preserve index names, no foreign keys,
data only, prefetch rows = 10000
ALTER SCHEMA 'gitlab' RENAME TO 'public'
;
EOF
# commands.loadファイルを指定してpgloaderを実行する。
sudo -u postgres pgloader commands.load
# 移行が終わるとコンソールに以下のような概要表が出力される。
table name errors rows bytes total time
----------------------------------------------- --------- --------- --------- --------------
fetch meta data 0 119 0.388s
Truncate 0 119 1.134s
----------------------------------------------- --------- --------- --------- --------------
public.abuse_reports 0 0 0.490s
public.appearances 0 0 0.1 kB 0.488s
.
.
.
public.web_hook_logs 0 0 1.3 MB 1.080s
----------------------------------------------- --------- --------- --------- --------------
COPY Threads Completion 0 4 2.008s
Reset Sequences 0 113 0.304s
Install Comments 0 0 0.000s
----------------------------------------------- --------- --------- --------- --------------
Total import time ? 2117341 2.1 GB 2m44.631s
MySQLのデータが移行されているか確認
データ移行が終わったのでGitLabを起動してPostgreSQLに切り替わっているか、データが移行されているかを管理画面などから確認すると良いです。
sudo service gitlab start
まとめ
今回はソースインストール版GitLabのMySQLからPostgreSQLへの移行手順について紹介しました。
GitLabの更新頻度は高いため、実際に移行作業する際は公式ドキュメントを一度確認するのが良いです。この記事の内容もすぐに古くなるかもしれません。