MySQL и виртуальный хостинг - переключение на резервную БД

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

Работает сайт на MODX, соответственно ее и буду использовать в качестве примера, хотя решение простое (и пожалуй не самое лучшее, но с виртуальным хостингом выбор не велик), может использоваться практически с любой CMS, главное наличие конфига с подключением к БД.

Для задачи минимум (пользователь должен увидеть содержимое страницы) нужна копия БД на другом сервере/хостинге с возможностью удаленного подключения (можно даже попробовать поискать среди бесплатных).

Прямо в конфиге сайта делаем проверку на подключение к БД с указанными данными, если подключится не удалось - подсовываем данные доступа к резервной копии. При желании можно так же добавить запись в лог (если посещаемость небольшая), или вывести пользователям сообщение о том что сайт в данный момент годится только для просмотра и данные могут быть не самыми свежими.

Пример для MODX Revo

Есть 2 хостинга, на одном из которых расположен проблемный сайт. Соответственно на втором размещаем копию БД.

Вносим изменения в конфиг сайта - /core/config/config.inc.php - в самом начале находим код:

$database_type = 'mysql';
$database_server = 'localhost';
$database_user = 'user';
$database_password = 'parol';
$database_connection_charset = 'utf8';
$dbase = 'baza';
$table_prefix = 'mx_';
$database_dsn = 'mysql:host=localhost;dbname=baza;charset=utf8';

Перед $database_dsn сделаем проверку подключения и если она окажется неудачной используем подключение к резервной базе, так же заменим хост и имя БД на соответствующие переменные.

$database_type = 'mysql';
$database_server = 'localhost';
$database_user = 'user';
$database_password = 'parol';
$database_connection_charset = 'utf8';
$dbase = 'baza';
$table_prefix = 'mx_';
//Пробуем подключиться
$i = 0;
while(++$i < 4){
//это даст ограничение по времени выполнения запроса, на случай если подключение успешно, но сервер перегружен
$con = mysql_connect($database_server,$database_user,$database_password);
}
if (!$con) {
//Указываем данные для подключения к резервной БД
$database_server = '1.1.1.1';
$database_user = 'alt_user';
$database_password = 'PassAltBd';
$dbase = 'alt_db';
}
$database_dsn = 'mysql:host='.$database_server.';dbname='.$dbase.';charset=utf8';

//Здесь host=localhost; заменим на host='.$database_server.';, а dbname=baza; на dbname='.$dbase.';

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

Добавить комментарий

Комментарии (0)