Если Вашей установке окон включили Теневые копии для рассматриваемого объема, можно найти более ранние снимки файла путем взятия свойств на нем и удара Предыдущей вкладки версий (или теневая копия). Они обычно берутся на определенных временах, хотя, как каждое 4-часовое или один раз в день - таким образом, не могло бы помочь, включено ли это.
Круговой DNS не собирается решать Вашу проблему - это - отличный способ обеспечить выравнивание нагрузки веб-серверов - но обработка отказа происходит, когда клиент пытается соединиться с портом и не получает ответа (это затем продолжает пробовать следующую запись DNS за хост). Очевидно, если база данных MySQL перестанет работать, то это не окажет прямого влияния на веб-сервер (т.е. веб-сервер ответит на запросы TCP).
Хотя было бы возможно в принципе заставить код PHP обнаруживать отказ базы данных и завершать работу веб-сервера или входящих соединений блока - это - довольно опасный подход - даже если Ваш хостинг позволил бы, чтобы это произошло.
Единственным практическим путем я могу думать для контакта с этим сценарием, должен перенаправить к определенному имени хоста в случае обнаружения отказов, поэтому если Вы в настоящее время будили оба набора хостов, поскольку www.example.com затем добавляет записи для www1.example.com и www2.example.com, затем включает автопредварительно ожидание, включают файл, чтобы сделать что-то как:
(on www1.example.com)
check_db();
// if check_db returns, then continue with normal processing...
function check_db() {
if (request is for www.example.com) { // avoid loops when both sites fail
if (last check more than 10 secs ago) {
if (database status bad) {
raise a database failed flag on the filesystem
redirect to www2.example.com
end
}
} else {
if (database failed flag set) {
redirect to www2.example.com
end
}
return OK
}
} else { // request is for www1.example.com i.e. we are already in failover mode
if (database failed flag set) && (last check more than 5 secs ago) {
if (database status good) {
remove database failed flag
return OK
} else { // oh no! both hosts down!
print sorry message and exit
}
} else if (last check more than 5 secs ago) {
if (database status bad) {
raise a database failed flag on the filesystem
print sorry message and exit
}
}
}
return OK
}
Однако Вам все еще нужен некоторый способ протестировать, если база данных работает, не используя блокирующийся вызов.
HTH
C.
Вы просите, заменяют, не выравнивание нагрузки, мне кажется.
Замените является чрезвычайно трудным преуспеть, особенно с оборудованием, которое не является в той же инфраструктуре. Лучший случай должен был бы получить избыточную географическую подсистему балансировки нагрузки в Вашем ISP, который тестирует Ваши сайты и обрабатывает обработку отказа беспрепятственно. Так как мое предположение, это вне Вашего бюджета, давайте пойдем для метода жевательной резинки и палок.
Так как Вашей проблемой, по-видимому, является MySQL, не веб-сервер, затем давайте решим проблему под рукой.
Данный:
Метод, который я использовал бы, будет:
Сохраните свои учетные данные соединения с базой данных на диске где-нибудь (очевидно, не в веб-корне) и загрузите их после каждого соединения страницы. Можно отредактировать sites/default/settings.php как так:
$db_url = file_get_contents ('/some/private/dir/drupal-db.url');
Запишите второстепенному демону, который соединяется с базой данных каждые 5 секунд (или так) и регистрирует отказы машиночитаемым способом на диске. После сбоев соединения после 30 секунд (или так), затем "подкачайте" учетные данные, снабженные на диске теми из сервера резервного копирования. Это заставит Ваш веб-сервер служить содержанию от альтернативного сервера базы данных. Если это возвращается, инвертируйте процесс. Вход важен в этом случае для отладки и т.д.
Если Вы хотите стать необычными, можно попытаться зарегистрироваться, все ВСТАВЛЯЮТ и ОБНОВЛЯЮТ к диску на веб-сервере, таким образом, можно потенциально повторно синхронизировать базы данных после обработки отказа. Если это главным образом "только для чтения" затем, это не может быть необходимо.
Основная точка здесь должна разъединиться, заменяют от операции веб-приложения. Это является более модульным, и упрощает изменения в веб-приложении.
Наконец, удостоверьтесь, что можно соединиться с резервной базой данных от основного сервера. Можно сделать это на командной строке, и использующий команды предоставления:
На хосте B:
mysql> GRANT ALL PRIVILEGES ON drupaldb.* TO username@'12.34.56.78' IDENTIFIED BY 'mypassword';
Где IP имеет Хост A.
И не забывайте сбрасывать!
mysql> FLUSH PRIVILEGES:
Затем тест:
bash> mysql -u username -pmypassword -h hostb drupaldb
Никакой путь, нет никакой достойной технологии для того - учитывая Вашу инфраструктуру.
DNS не будет работать, если Вы не сохраните свой тайм-аут домена DNS МАЛЕНЬКИМ (диапазон секунд), который является fronws на. ЕСЛИ можно сделать это, Вы могли бы написать сценарий его правильно (сценарий на сервере 2 не может достигнуть сервера 1, таким образом изменяет записи DNS). Это в значительной степени - единственный способ сделать это.
В зависимости от того, как Ваша установка DNS, это было бы или там, ИЛИ - регистрация записи хоста с помощью чего-то как dyndns.org и заменило бы Ваш В записи с CNAME. DynDNS.org имеет хороший API, который Вы могли назвать через HTTP для изменения записи, и CNAME никогда не будет изменяться. Они также сохраняют свои домены на коротком TTL.
Это в значительной степени - все опции. Существуют другие для этого, но они требуют большого количества инфраструктуры, которую Вы не имеете в распоряжении.