Kürzlich habe ich festgestellt, dass der fatale Moment naht, in dem der Speicherplatz für die Site auf dem Hosting katastrophal nicht mehr ausreicht. Und der Datenbank-Dump wird unglaublich groß, obwohl es dafür keine offensichtlichen Voraussetzungen gibt. Die Inhaltsgröße der Site wächst nicht so schnell und die Anzahl der registrierten Benutzer wächst auch nicht so schnell.
Nach der Untersuchung der Datenbank wurde festgestellt, dass die Größe der Tabelle django_session nur gigantische fast 7 GB beträgt und die Größe des Index auch fast 6,5 GB erreicht, obwohl die Größe der Datenbank selbst 14 GB beträgt.
Gleichzeitig beträgt die Größe der zweitgrößten Tabelle nur 11 MB, und dies ist eine Drittanbieteranwendung mit einer Liste von Städten. Und die Größe der dritten Tabelle, die Nachrichten im Forum enthält, beträgt nur 8 MB.
Dementsprechend wurde beschlossen, herauszufinden, warum dies geschieht und wie es behoben werden kann.
Denjenigen, die PostgreSQL-Datenbanken aktiv administrieren, werde ich jetzt wahrscheinlich nichts Neues verraten, aber für Anfänger und diejenigen, die sich hauptsächlich mit Django als PET-Projekt beschäftigen, ohne professionellen Einsatz, können die Informationen nützlich sein.
So überprüfen Sie die Tabellengröße
https://evileg.com/ru/knowledge/article/add/#
Führen Sie dazu einfach die folgende Abfrage in der PostreSQL-Administrationsoberfläche aus. Und wir erhalten eine sortierte Ausgabe von Informationen zu den Datenbanktabellen.
select table_name, pg_relation_size(quote_ident(table_name)), pg_size_pretty(pg_relation_size(quote_ident(table_name))) from information_schema.tables where table_schema = 'public' order by 2; forum_forumpost | 8290304 | 8096 kB cities_light_city | 11108352 | 11 MB django_session | 7225204736 | 6890 MB (110 rows)
Wie Sie sehen können, ist in meinem Fall die Tabelle djang_session in den 6 Jahren des Bestehens der Site auf der Django-Engine stark gewachsen.
Dank DDOS-Besuchern, dem Mechanismus zum Erstellen von Sitzungsschlüsseln für alle anonymen Benutzer und der Tatsache, dass PostgreSQL die Größe der Datenbankdatei standardmäßig nicht reduziert, selbst wenn Datensätze gelöscht werden.
Und die Größe der Datenbank kann so gesehen werden
SELECT pg_size_pretty( pg_database_size('databasename') ); pg_size_pretty ---------------- 14 GB (1 row)
Hier kam so eine unangenehme Größe heraus - 14 GB.
Abgelaufene Sitzungen löschen
Wenn eine Seite DDOSed wird oder einfach mit Benutzern überschwemmt wird, werden eine Vielzahl von Sitzungen erstellt, die in Django normalerweise nicht gelöscht werden, und der Tabellenindex wächst zusätzlich.
Daher ist das erste, was zu tun ist, veraltete Sitzungen zu entfernen. Django hat dafür den Befehl clearsessions .
Daher aktivieren wir in der Konsole die Python-Umgebung Ihres Projekts, gehen in den Ordner mit Ihrem Projekt und führen den folgenden Befehl aus.
python manage.py clearsessions
Dadurch werden alle alten Sitzungen gelöscht. Sie können diesen Befehl auch so planen, dass er über cron ausgeführt wird.
Beispielsweise erfordert die Verwendung der Batterie
django-session-cleanup
die Verwendung von
celery
.
Garbage Collector ausführen
Nachdem Sie das Entfernen alter Sitzungen abgeschlossen haben, müssen Sie den von der Datenbank belegten Speicherplatz freigeben.
Dies ist notwendig, da die Priorität der Datenbank die Leistung gegenüber der Einsparung von Speicherplatz ist. Somit wächst die Datenbankdatei aufgrund des Wachstums des Index, und die Daten sind seit langem nicht mehr dort. Außerdem startet der Garbage Collector standardmäßig nicht von selbst, dafür müssen Sie ihn so konfigurieren, dass er nach einem Zeitplan startet, beispielsweise mit einem Daemon.
Aber ich persönlich habe es bisher manuell gemacht. Der Garbage Collector in PostgreSQL wird mit dem Befehl vacuum gestartet.
vacuum FULL ANALYZE django_session;
Nachdem ich diese Operation durchgeführt habe, überprüfe ich die Größe der Datenbank erneut und sehe
SELECT pg_size_pretty( pg_database_size('databasename') ); pg_size_pretty ---------------- 494 MB (1 row)
Jetzt beträgt die Datenbankgröße nur noch 494 MB, was eine gute Nachricht ist.
Im Laufe der Zeit wird es notwendig sein, den Garbage Collector so zu konfigurieren, dass er mindestens einmal pro Woche ausgeführt wird, aber dazu mehr im nächsten Artikel.
А если хранить сессии в SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' ?
Интересно стало насколько безопасно хранить сессии в печеньках... стоит оно того или нет?)
Думаю, что скорее всего это будет менее безопасно, но на практике я не проверял.