Как правильно построить взаимодействие между php на одном сервере и mysql на другом?

Здравствуйте.
Стоит задача быстро и в большом объеме выбирать данные из БД на удаленном сервере.
Запросы очень тяжелые, с большим количеством условий.
Если подключаться к удаленной базе и выбирать данные напрямую, то происходит ситуация, когда коннекты висят по несколько минут, забивая все доступные подключения и пропускная способность получается очень низкой.

Для увеличения пропускной способности я сделал "карту данных" - кроном, раз в несколько минут на удаленном сервере выбираются все id соответвующие глобальным условиям и пишутся в файл.
На целевом сервере из этой карты выбирается несколько id и происходит обращение удаленной БД, но уже с упрощенным запросом, по первичному ключу id и локальными условиями для конкретного подключения. В такой ситуации, из за первичного ключа и локальных условий, часто нет подходящих данных и необходимо делать запросы рекурсией в несколько итераций.
Выбор данных происходит несколько дольше, но это так сильно не забивает подключения.

Несмотря на эти меры, и первичный ключ в запросе, часто происходит ситуация, когда удаленные коннекты просто висят по несколько минут со статусом Sleep и, как и в первом случае, забивают все доступные подключения (хотя все лучше, чем в первом варианте). Это при том, что подключение к удаленной БД происходит прямо перед запросом, а закрытие подключения сразу после. Непонятно почему подключения не закрываются. Есть ощущение что удаленные запросы выполняются медленнее сами по себе, т.к. если делать все тоже самое на том сервере, на котором хранится БД, такой проблемы нет.

Возможно в mysql есть специальные настройки, для оптимизации удаленных подключений?
Как лучше/правильнее организовать данную логику, для увеличения скорости и пропускной способности?

Сервер БД: Percona 5.5
  • Вопрос задан
  • 537 просмотров
Пригласить эксперта
Ответы на вопрос 5
настройте репликацию данных и используйте локальное хранилище
Ответ написан
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Интересная проблема.

В общем случае время выполнения запроса никак не зависит от того локальный он или удаленный.
Могут быть микро потери времени на передачу самого запроса (если он реально длинный) и заметные потери времени на передачу ответа (опять же если он огромный).

По пунктам того что Вы пишите:

Если подключаться к удаленной базе и выбирать данные напрямую, то происходит ситуация, когда коннекты висят по несколько минут, забивая все доступные подключения и пропускная способность получается очень низкой.

Запросы реально исполняются несколько минут? Какой объем данных передается в ответе? Какой канал между серверами, не забивается ли он? Потребление памяти/процессора на SQL сервере в момент выполнения запроса?

Есть тупая идея увеличить max_connections, но я сомневаюсь что в Вашем случае это поможет, скорее всего проблема не в этом.

Это при том, что подключение к удаленной БД происходит прямо перед запросом, а закрытие подключения сразу после.

Можно так же попробовать использовать persistent connection, не будет оверхеда на постоянные подключения/отключения.

Возможно надо посмотреть в сторону оптимизации самих запросов, дробления их на части итд.
Ответ написан
myfirepukan
@myfirepukan
Жарим поиск
Как лучше/правильнее организовать данную логику, для увеличения скорости и пропускной способности?

Поставить 2 сервера в одном дата-центре в одну стойку.
P.S. Я пробовал на удалённых серверах такое делать, скорость запредельно низкая
Ответ написан
@theded
тут похоже проблема в запросах, а не в канале между клиентом и сервером((

а скорее всего проблема в том, что пыха падает по тайму или памяти, не успев обработать результат запроса и закрыть коннекшн
Ответ написан
opium
@opium
Просто люблю качественно работать
Ну увеличьте в сто раз количество коннектов и не парьтесь, выдумали какую то надуманную проблему.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы