私の Firefish インスタンスは昨年の11月に構築されましたが、使用しているデータベースのバージョンは当然最新ではありません。具体的には、5年前のPostgresに基づいたPGroonga 12という古いバージョンです。将来の互換性やセキュリティの問題を避けるため、またパフォーマンスを向上させるために、今日はこのデータベースをアップグレードする必要があります。
Dockerで稼働しているデータベースをアップグレードするのは、他のDockerコンテナをアップグレードするのとは大きく異なります。新しいイメージをプルするだけでは終わりません。Postgresはほぼ毎回メジャーバージョンでBreaking Changesがあり、旧バージョンと新バージョンで生成される永続化ファイルは互換性がありません。新しいイメージを直接プルして実行すると、データベースは起動しません。そのため、データを移行するための手段を講じる必要があります。
Postgresには公式のアップグレードツールpg_upgrade
1がありますが、今回は使用しません。私のデータベースは1年以上稼働しており、しかも5年前の古いバージョンを使用しているため、このツールを使って問題が発生しないか確信が持てません。この移行では、SQLをエクスポートしてから新しいバージョンにインポートするという大まかな手順を取ります。
アップグレード前のデプロイ状況
以下はアップグレード前に知っておくべき設定情報です:
項目 | 設定 |
---|---|
インスタンスのデプロイ方法 | Docker Compose |
データベースコンテナ名 | firefish_db |
アップグレード前のデータベースコンテナイメージ | groonga/pgroonga:3.1.9-alpine-12-slim |
データベースユーザー | example-firefish-user |
データベース名 | firefish |
Docker Composeのデータベース部分は以下の通りです:
|
|
現在のデータベースのエクスポート
データベースをアップグレードする前に、まずFirefishのオーケストレーションを停止します:
|
|
データベースコンテナを単独で起動し、現在のデータベースをSQLとしてエクスポートします:
|
|
Firefishのデータベースは比較的大きいため、エクスポートプロセスにはかなりの時間がかかる可能性があります。例えば、私の個人インスタンスでは10分以上かかりました。
エクスポートファイルの処理
おそらく新しいバージョンのPostgresの認証方法が変更されたため、以前エクスポートしたbackup.sql
ファイルを新しいデータベースに直接インポートすると、新しいデータベースの認証スキームが変更され、その後Firefishがデータベースに接続する際に認証に失敗します。この問題を避けるためには、現在のbackup.sql
ファイルを処理し、firefish
データベースの部分のみを抽出し、すべてのデータを直接インポートしないようにする必要があります。2
|
|
上記の内容でシェルスクリプトを作成し、script.sh
として保存して、現在のbackup.sql
を処理します:
|
|
すべてが順調に進めば、現在のディレクトリにupgrade.sql
という名前のファイルが作成されます。これを開いて、正しくエクスポートされたか確認してください。
新しいデータベースに既存データをインポート
docker-compose.yml
を修正します:
|
|
データベースディレクトリのマッピング設定が./db:/var/lib/postgresql/data
から./database:/var/lib/postgresql/data
に変更されていることに注意してください。これは、新しいデータベースに新しいスタートを与えつつ、古い永続化データを保存するためです。問題が発生しても、古いデータベースにいつでも戻すことができます。
新しいコンテナをプルして起動します:
|
|
upgrade.sql
を新しいデータベースにインポートします:
|
|
データベースのサイズに応じて、インポートプロセスも長時間かかる可能性があります。
仕上げ作業
インポートが完了したら、全体のオーケストレーションを起動します:
|
|
インポート後の最初の起動では、-d
パラメータを使用しないことをお勧めします。パラメータなしで起動し、起動プロセスに問題がないことを確認した後、-d
パラメータで再起動してください。
最後に、新しく起動したFirefishインスタンスにログインし、データが損失していないか確認します。問題がなければ、作業完了です🎉