Postgresのアップグレード、本当にスペースが限られている場合

The documented procedure on the forums lists two methods of upgrading Postgres.

  1. Just let Discourse handle it. This requires 3 times the disk space. So if your DB is 100GB, you would need an additional 200GB free to do the upgrade. Obviously a huge problem for people with large installs.
  2. Follow their “manual update” procedure. This requires 2 times the disk space, so if your DB is 100GB you would need an additional 100GB free. This is also a big problem for some.

In this post, @Falco suggested using the --link option to do the upgrade in-place using hard links. The docker container they suggest using supports that argument, but Discourse devs don’t suggest using it in the post.

So my question is this, should option 3 be:

  1. Run the command below, which will require a very small amount of additional disk space. So if your DB is 100GB, it might require, say, an additional 10GB? And if so, is this a recommended procedure by the Discourse devs, and has anyone actually done it before and lived to tell the tale?

New command to upgrade in-place:

docker run --rm \
	-v DIR:/var/discourse/shared/standalone/postgres_data:/var/lib/postgresql \
	tianon/postgres-upgrade:12-to-13 \
	--link

 

Compared to the old command to upgrade into a new directory (requiring double the space):

docker run --rm \
	-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/12/data \
	-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/13/data \
	tianon/postgres-upgrade:12-to-13

P.S.: I would have just replied to that PG13 upgrade thread, but it deletes posts after 7 days. Why do you have it configured that way? I know there was a lot of discussion when this first came up that would have been useful for reference.

「いいね!」 1

If they have, they didn’t mention it here. Mostly instrucions here try to be as foolproof as possible and require as little system adminstration knowledge as possible. Most people here woud rather do something the safest, most tested way possible than some way designed to save a very few dollars.

If it works for you, you can update PostgreSQL 13 update accordingly, but before you do, do you feel comfortable recommending to someone who doesn’t know what bash is that they do it that way? You’re sure that it won’t hose their database and their site will be ruined forever?

The idea is that if some other good information is presented that it be added to the OP rather than asking people to read through year’s worth of posts that are likely to be unhelpful or wrong.

「いいね!」 1

No I’m not sure, I don’t have much experience with postgres and was hoping one of the discourse devs could provide some assurances it would work.

Even if it does work I also wouldn’t recommend it as the default upgrade procedure as the old way keeps a separate copy of the DB for rollback. If it works it would be a great option for space-constrained environments though.

Another easy way is to spin up a new server, migrate the data, and turn off the old one. If you must use the old one, do the upgrade on a temporary server, so a fresh install on the original server (which probably needs an OS upgrade) and move it back.

That’s safe, easy, and well documented. Hundreds of people have done that.

Yes, but that would take a day or two. During that time we could either a) tell users their posts during this period will be lost or b) set the forum read-only. Neither is a great solution.

「いいね!」 1

I don’t think that the server would be down a whole lot longer than during the rebuild. And if you move to the new server and stay there, you can leave the old server in read only mode while you make the move. If downtime is your concern then moving to a new server will be much, much better.

「いいね!」 1

We have a pretty big forum, but I’ve never tried restoring a backup so I don’t know how long it would take. We would indeed stay on the new host if we did it. I would like to avoid that due to the extra work/annoyance if possible.

「いいね!」 1

Yup, as I originally suggested here Discourse on postgres 12 breaks upgrades - #8 by merefield

I’d just bite the bullet?

「いいね!」 1

All my posts here have been in an ongoing attempt to avoid doing that.

@Wingtip さん、これアップグレードしましたか?

「いいね!」 1

限られたスペースでのアップグレードを解決するもう一つの方法は、バックアップを作成し、rm -rでPostgreSQLディレクトリを削除し、再構築してからバックアップを復元することです。先週、あるサイトでこの方法を実行しました。

「いいね!」 2

バックアップは、データディレクトリを複製するのとほぼ同じくらいのスペースを占有しませんか(圧縮も必要なので、それ以上になる可能性もありますか)?

「いいね!」 1

いいえ、アップグレードは一度も行っていません。DBを削除してバックアップを復元するのはかなり危険に思えます。基本的に、インプレースアップグレードを機能させる必要があります。

Ubuntu 18.04を実行していますが、これは2023年にサポートが終了するため、その時点で新しいホストに移行するしか選択肢がなくなり、その時に覚悟を決めて、22.04 LTSを実行する新しいホストを構築し、バックアップから復元することを計画しています。

うーん。無駄になるかもしれない。バックアップモデルを使えば、コピーの1つが圧縮されていて、それが違いを生む可能性があると思うか?そして、私がそれを実行したサイトはS3にバックアップがあった。テストサイトだったので、問題があってもリスクは低かった。

ただし、バックアップはインプレースアップグレードよりもはるかに頻繁に、より多くの状況で使用される。私はそれをはるかに安全だと考えている。

「いいね!」 1

しかし、PostgreSQL に関する専門知識があまりなく、自信がありません。バックアップからまったく別の VM にサイト全体を復元することはできますが、復元にかかる時間だけ投稿が失われることを意味するため、それもあまり乗り気ではありません。しかし、18.04 はサポートが終了するため、来年はあまり選択肢がありません。

「いいね!」 1

データベースが数十ギガバイトでない限り、数時間もかかりません。また、バックアップと復元を行う前にフォーラムを読み取り専用モードにするので、投稿を失うことはありません。ダウンタイムはほとんどなく、読み取り専用の時間だけで済むので、それほど難しいことではありません。

root@forum-app:/shared/postgres_data# du -sh
97G     .

読み取り専用にするのではなく、今日の投稿は一時的なものであることを示すバナーを掲示することをお勧めします。私の見解では、投稿は失われるとしても、それについてチャットできるようにしておく方が良いでしょう。

「いいね!」 1

そうなれば、組み込みの Discourse チャットにもアクセスできるようになります。これは 2.9 でリリースされる機能です(おそらくデフォルトではオフですが、ベータ版で利用可能でサポートされます)。

「いいね!」 3