Чому мій «використаний обсяг байтів» постійно збільшується на моєму кластері Amazon Aurora?


11

У мене є кластер БД Amazon (AWS) Aurora , і з кожним днем ​​його [Billed] Volume Bytes Usedзбільшується.

Показники VolumeBytesвикористовували CloudWatch з часом

Я перевірив розмір усіх моїх таблиць (у всіх моїх базах даних на цьому кластері) за допомогою INFORMATION_SCHEMA.TABLESтаблиці:

SELECT ROUND(SUM(data_length)/1024/1024/1024) AS data_in_gb, ROUND(SUM(index_length)/1024/1024/1024) AS index_in_gb, ROUND(SUM(data_free)/1024/1024/1024) AS free_in_gb FROM INFORMATION_SCHEMA.TABLES;
+------------+-------------+------------+
| data_in_gb | index_in_gb | free_in_gb |
+------------+-------------+------------+
| 30         | 4           | 19         |
+------------+-------------+------------+

Всього: 53 Гб

Так чому мені нарахували наразі майже 75 ГБ?

Я розумію, що передбачений простір ніколи не може бути звільнений так само, як файли ibdata на звичайному сервері MySQL ніколи не можуть скорочуватися; Я з цим все в порядку. Це є документально підтвердженим та прийнятним.

Моя проблема полягає в тому, що з кожним днем ​​збільшується простір, який мені виставляють рахунки. І я впевнений, що я не використовую 75 Гб місця тимчасово. Якби я робив щось подібне, я зрозумів би. Це так, як ніби місце, де я звільняюсь, видаляючи рядки з моїх таблиць, або скидаючи таблиці, або навіть скидаючи бази даних, ніколи не використовуються повторно.

Я неодноразово зв'язувався із службою підтримки AWS (преміум-класу), і мені так і не вдалося отримати гарне пояснення, чому це так.
Я отримав пропозиції працювати OPTIMIZE TABLEнад таблицями, у яких багато free_space(на INFORMATION_SCHEMA.TABLESтаблицю), або перевірити довжину історії InnoDB, щоб переконатися, що видалені дані не зберігаються в сегменті відкату (посилання: MVCC ) , і перезапустіть екземпляри, щоб переконатися, що сегмент відкату спорожнено.
Ніхто з них не допоміг.

Відповіді:


19

Тут грають кілька речей ...

  1. Кожна таблиця зберігається у власному просторі таблиць

    За замовчуванням група параметрів для кластерів Aurora (названа default.aurora5.6) визначає innodb_file_per_table = ON. Це означає, що кожна таблиця зберігається в окремому файлі на кластері зберігання Aurora. Ви можете бачити, який простір таблиць використовується для кожної вашої таблиці за допомогою цього запиту:

    SELECT name, space FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;

    Примітка: Я не пробував зміни innodb_file_per_tableв OFF. Може, це допоможе ..?

  2. Простір пам’яті, звільнений шляхом видалення просторів таблиць, НЕ використовується повторно

    Цитуючи підтримку AWS premium:

    Завдяки унікальній конструкції двигуна Aurora Storage для підвищення його продуктивності та відмовостійкості Aurora не має функціоналу для дефрагментації табличних просторів файлів за столом аналогічно стандартному MySQL.

    В даний час Aurora, на жаль, не має можливості зменшити простори таблиць, як це робить стандартний MySQL, і весь фрагментарний простір заряджається, оскільки він включений у VolumeBytesUsed.
    Причина того, що Aurora не може повернути простір випалої таблиці так само, як і стандартний MySQL, полягає в тому, що дані для таблиці зберігаються абсолютно по-іншому до стандартної бази даних MySQL з єдиним обсягом зберігання.

    Якщо ви кинете таблицю або рядок в Aurora, простір не буде повернено на об'єм кластера Auroras через цю складну конструкцію.
    Ця неможливість повернути невелику кількість місця для зберігання є жертвою, зробленою для отримання додаткового підвищення продуктивності обсягу зберігання кластерів Auroras та значно покращеної відмовостійкості Aurora.

    Але є якийсь незрозумілий спосіб повторно використовувати частину цього витраченого простору ...
    Знову ж, цитуйте підтримку преміум-класу AWS:

    Як тільки ваш загальний набір даних перевищить певний розмір (приблизно 160 ГБ), ви можете почати відновлювати простір у 160 ГБ блоків для повторного використання, наприклад, якщо у вашому об'ємі кластера Aurora є 400 ГБ і DROP 160 Гб або більше таблиць, Aurora може потім автоматично повторно використовувати 160 ГБ даних. Однак повернути цей простір можна повільно.
    Причина великого обсягу даних, необхідних для одразу звільнення, пов'язана з унікальним дизайном Auroras як двигуна БД корпоративного масштабу на відміну від стандартного MySQL, який не може бути використаний у цій шкалі.

  3. ОПТИМІЗУЙТЕ ТАБЛИЦЮ - це зло!

    Оскільки Aurora базується на MySQL 5.6, OPTIMIZE TABLEвідображається карта ALTER TABLE ... FORCE, яка відновлює таблицю для оновлення статистики індексу та звільнення невикористаного простору в кластерному індексі. Ефективно, поряд з innodb_file_per_table = ON, це означає, що запуск a OPTIMIZE TABLEстворює новий файл просторової таблиці та видаляє старий. Оскільки видалення файлу просторової таблиці не звільняє використовуване ним сховище, це OPTIMIZE TABLEзавжди призведе до забезпечення більшої кількості пам’яті. Ой!

    Посилання: https://dev.mysql.com/doc/refman/5.6/uk/optimize-table.html#optimize-table-innodb-details

  4. Використання тимчасових таблиць

    За замовчуванням група параметрів для екземплярів Aurora (названих default.aurora5.6) визначає default_tmp_storage_engine = InnoDB. Це означає, що кожного разу, коли я створюю TEMPORARYтаблицю, вона зберігається разом із усіма моїми звичайними таблицями на кластері зберігання Aurora. Це означає, що передбачено новий простір для зберігання цих таблиць, таким чином збільшуючи загальний об'єм використаних обсягів.
    Рішення для цього досить просте: змініть default_tmp_storage_engineзначення параметра на MyISAM. Це змусить Aurora створити TEMPORARYтаблиці на локальному сховищі примірника.
    Зверніть увагу: локальне зберігання примірників обмежене; перегляньте Free Local Storageпоказник у CloudWatch, щоб побачити, скільки місця зберігають ваші екземпляри. Більші (дорожчі) екземпляри мають більше локального сховища.

    Реф.: Ще немає; чинна документація Amazon Aurora про це не згадує. Я попросив команду підтримки AWS оновити документацію і оновить свою відповідь, якщо / як тільки вони це зроблять.


1
Це чудова відповідь, і так , це основні застереження. Радий, що я це бачив.
ceejayoz

Дітто. Помітив, що один сервер БД склав до 300 ГБ, для бази даних з розміром звіту про MySQL розміром 54 ГБ ... якщо простір ніколи не відновлюється, це хороший приклад того, що відбувається, коли у вас є багато часто записуваних таблиць ( наприклад таблиці журналів, таблиці покажчиків тощо).
geerlingguy

0

Коли дані Aurora видаляються, наприклад, за допомогою випадання таблиці або розділу, загальний виділений простір залишається колишнім. Вільний простір повторно використовується автоматично при збільшенні обсягу даних у майбутньому. https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/Aurora.Managing.Performance.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.