Open eternal-flame-AD opened 3 hours ago
もしかしたら、Managed DBを使っている場合は Auto VACUUM が有効でしょうし、個人が管理するpostgresにしても、auto VACUUMの設定を有効にすることができるという点で、Misskeyというソフトウェアの責任の範疇ではないかもしれません。 (あったらあったで便利だと思います!)
個人的には「とりあえずMisskeyを稼働させるドキュメント」は公式に案内されていますが、 「ステップアップしてスケールさせていくときのドキュメント」が公開されるととてもとても良いと思います。
「ステップアップしてスケールさせていくときのドキュメント」が公開されるととてもとても良いと思います。
FYI: https://misskey-hub.net/ja/docs/for-admin/install/resources/scale-out/
おお、そのドキュメントはすでにあるのですね! ではこちらを拡張させていくのが良いと思います。
ところで、これは完全にオフトピックですが、 Postgresのレプリケーションは確かに有効にできるのですが、私の環境ではファイルのアップロードのときにアップロードの完了しなくなる、あるいはエラーがでるようになる副作用があるので(これはSQLのInsertが完了するよりも早くSelectしてしまうからだと思うのですが) 一番最初にある項目にもかかわらず私はそれを有効にして運用することができません…… https://github.com/misskey-dev/misskey/issues/10897
Docker composeはプライベートネットワーク(SQL環境は複数のコマンドが必要)ので Misskeyが全部自動的にしてマニュアルvacuum必要がないと思いました。
appで実装の代わりに公式サイトにdocker-compose/local deployment環境に必要なメインテナンスを記入してのも良いと思います。
「MisskeyがDBのメインテナンス機能がない docker exec psql ... VACUUM ANALYZE;
は定期的に実行するを勧めます。」などの言葉では明確に述べるできたら良いとおもいます。
VACUUM
はScalingの領域ではないので https://misskey-hub.net/ja/docs/for-admin/install/guides/docker/ には適切と思います?
Docker固有の事情はよくわからないのですが、 dockerコンテナにsshして postgres.conf の auto_vacuumを enableにすればよいのでは、と思いましたが永続化保証がないですね。ううむ。
Autovacuumは既にonけど何故か"note"をVacuumしていない。。 (Transaction locks? 自動的なVacuumは使用中のテーブルはLockしません)
misskey@localhost:misskey> show autovacuum;
+------------+
| autovacuum |
|------------|
| on |
+------------+
SHOW 1
Time: 0.142s
misskey@localhost:misskey> show autovacuum_vacuum_threshold;
+-----------------------------+
| autovacuum_vacuum_threshold |
|-----------------------------|
| 50 |
+-----------------------------+
SHOW 1
Time: 0.143s
misskey@localhost:misskey> show autovacuum_vacuum_insert_threshold;
+------------------------------------+
| autovacuum_vacuum_insert_threshold |
|------------------------------------|
| 1000 |
+------------------------------------+
SHOW 1
Time: 0.143s
misskey@localhost:misskey> select relname, last_autovacuum from pg_stat_all_tables where schemaname = 'public' and relname = 'note';
+---------+-----------------+
| relname | last_autovacuum |
|---------+-----------------|
| note | <null> |
+---------+-----------------+
SELECT 1
Time: 0.144s
misskey@localhost:misskey> select relname, last_autovacuum from pg_stat_all_tables where last_autovacuum is not null and schemaname = 'public' order by last_autovacuum desc;
+-------------------------+-------------------------------+
| relname | last_autovacuum |
|-------------------------+-------------------------------|
| __chart__active_users | 2024-11-16 00:00:23.928789+00 |
| user | 2024-11-15 12:19:32.058+00 |
| note_unread | 2024-11-14 18:31:58.262931+00 |
| __chart__federation | 2024-11-14 16:57:55.838571+00 |
| user_note_pining | 2024-11-14 12:03:49.898469+00 |
| user_profile | 2024-11-14 11:30:55.466137+00 |
| retention_aggregation | 2024-11-14 00:00:57.582109+00 |
| __chart_day__federation | 2024-11-13 02:57:27.227732+00 |
| hashtag | 2024-11-11 19:29:18.180407+00 |
| instance | 2024-11-10 18:54:25.823239+00 |
| user_publickey | 2024-11-07 15:09:11.314558+00 |
| access_token | 2024-11-07 08:22:54.832434+00 |
+-------------------------+-------------------------------+
前vacuumするAPIあってコントロールパネルから叩けたけどなんで廃止したんだっけ
Summary
SQLを書かなくても API/WebUI/定期的に
VACUUM ANALYZE
などよく使われるデータベースメインテナンスコマンドをできるように欲しい。例えば
POST /api/admin/maintenance/db/vacuum
->VACUUM (ANALYZE, TRUNCATE $1, PARALLEL $2)
サブミットする。(数分かかります)GET /api/admin/maintenance/db/history
-> 前回実行したタイムスタンプPurpose
Postgresは定期的に
VACUUM ANALYZE
コマンドが必要と思います。VACUUMが行われない限り削除したノートなどのデータは再利用恐らくできません、 ベンチマークはまだしていないでも多少なりともパフォーマンスも関わると思います。MisskeyはDocker composeで内部ネットワークで専用データベースを使っているので、データベースのメインテナンスは
docker exec psql
/ mTLS/SSH プロキシ してSQLを書く のは一般的な管理者に対しては操作が困難だと思います。自分のインスタンス(~5人)のstats:
Vacuum後(ディスクスペースが少なくないためTRUNCATEオプションが使っていないTotal pagesは減らない それでも削除したページは再利用できなりました):
実装決定されたら幸いです。Backendは自信あるけどFrontend経験ほぼないので、Frontend部分は公式チームにお願いいただけます。
Do you want to implement this feature yourself?