Как стать автором
Обновить

Масштабирование MySQL в реальном времени

Время на прочтение2 мин
Количество просмотров1.5K
imageНа написание этого поста меня натолкнул топик glix. Итак вкратце:
Amazon теперь предоставляет сервис отказоустойчивой масштабируемой базы данных, т.е. наш MySQL теперь в облаке. Более подробно можно прочитать в самой статье, так что пересказывать её не буду.

Единственный минус подобного решения — цена. Не скажу, что услуги Amazon заоблачно :) дороги, но при работе сервера 24 часа в сутки, это может влететь в копеечку. Сидя на DevConf'е у меня родилась идея, как этого можно избежать.


Решение

Есть два сервера БД, первый — назовем его «default» — это наш сервер, к которому обращаются frontend'ы, второй «cloud» — тот самый облачный MySQL-сервер. Задача: при повышении нагрузки на основной сервер БД, включать облачный, синхронизировать его с основным и потом перенаправлять SQL-запросы на него.

Система будет работать в 4х режимах.

Default

Режим использования основного БД-сервера. При превышении нагузки больше порогового значения(max) определенный промежуток времени(max-timeout), задаваемого в параметрах, система переходит в состояние SyncCloud

SyncCloud

Режим синхронизации с cloud-сервером.
  1. Включаем облачный сервер БД, через запрос к API Amazon RDS.
  2. Ждем загрузки сервера
  3. Подключаем его как slave к основному серверу.
  4. Проводим рекпликацию на slave.
  5. Блокируем запросы на запись к мастеру.
  6. Проводим репликацию еще раз. Это необходимо сделать, чтобы не блокировать мастера сразу, для того, чтобы не было большого времени блокировки базы.
  7. Отключаем cloud-сервар от мастера. Выключаем mysqld на основном сервере.
  8. Включаем mysl-proxy на default-сервере, который будет пробрасывать все запросы на cloud-сервер.

Cloud

Режим работы с cloud-сервером.
В этом режиме default-сервер делает проксирование запросов к cloud-серверу. На основном сервере в это время снижается нагрузка, и после того, как она составит значение ниже порогового(min) определенный промежуток времени(min-timeout) система переходит в состояние SyncDefault

SyncDefault

Режим синхронизации с default-сервером.
  1. Запускаем mysqld на свободном порту(не 3306, т.к. там у нас сидит сейчас mysql-proxy).
  2. Подключаем default-сервер, как slave к cloud-серверу.
  3. Проводим репликацию на default-сервер
  4. Блокируем запись на cloud-сервер
  5. Проводим повторную репликацию
  6. Выключаем mysql-proxy
  7. Перевешиваем mysqld-сервер на default на стандартный порт(3306), который освободил mysql-proxy.
  8. Отправляем запрос на выключение cloud-сервера через API Amazon RDS

Итоги

В результате получаем масштабируемость за счет облачного сервера и экономию, за счет использование его только в нужные моменты.
Очень интересует мнение хабровчан насчет жизнеспособности такой схемы. Вообще видятся огромные перспекивы в этой области, особенно если удасться запустить MySQL на кластере на базе Ubuntu Enterprise Cloud(Eucalyptus)

Ссылки
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 12: ↑11 и ↓1+10
Комментарии21

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн