Evgenii Legotckoi
Evgenii Legotckoi18. April 2022 17:39

Django - Tutorial 058. Datenbankwachstum aufgrund der django_session-Tabelle

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.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

u
  • 15. Mai 2022 07:58
  • (bearbeitet)

А если хранить сессии в SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' ?
Интересно стало насколько безопасно хранить сессии в печеньках... стоит оно того или нет?)

Evgenii Legotckoi
  • 15. Mai 2022 09:27

Думаю, что скорее всего это будет менее безопасно, но на практике я не проверял.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken