私の Firefish インスタンスは昨年の11月に構築されましたが、使用しているデータベースのバージョンは当然最新ではありません。具体的には、5年前のPostgresに基づいたPGroonga 12という古いバージョンです。将来の互換性やセキュリティの問題を避けるため、またパフォーマンスを向上させるために、今日はこのデータベースをアップグレードする必要があります。

Dockerで稼働しているデータベースをアップグレードするのは、他のDockerコンテナをアップグレードするのとは大きく異なります。新しいイメージをプルするだけでは終わりません。Postgresはほぼ毎回メジャーバージョンでBreaking Changesがあり、旧バージョンと新バージョンで生成される永続化ファイルは互換性がありません。新しいイメージを直接プルして実行すると、データベースは起動しません。そのため、データを移行するための手段を講じる必要があります。
Postgresには公式のアップグレードツールpg_upgrade1がありますが、今回は使用しません。私のデータベースは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インスタンスにログインし、データが損失していないか確認します。問題がなければ、作業完了です🎉
