Планирование мощности MySQL
В моей производственной среде у меня есть один экземпляр сервера MySQL, работающий на 16 гигабайтах памяти, который обрабатывает до 20000 запросов в час. Размер одной моей таблицы растет со скоростью 2 миллиона в месяц. Оба эти числа, как ожидается, будут расти с течением времени, но я не уверен, когда мне нужно улучшить архитектуру.
Как можно быть проактивным в отношении ситуации и идти в будущее, проверяя систему?
Покупает ли обновление оборудования много времени с точки зрения времени и эффективности использования капитала?
Какова будет общая практика в этом случае, если мы удваиваем трафик каждые 3 месяца, будет ли шардинг естественным прогрессом? Или есть другие альтернативы?
Как я могу даже сказать, что моя система достигает своего пика, какие инструменты доступны для профилирования базы данных? И какие показатели я бы использовал для его измерения?
1 ответ
Очень сложно ответить на такой огромный вопрос о масштабируемости.
Во-первых, обновление оборудования на одной машине не является долгосрочным - даже не краткосрочным вариантом, поскольку вы, похоже, планируете экспоненциальный рост (x2 каждые 3 месяца большие, начиная с 2M строк в месяц). Таким образом, вы должны найти распределенную масштабируемую аппаратную архитектуру.
Затем на ум приходят два основных варианта:
Придерживайтесь SQL
Если вы будете использовать хранилище SQL для постоянно растущих таблиц, вам придется выбирать между кластеризацией и репликацией. Последний, с моей точки зрения, часто более рентабелен и быстрее, чем первый, но немного сложнее с ним справиться.
Здесь вы найдете очень интересную статью о передовых методах репликации MySQL.
После этого вы можете начать с разбиения или, что лучше, шардинга, как вы упоминали ранее.
Обратите внимание, что некоторые продукты MySQL предлагают кластеры с автоматическим разделением.
Смешайте с NoSQL
Другой вариант, очевидно, предусматривает использование технологий NoSQL в ваших таблицах монстров. Распределенные системы хранения ключ-значение практически не требуют затрат с точки зрения масштабируемости, то есть, самое большее, линейные.
Другой момент заключается в том, что значения ключа прекрасно работают с распределенными кешами, такими как хорошо известный Memcached, очень легко настраиваются с помощью API на большинстве языков, обеспечивая действительно хорошую производительность при очень низких затратах.