Миграция виртуального сервера Linux: перемещение данных

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

В любом случае при переходе с одной системы в другую нужно учесть множество различных нюансов. Полностью восстановить функции и конфигурации может быть трудно, если вы не используете средства для управления конфигурацией (Chef, Puppet или Ansible). Кроме того, нужно не только переместить данные, но и настроить сервисы для работы на новой машине.

В предыдущем руководстве вы подготовили серверы к перемещению данных и собрали список необходимого ПО и сервисов. Теперь целевой и исходный сервер могут взаимодействовать с помощью SSH-ключей.

В данном руководстве вы узнаете, как переместить данные на новый сервер.

Общая стратегия

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

Некоторые направляют для этого rsync на root исходной машины, а затем исключают некоторые файлы, которые могут вызвать конфликт. Мы не будем следовать этой стратегии. Миграция больших фрагментов системных данных в рабочую операционную систему может привести к непредсказуемым результатам.

Кроме того, не стоит сразу перегружать новую систему лишними файлами. Описанный далее метод потребует больших усилий, но в результате вы получите более удобную и дружественную конфигурацию.

Мы не будем мигрировать все доступные файлы, которые не вызовут конфликта, поскольку среди них могут оказаться файлы, которые больше не используются. Вместо этого мы продумаем все необходимые данные и переместим только требуемые файлы.

Создание скрипта для миграции

Выбранные файлы нужно добавить в скрипт.

Такой подход имеет ряд преимуществ. Вы сможете при необходимости повторно запустить команды, если у вас возникнут проблемы. Кроме того, скрипт самостоятельно документирует команды, которые вы использовали для передачи данных. Также это позволит исходному серверу перейти к следующему элементу передачи данных без взаимодействия с пользователем.

Вы сможете запустить скрипт несколько раз для проверки. Большинство файлов будут переданы через rsync, эта утилита передает только файлы. Объемные фрагменты данных можно закомментировать на время тестирования.

Это руководство поможет вам составить такой скрипт.

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

nano /root/sync.sh

В начало файла поместите стандартный заголовок скрипта. Вместо sh можно указать bash, если вы хотите использовать расширенные функции.

#!/bin/sh

По мере того, как вы будете отбирать необходимые файлы, скрипт будет расширяться. Пока что закройте файл, чтобы сделать его исполняемым. Вернитесь в командную строку и введите:

chmod 700 /root/sync.sh

Чтобы вызывать сценарий, укажите его абсолютный путь.

/root/sync.sh

Или относительный путь:

cd /root
./sync.sh

Во время работы над скриптом нужно регулярно проверять его.

Установка дополнительных программ и сервисов

Установите пакеты, которые помогут автоматизировать ряд задач. Их тоже можно добавить в скрипт, но лучше установить их вручную.

У вас должен быть список требуемых пакетов и версий, собранный на исходной машине.

Добавление репозиториев (опционально)

Прежде чем загрузить эти версии с помощью менеджера пакетов, нужно узнать, добавлены ли в исходную систему какие-либо дополнительные репозитории.

На машинах Ubuntu/Debian вы можете проверить репозитории здесь:

nano /etc/apt/sources.list

Это главный список источников пакетов. Дополнительные списки могут храниться в каталоге sources.list.d:

ls /etc/apt/sources.list.d

Если хотите, добавьте эти репозитории на целевую машину.

В дистрибутивах RHEL список репозиториев можно запросить так:

yum repolist enabled

Чтобы добавить эти репозитории на целевую машину, введите:

yum-config-manager --add-repo repo_url

Внеся изменения в список источников, добавьте их в начало сценария и закомментируйте. Таким образом вы будете знать, что вам нужны эти репозитории, если в дальнейшем решите применить этот скрипт на чистой установке.

nano /root/sync.sh
#!/bin/sh
#############
# Prep Steps
#############
# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

Сохраните и закройте файл.

Ограничение версий и установки

Теперь можно попробовать установить требуемые версии пакетов на целевую машину. Если это Ubuntu/Debian, введите:

apt-get update
apt-get install package_name=version_number

Обычно устаревшие пакеты удаляются из официальных репозиториев. В этом случае вам, возможно, придется найти старую версию файлов .deb и их зависимостей и установить их вручную:

dpkg -i package.deb

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

В дистрибутивах RHEL можно установить конкретные версии пакетов с помощью программы:

yum install package_name-version_number

Если вам нужно найти файлы, которые были удалены из репозитория, используйте следующую команду, чтобы установить их:

yum install package_name.rpm

Установите все необходимое программное обеспечение, доступное для менеджера пакетов, в новую систему.

Не забудьте указать в скрипте все свои операции. Добавьте их в скрипт и закомментируйте:

nano /root/sync.sh
#!/bin/sh
#############
# Prep Steps
#############
# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free
# Install necessary software and versions
#       apt-get update
#       apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1

Сохраните и закройте файл.

Начало миграции данных

Фактическая передача данных – самая значительная часть миграции. Если вы переносите сервер с большим количеством данных, скрипт уже сейчас может переместить какой-то фрагмент данных. позже вы сможете добавить другие команды в скрипт, а rsync передаст только различия между файлами.

Установка screen

Для удобства работы установите screen на целевую машину, чтобы машина продолжала поддерживать сессию.

Установить screen в Ubuntu и Debian поможет команда:

apt-get update
apt-get install screen

Читайте также: Установка и использование Screen на облачном сервере Ubuntu

Чтобы запустить сессию screen на целевом сервере, введите:

screen

После запуска сессии вы вернетесь в командную строку. Скорее всего, вы не заметите никаких изменений, но теперь терминал помещен в сессию screen. Это позволяет легко переключаться между несколькими сеансами терминала и восстанавливать сессию, если вам нужно покинуть локальный терминал или отключиться.

Здесь вы можете выполнять команды и отключаться от терминала, при этом команды будут продолжать работу. Чтобы отключиться от терминала, введите:

CTRL-a d

Чтобы восстановить терминал, введите:

screen -r

Чтобы создать новое окно терминала в сессии screen:

CTRL-a c

Чтобы переключиться между окнами, используйте:

CTRL-a n
CTRL-a p

Удалить окно:

CTRL-a k

Перемещение файлов

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

Общий синтаксис команды:

rsync -avz --progress source_server:/path/to/directory/to/transfer /path/to/local/directory

Запустив сессию rsync, создайте новое окно screen и перейдите в него:

CTRL-a c

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

CTRL-a p

Расширение скрипта для синхронизации данных и файлов

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

Пока что о файлах БД речи не идет, так как существуют лучшие методы для перемещения этих данных на другой сервер.

#!/bin/sh
#############
# Prep Steps
#############
# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free
# Install necessary software and versions
#       apt-get update
#       apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1
#############
# File Transfer
#############
# Rsync web root
rsync -avz --progress 111.222.333.444:/var/www/site1 /var/www/
# Rsync the apache configuration files
rsync -avz --progress 111.222.333.444:/etc/apache2/* /etc/apache2/
# Rsync php configuration
rsync -avz --progress 111.222.333.444:/etc/php5/* /etc/php5/
# Rsync mysql config files
rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/
# Rsync home directories
. . .

Добавьте все команды rsync, необходимые для перемещения ваших данных и конфигураций исходной системы.

Скрипт не должен быть идеальным, поскольку на данном этапе вы можете в любой момент исправить его.

Скрипт будет запускаться несколько раз, это позволит вам исправить все ошибки и изъяны, а также добавить другие важные файлы.

Конфигурационные файлы

Многие программы будут работать должным образом даже после перемещения, но некоторые все же нуждаются в отладке.

Это является небольшой проблемой для скрипта синхронизации. Если вы запустите скрипт для синхронизации данных, а затем измените конфигурации программ, эти изменения будут утеряны при следующем запуске сценария.

Помните, что нужно запускать скрипт rsync несколько раз, чтобы внести все изменения, произошедшие в исходной системе. Исходная система может значительно измениться в процессе миграции и тестирования нового сервера.

Есть два общих варианта, которые позволят сохранить изменения конфигураций. Начнем с более простого.

Вариант 1

Вариант 1 быстрый, но не самый безопасный.

При этом вы должны изменить перемещенные файлы на целевой машине, а затем исключить их из скрипта.

После этого rsync не будет синхронизировать эти файлы.

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

# rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/
rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/

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

# Adding exclude rule.  Changed socket to '/mysqld/mysqld.sock'
# rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/
rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/

Вариант 2 (рекомендуемый)

Системы Linux включают в себя множество текстовых манипуляторов, которые очень полезны для написания скриптов. Фактически большинство этих программ создаются специально для работы в среде сценариев. Самые популярные из них – sed и awk.

Читайте также:

Основная идея заключается в том, что в скрипт можно добавить любые изменения, которые вы делали бы вручную, и скрипт сам выполнит все указанное.

В предыдущем примере вместо того чтобы исключать измененные файлы, вы можете прописать в самом скрипте все изменения, которые нужно внести в конфигурации. Вот как это делается с помощью sed:

rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/
# Change socket to '/mysqld/mysqld.sock'
sed -i 's_/var/run/mysqld/mysqld.sock_/mysqld/mysqld.sock_g' /etc/mysql/my.cnf

Эта команда будет менять сокет в каждом экземпляре файла после каждой передачи данных.

Убедитесь, что команды для изменения файлов идут после строк, которые синхронизируют файлы.

Аналогичным образом можно легко скопировать изменения, внесенные в файлы табличных данных, используя awk. Например, awk может удалить хэшированный пароль root из второго столбца файла /etc/shadow:

awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow && rm shadow.tmp

Эта команда сообщает awk, что и исходный, и выходной разделитель должны быть двоеточием, а не пробелом. Затем нужно указать, что если столбец 1 равен «root», то столбец 2 должен содержать пустую строку.

До появления новых версий awk не было возможности редактировать данные сразу, поэтому этот файл записывается во временный файл, затем исходный файл перезаписывается, а временный удаляется.

Постарайтесь записать в скрипт все необходимые изменения. В дальнейшем вы сможете использовать этот скрипт повторно.

Добавьте в скрипт команды, которые будут выполнять все необходимые операции.

Дамп и перемещение файлов БД

Если вы используете СУБД, вам нужно создать дамп БД доступными в вашей системе методами. Методы отличаются в зависимости от СУБД (MySQL, MariaDB, PostgreSQL и т.п.).

В MySQL для экспорта БД есть команда:

mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db

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

Читайте также: Импорт и экспорт баз данных MySQL и MariaDB

Рассмотрим некоторые опции дампа:

  • -Q: опция включена по умолчанию. Она помещает идентификаторы (имена базы данных) в кавычки, чтобы избежать неправильной интерпретации.
  • -q: помогает ускорить дамп больших таблиц. MySQL будет обрабатывать таблицу построчно, а не пытаться обработать ее целиком.
  • -e: создает меньшие файлы дампа, группируя вставки, вместо того, чтобы обрабатывать их отдельно при загрузке файла дампа.
  • —add-drop-table: запускает команду DROP TABLE перед каждой командой CREATE TABLE, чтобы избежать ошибки в случае, если таблица уже существует.
  • -A: сбрасывает все базы данных.
  • -u: указывает пользователя MySQL, который будет использоваться для подключения. Это должен быть root.
  • -p: пароль учетной записи root.

Теперь у вас есть дамп данных MySQL исходной системы. Выполните эту команду SSH:

ssh root@111.222.333.444 'mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db'

Теперь используйте обычную команду rsync, чтобы извлечь этот файл:

rsync -avz --progress 111.222.333.444:/root/database_name.db /root/

Теперь можно импортировать дамп в целевую систему:

mysql -u root -proot_password < /root/database_name.db

Читайте также: Репликация баз данных MySQL по типу Master-Master

Не забудьте добавить все необходимые компоненты в скрипт.

Дальнейшие действия

Теперь данные перемещены в целевую систему. После этого нужно настроить целевую машину и подогнать ее под состояние исходного сервера.

Об этом – в следующем руководстве.

Tags: