Evgenii Legotckoi
Evgenii Legotckoi18 квітня 2022 р. 17:39

Django - Урок 058. Розростання бази даних через таблицю django_session

Останнім часом я помітив, що наближається той фатальний момент, коли катастрофічно перестане хапати дискового простору для сайту на хостингу. А дамп бази даних стає неймовірно величезним, хоча очевидних передумов для цього жодних немає. Розмір контенту на сайті не зростає так швидко, та й кількість зареєстрованих користувачів також не прибуває так швидко.

Після вивчення бази даних було виявлено, що розмір таблиці django_session просто гігантський майже 7 Гб, а розмір індексу також досягає майже 6.5 Гб, при тому, що розмір самої бази даних 14 Гб.

При цьому розмір другої за величиною таблиці всього 11 Мб і це стороннє додаток зі списком міст. А розмір третьої таблиці, що містить повідомлення на форумі лише 8 Мб.

Відповідно, було вирішено розібратися, чому це відбувається і як виправляти.

Зараз я швидше за все не відкрию нічого нового для тих, хто активно адмініструє бази даних на PostgreSQL, але для новачків і тих, хто в основному займається Django як PET проект, без професійного використання, інформація може бути корисною.


Як перевірити розмір таблиці

https://evileg.com/ru/knowledge/article/add/#
Для цього достатньо виконати наступний запит в інтерфейсі адміністрування PostreSQL. І отримаємо відсортоване виведення інформації по таблицях бази даних.

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)

Як бачите, в моєму випадку таблиця djang_session за 6 років існування сайту на движку Django розросла дуже сильно.
Дякуємо DDOS відвідувачам, механізму створення ключів сесії для всіх анонімних користувачів, а також тому, що за замовчуванням PostgreSQL навіть при видаленні записів не зменшує розмір файлу бази даних.

А розмір бази даних можна переглянути так

SELECT pg_size_pretty( pg_database_size('databasename') );
 pg_size_pretty 
----------------
 14 GB
(1 row)

Ось такий неприємний розмір вийшов - 14 GB.

Видалення сесій із минулим терміном

Коли сайт піддається DDOS або просто напливу користувачів, створюється величезна кількість сесій, які зазвичай в Django не видаляються, а також додатково зростає індекс таблиці.

Тому перше, що потрібно зробити, це видалити застарілі сесії. Для цього у Django є команда clearsessions .

Тому в консолі активуємо python середовище вашого проекту, переходимо до папки з вашим проектом і виконуємо наступну команду.

python manage.py clearsessions

Це видалить усі старі сесії. Ви також можете налаштувати виконання команди за розкладом через cron.
Наприклад, за допомогою батарейки django-session-cleanup , для неї потрібне використання celery .

Запуск збирача сміття

Після того, як ви виконали видалення старих сесій, вам необхідно звільнити простір зайнятий базою даних.
Це необхідно тому, що пріоритет бази даних – це продуктивність, а не економія дискового простору. Таким чином, файл бази даних розростається за рахунок зростання індексу, а даних там вже давно немає. А також за замовчуванням збирач сміття не запускається сам по собі, для цього необхідно налаштовувати його запуск за розкладом, наприклад, за допомогою демона.

Але особисто я поки що зробив це вручну. Складальник сміття в PostgreSQL запускається командою vacuum .

vacuum FULL ANALYZE django_session;

Після виконання цієї операції знову перевіряю розмір бази даних та бачу

SELECT pg_size_pretty( pg_database_size('databasename') );
 pg_size_pretty 
----------------
 494 MB
(1 row)

Тепер розмір бази даних лише 494 MB, що не може не тішити.

Потрібно буде згодом налаштувати запуск збирача сміття хоча б раз на тиждень, але про це вже в наступній статті.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

u
  • 15 травня 2022 р. 07:58
  • (відредаговано)

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

Evgenii Legotckoi
  • 15 травня 2022 р. 09:27

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах