Во всех мне известных фреймворках (Yii, Symfony, Zend) выбор slave сервера происходит рандомно.
Возможны ситуации когда на один slave приходит много тяжелых запросов, а на другие сервера нет никакой нагрузки.
Есть идея реализовать балансировщик нагрузки, который, например, будет опрашивать slave сервера с периодичностью раз в 10 сек и сохранять нагрузку на mysql сервера в базе.
Запросы на выборку (SELECT) отправлять не рандомно, а в зависимости от загруженности серверов.
Задача должна быть довольна популярной, но я не нашел никакого расширения для фреймворков или PHP скрипт, который это делает.
Подскажите, пожалуйста, возможно все-таки есть какие-то реализации? Может кто-то писал что-то подобное и сможет подсказать алгоритм подобной реализации?
Все-таки интересует программное решение. Алгоритмы выборки в haproxy не совсем подходят. Более всего близко балансировка по количеству коннектов, но это не исключает ситуации когда на один слэйв поступит 100 медленных запросов, а на другом будет 100 быстрых. И хочется еще какой-то альтернативы.
Скорее всего это свой велосипед, но все же, может у кого-нибудь есть опыт написания подобного скрипта?
Сейчас я вижу это так: скрипт, который опрашивает каждые 30 сек слейвы и помещает данные(количество коннектов, отставание слейвов, суммарное время уже выполняющихся запросов, количество запросов) о их загруженности в memcache. Перед каждым запросом, выбирать 1 слейв из 5 наименее загруженных рандомно.
Сейчас есть уже реализация master-slave репликации, проект с высокой нагрузкой и нет возможности добавлять proxy в существующую схему.
Используется Yii2, для него необходимо сделать компонент, который на программном уровне будет выбирать slave, а не делать это рандомно, так как есть сейчас.
Я в конфиге укажу один slave, который будет являться proxy. И уже он будет разруливать запросы, так? Если этот прокси сервер выходит из строя или для него превышен лимит ожидания, то запросы начнут сыпаться к мастеру, что убьет систему в целом.
Александр Аксентьев: Вопрос в другом.
1) На одном из слейвов я настраиваю HaProxy.
2) В конфиге Yii указываю один слейв, он является слейвом с HaProxy (пункт 1).
Если падает сервер с HaProxy, то падает все, потому что в конфиге только указан slave - proxy.
Если указано несколько слейвов, то если падает один слейв, то остальные могут обслужить запросы.
Если я конечно правильно понял идею с прокси сервером.
mysql proxy как раз и создан для быстрого встраивания в работающую систему, вы просто указываете новый адрес mysql (уже mysql proxy) и все запросы будут бегать через proxy