Как добиться отзывчивого фронтенда при плотной работе с базой?
Есть приложение на Ruby On Rails, заведенное на mysql базе в Amazon RDS. На инстансах в режиме нон-стоп крутятся десятки воркеров, собирая информацию из внешних источников и записывая ее в базу. В то же время есть фронтенд, в котором пользователи могут просматривать собранную информацию и производить над ней различные манипуляции, на 99% read-only.
Случается так, что эти самые воркеры довольно сильно загружают базу, что выливается в довольно медленную работу фронтенда.
Абсолютная актуальность информации для пользователя не важна, возможны задержки вплоть до нескольких часов (зависит от данных).
Возникла идея создать некоторое разделение, или прослойку, между этими частями приложения, возможно что-то вроде буфера, который ценой актуальности информации для юзера предоставит ему хорошую скорость выполняния запросов.
Подскажите, насколько разумно такое решение, осуществимо ли? Пригодились бы какие-то конкретные советы, ссылки, паттерны. К сожалению, я совершенно не юмею опыта в этом деле, поэтому сложно с чего-то начать, найти правильный путь.
Если сильно грузят базу и отражается на фронте, я бы поработал:
1. Индексы, например убрал их, для MySQL Innodb очень повышает вставку тогда и работу. Раз задержки не важны, по так же по воркеру собирал бы уже в базу для фронта эти данные (возможно даже не mysql, например redis) но в новой базе уже индексы.
2. Посмотрел бы в сторону репликации и разделение базы на Master куда можно писать и Slave с которого бы лениво читали.
Нужно разбираться что значит «сильно загружают базу» — это могут быть локи, обработка данных (read + write) или большой объём на запись. У RDS есть Read Replica (http://aws.amazon.com/rds/mysql/#Read_Replica) — возможно поможет
RDS сейчас в начале развития — возможностей предоставляет не много (не доступа к бинарным логам).
Самое простое, что можно попробовать, сделайте 2 базы данных и настройте репликацию master->slave, из слейва читать, в мастер писать.
Даже в пределах одного сервера это может дать неплохой прирост (правда в результате нагрузка на сам сервер немного повысится), дальше можно крутить индексы, так же можно делать разные индексы на разных серверах master/slave. Главное постараться разделить физически хранилища для этих баз.
Можно периодически приостанавливать репликацию, увеличивая интервал между актуальными данные в мастере и анализируемыми данными в слейве.
Можно поднять слейв на ненадежном хранилище (tmpfs или включить принудительное кеширование записи, например в опциях монтирования ext3/ext4 — data=writeback), это увеличит скорость копирования данных в слейв.