Pull to refresh

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

Reading time2 min
Views1.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)

Ссылки
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 12: ↑11 and ↓1+10
Comments21

Articles