Я борюсь со следующей проблемой: у меня есть два сервера MySQL, настроенные как Master-Slave, но они не находятся в одной внутренней сети, поэтому иногда происходит заметная задержка, и чтение из ведомого после записи может привести к к вопросам несоответствия.
Мне было интересно, есть ли способ заставить mysql читать с ведомого устройства и каким-то образом отступить на ведомое, если нет результатов на ведомом устройстве или каком-либо другом решении.
Не уверен, что это можно сделать, ни на уровне приложений, ни на уровне mysql.
Текущая настройка php5 с расширением mysqlnd и следуя документации (добавление slave на yaml http://symfony.com/doc/current/reference/configuration/doctrine.html) Мне удалось заставить приложение читать с раба и писать на мастере.
В конце концов, я обнаружил в PHP-документе Doctrine \ DBAL \ Connections \ MasterSlaveConnection, что можно принудительно использовать мастер в любой момент, просто вызвав:
$conn->connect('master');
Итак, мое решение заключалось в том, чтобы поставить следующую строку в начале действий контроллера, которые требуют согласованности данных:
$this->getDoctrine()->getConnection()->connect('master');
Таким образом, он всегда читает с мастера во время этого потока выполнения, в то время как остальная часть приложения продолжает балансировать операции чтения / записи. Я не уверен, что это лучшее решение, но оно сработало для моих целей.
Я надеюсь, что это помогает кому-то в подобной ситуации.
Других решений пока нет …