Сообщество адекватных инженеров | Все про DevOps и эксплуатацию.
Культура, инструменты, подходы и решения
Живо общаемся (чат): https://t.me/+eNGNnbY_2mVkZTEy
По всем вопросам в бота: @HDFeedBackBot
Web: https://happydevops.ru
Post #681
655
Партиционирование баз данных превратилось в модную тему. О нем говорят на каждой конференции, пишут в каждой второй статье про оптимизацию. Только часто забывают сказать главное: партиционирование — сложная техника, которая может не только ускорить, но и замедлить систему.
В основе партиционирования лежит простая идея — разделить большую таблицу на маленькие части по какому-то признаку. База будет работать с каждой частью как с отдельной таблицей, но для приложения всё останется единым целым. И тут важно не путать партиционирование с шардированием.
При партиционировании все данные живут на одном сервере, просто база умнее работает с разными частями таблицы. А шардирование раскидывает данные по разным физическим серверам. Партиционирование спасает от проблем с большими таблицами, шардирование — от ограничений одного сервера. Часто их комбинируют: сначала делят данные на шарды по серверам, а внутри шарда — на партиции.
Партиционирование по времени — самый популярный вариант. Логи, метрики, исторические данные — всё, что имеет временную метку, можно разбить по дням, неделям или месяцам. База будет быстро находить нужный диапазон и не тратить время на сканирование старых данных. А ещё появится возможность по-разному хранить старые и новые данные: свежие держать на SSD, а исторические переносить на медленные диски.
Географическое партиционирование спасает распределённые системы. Данные европейских клиентов живут в европейских дата-центрах, азиатских — в азиатских. Запросы летят к ближайшему серверу, задержки минимальны. Только придётся продумать, что делать с путешествующими пользователями.
Партиционирование по хешу равномерно распределяет данные между частями. Это полезно, когда нет явного признака для разделения, но нужно распределить нагрузку. База считает хеш от выбранных полей и решает, куда положить строку. Минус один — сложно понять, в какой партиции искать конкретную запись.
Из реальной практики: один проект страдал от медленных запросов к логам. Таблица разрослась до нескольких терабайт, индексы не помогали. Разбили данные по дням — и запросы ускорились в десятки раз. Зато другой проект потратил месяц на внедрение партиционирования, а в итоге только усложнил поддержку базы. Потому что не учли: если 90% запросов читают данные из всех партиций, разделение только навредит.
Партиционирование — мощный инструмент, но не серебряная пуля. Оно нужно, когда у вас реально много данных, чётко выделяется признак для разделения, и большинство запросов работают с подмножеством данных. В остальных случаях хорошо настроенных индексов будет достаточно.
🏴☠️ @happy_devops
В основе партиционирования лежит простая идея — разделить большую таблицу на маленькие части по какому-то признаку. База будет работать с каждой частью как с отдельной таблицей, но для приложения всё останется единым целым. И тут важно не путать партиционирование с шардированием.
При партиционировании все данные живут на одном сервере, просто база умнее работает с разными частями таблицы. А шардирование раскидывает данные по разным физическим серверам. Партиционирование спасает от проблем с большими таблицами, шардирование — от ограничений одного сервера. Часто их комбинируют: сначала делят данные на шарды по серверам, а внутри шарда — на партиции.
Партиционирование по времени — самый популярный вариант. Логи, метрики, исторические данные — всё, что имеет временную метку, можно разбить по дням, неделям или месяцам. База будет быстро находить нужный диапазон и не тратить время на сканирование старых данных. А ещё появится возможность по-разному хранить старые и новые данные: свежие держать на SSD, а исторические переносить на медленные диски.
Географическое партиционирование спасает распределённые системы. Данные европейских клиентов живут в европейских дата-центрах, азиатских — в азиатских. Запросы летят к ближайшему серверу, задержки минимальны. Только придётся продумать, что делать с путешествующими пользователями.
Партиционирование по хешу равномерно распределяет данные между частями. Это полезно, когда нет явного признака для разделения, но нужно распределить нагрузку. База считает хеш от выбранных полей и решает, куда положить строку. Минус один — сложно понять, в какой партиции искать конкретную запись.
Из реальной практики: один проект страдал от медленных запросов к логам. Таблица разрослась до нескольких терабайт, индексы не помогали. Разбили данные по дням — и запросы ускорились в десятки раз. Зато другой проект потратил месяц на внедрение партиционирования, а в итоге только усложнил поддержку базы. Потому что не учли: если 90% запросов читают данные из всех партиций, разделение только навредит.
Партиционирование — мощный инструмент, но не серебряная пуля. Оно нужно, когда у вас реально много данных, чётко выделяется признак для разделения, и большинство запросов работают с подмножеством данных. В остальных случаях хорошо настроенных индексов будет достаточно.
🏴☠️ @happy_devops
- 🔥 3
- 👍 2







