Перемещение базы данных MySQL на новый сервер в Ubuntu 14.04

Запуская одно приложение и базу данных (к примеру, стек LAMP) на одном виртуальном выделенном сервере, нужно иметь в виду, что рано или поздно может возникнуть необходимость обрабатывать больше трафика. Начать масштабирование окружения лучше всего с перемещения сервера баз данных на другой VPS этого же центра обработки данных.

Данное руководство поможет переместить готовую базу данных MySQL с сервера приложения на отдельный сервер. Каждое приложение имеет свои тонкости настройки и взаимодействия с базой данных; в данном руководстве процесс миграции демонстрирован на примере WordPress, но вы можете адаптировать его для любого другого приложения, использующего MySQL.

Требования

Предполагается, что у вас уже есть веб-приложение и БД, расположенные на одном сервере. В руководстве этот сервер условно называется lamp-1.

Примечание: Получить такую установку можно при помощи этого руководства.

Также для работы понадобится дополнительный виртуальный выделенный сервер Ubuntu 14.04, который будет обслуживать MySQL; в руководстве он условно называется mysql-1. Инструкции по начальной настройке сервера можно найти здесь.

Мигрирование БД на другой сервер выполняется в два этапа:

  1. Собственно перемещение БД на новый сервер.
  2. Перенастройка взаимодействия приложения и БД.

Перемещение базы данных

1: Установка и настройка сервера MySQL

Создав и подготовив к работе новый виртуальный сервер (mysql-1), подключитесь к нему и установите MySQL.

Обновите список пакетов:

sudo apt-get update

А затем установите MySQL при помощи команды:

sudo apt-get install mysql-server

Введите root-пароль MySQL (можно использовать пароль MySQL сервера lamp-1). Запустите следующую команду, чтобы создать стандартные таблицы MySQL:

sudo mysql_install_db

Чтобы завершить установку MySQL, введите:

sudo mysql_secure_installation

Программа предложит изменить root-пароль, можно ответить «no» (так как он был установлен только что). На остальные вопросы можно ответить Yes, чтобы установить настройки по умолчанию.

На данный момент БД MySQL прослушивает только локальный хост (127.0.0.1). Нужно настроить сервер БД для прослушивания внутреннего IP, чтобы сервер приложения (lamp-1) мог подключиться к нему. Откройте конфигурационный файл MySQL:

sudo vi /etc/mysql/my.cnf

Найдите в нём следующую строку:

bind-address            = 127.0.0.1

Замените 127.0.0.1 внутренним IP-адресом сервера mysql-1:

bind-address            = mysql_1_private_IP

При необходимости внесите любые другие изменения в настройки MySQL (например, можно перенести пользовательские настройки с сервера lamp-1), сохраните файл и перезапустите СУБД при помощи следующей команды:

sudo service mysql restart

Теперь сервер mysql-1 прослушивает трафик MySQL на внутреннем IP-адресе. Теперь нужно экспортировать базу данных с lamp-1.

2: Экспортирование базы данных

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

После этого нужно экспортировать резервную копию БД MySQL. Заблокируйте БД и создайте дамп данных.

Примечание: Заблокированная БД не обновляется, потому приложение может выполнять только операции чтения.

Перейдите на сервер lamp-1 и откройте консоль MySQL:

mysql -u root -p

Чтобы заблокировать БД, запустите:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

В стандартной командной оболочке запустите следующие команды, которые экспортируют резервную копию БД в файл dump.sql:

mysqldump --lock-all-tables -u root -p --all-databases > dump.sql

Скопируйте dump.sql на новый сервер mysql-1:

scp dump.sql user@mysql_1_private_IP:/tmp

Поскольку в дальнейшем MySQL на первом сервере использоваться не будет, можно оставить БД заблокированной.

Чтобы разблокировать её, запустите в консоли MySQL:

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

3: Импортирование базы данных

Теперь нужно импортировать БД на сервер mysql-1.

Перейдите на mysql-1 и запустите следующую команду, чтобы импортировать dump.sql:

mysql -u root -p < /tmp/dump.sql

На данном этапе все данные из исходной БД скопированы на новый сервер, mysql-1. Теперь нужно создать нового пользователя БД и передать ему такие же права, как и у пользователя БД на исходном сервере.

4: Создание пользователя

Пользователи MySQL определяются именем и исходным хостом. Потому нужно создать нового пользователя MySQL с необходимыми учётными данными и указать внутренний IP сервера приложений.

Откройте консоль MySQL:

mysql -u root -p

Введите следующую команду, чтобы просмотреть всех пользователей БД и хосты:

SELECT user,host FROM mysql.user;
Example Output:
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | 127.0.0.1 |
| root             | ::1       |
| debian-sys-maint | localhost |
| root             | localhost |
| wordpressuser    | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

В этом примере вывода можно увидеть пользователя wordpressuser, чей хост – localhost. Предположим, wordpressuser – это пользователь приложения. Теперь БД находится на другом сервере, потому приложение больше не будет подключено к локальному хосту. Нужно создать пользователя wordpressuser, значение host которого содержит внутренний IP-адрес сервера lamp-1 (чтобы приложение могло подключиться к БД).

Создайте нового одноименного пользователя, указав нужный IP и пароль прежнего пользователя wordpressuser.

CREATE USER 'wordpressuser'@'lamp_1_private_IP' IDENTIFIED BY 'password';

Примечание: Замените условные данные в команде своими данными.

Таким образом можно восстановить на новом сервере любое количество пользователей, заменив их хост внутренним IP-адресом сервера lamp-1. Чтобы просмотреть привилегии пользователя, запустите:

SHOW GRANTS FOR wordpressuser@localhost;

На экране появится такой вывод:

+---------------------------------------------------------------------+
| Grants for wordpressuser@localhost                                  |

+—————————————————————————————————+

|GRANT USAGE ON *.* TO ‘wordpressuser’@’localhost’ IDENTIFIED BY PASSWORD ‘somepass’  |
| GRANT ALL PRIVILEGES ON ‘wordpress’  TO ‘wordpressuser’@’localhost’                                       |

+—————————————————————————————————+
2 rows in set (0.00 sec)

Выпишите данные после GRANT USAGE ON *.*, их нужно будет немного откорректировать, чтобы передать права новому пользователю. Например, после редактирования они могут вместо локального хоста указывать IP-адрес сервера lamp-1.

Для этого нужно запустить следующую команду:

GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'lamp_1_private_IP';

А затем можно просмотреть права пользователя:

SHOW GRANTS FOR wordpressuser@lamp_1_private_IP;

Вывод будет выглядеть так

+-------------------------------------------------------------------------------------------+
| Grants for wordpressuser@lamp_1_private_ip                                                |
+-------------------------------------------------------------------------------------------+
|GRANT USAGE ON *.* TO ‘wordpressuser’@’lamp_1_private_ip’ IDENTIFIED BY PASSWORD ‘somepass’|
| GRANT ALL PRIVILEGES ON ‘wordpress’  TO ‘wordpressuser’@’lamp_1_private_ip’               |
+-------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Обновив хост соответствующего пользователя БД, обновите привилегии и закройте консоль MySQL:

FLUSH PRIVILEGES;
EXIT

Теперь, когда новый сервер базы данных перенесен и настроен, необходимо обновить настройки приложений для взаимодействия с новым сервером баз данных.

Обновление настроек приложения

Осталось только настроить приложение для работы с сервером mysql-1, на который была перемещена БД. Команды данного радела можно откорректировать в зависимости от используемого приложения. Все примеры основаны на WordPress.

Пример настройки WordPress

WordPress хранит настройки соединений БД в файле wp-config.php в каталоге установки (как правило это /var/www/html/).

Откройте конфигурацию WordPress:

sudo vi /var/www/html/wp-config.php

Найдите в файле следующие строки:

/** MySQL hostname */
define('DB_HOST', 'localhost');

Замените localhost внутренним IP-адресом сервера mysql-1. Строка должна выглядеть так:

define('DB_HOST', 'mysql_1_private_IP');

Сохраните и закройте файл. Откройте приложение в браузере. Если на экране появилась запрашиваемая страница приложения, настройка прошла успешно.

Примечание: Если вы используете другое приложение, просто обновите его настройки соединений, указав внутренний IP-адрес сервера mysql-1 вместо localhost. Некоторые приложения нужно перезапустить для обновления настроек.

Отключение MySQL на исходном сервере

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

На сервере lamp-1 запустите следующую команду, чтобы сервис MySQL больше не запускался при загрузке сервера:

sudo service mysql stop
sudo sh -c "echo 'manual' > /etc/init/mysql.override"

Заключение

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

Tags: ,

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