Главная > Бездна > Копирование больших файлов между серверами

Копирование больших файлов между серверами

06.01.2020 1 коммент. » Просмотры: 26

Копирование файлов по сети

Иногда бывает необходимость что-то сделать с большим файлом, при этом действия эти желательно делать на другом сервере. Например, по какой-то причине посыпалась большая таблица базы MyISAM, таблицу эту изолировали, сервис перезапустили, все работает. Запускать восстановление такой таблицы на основном сервере не охота, тк это отнимет его ресурсы. Выход тут такой..

Копируем базу на другой сервер в том же датацентре и запускаем восстановление на нем. Это особенно удобно, если у хостера есть клауд и можно взять почасово большой сервер в аренду за копейки. Процесс в целом не сложный, берем файлы копируем, на другой сервер, делаем там с ними что надо и возвращаем назад. Выглядит просто, пока вы не столкнетесь с копированием файла в 1.5TB (1500 Гб).

Midnight Commander

Прежде всего, хочу предостеречь от копирования через всеми любимый Midnight Commander. Что может быть проще открыл соединение по SSH, во второй панельке нажал F5 и начал ждать. Не делайте так: во-первых MC перед передачей копирует файл локально, т.е. для копирования 1,5 TB он скопирует его сперва во временный файл на той же машине, а только затем начнет передачу. Во вторых, передача будет работать медленно. В общем, про MC лучше забыть.

Мультиплексер Screen

Далее рассмотрим вариант, когда копирование у вас займет 6-8 часов. Например, вы запустили копирование и видите что скорость у вас в районе 10-20 MB/s, а время до окончания больше часа. Не тормозите, прерывайте копирование, тк за этот час у вас может произойти обрыв терминальной сессии с вашим исходным сервером и копирование прервется. Для того, чтобы этого избежать используйте утилиту-мультиплексер screen. На сервере выполняете:

далее, опять так на сервере, запускаете еще одну сессию, командой

и уже внутри нее, запускаете копирование. После того, как копирование начнется, вы сможете нажать сочетание клавиш: Ctrl+Alt+D,  и отключиться от этой терминальной сессии. Процесс копирования продолжится в фоне. Далее вы можете вообще отключиться от сервера. А, например через 30-40 минут, войти обратно на сервер и выполнить

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

Как поделить файл на более мелкие

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

  • 100G = разбить на файлы по 100Гб
  • data.MYI = наш огромный файл
  • на выходе получатся файлы в формате xaa xab xac..

Далее копируем их по отдельности и склеиваем в нужном месте командой

Как сделать тоже самое в Windows я писал тут: Linux разбить файл на несколько частей, а потом склеить в Linux или Windows

Копирование по SSH

Самый простой вариант, это скопировать файлы по SSH используя scp.

  • /var/lib/mysql/mydb/data.MYI = файл который надо копировать
  • -P 22 = порт, тут просто для примера, 22 будет использоваться по-умолчанию, если опция не указана
  • root@server.ip:/var/lib/mysql/mydb/data.MYI = сервер куда надо скопировать и путь на нем
  • в зависимости от файла так же можно добавить опцию -C которая указывает что нужно сделать компрессию при передаче

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

Копирование через Rsync по SSH

Исправить предыдущий недочет можно с помощью утилиты rsync, вот так

или если нужно скопировать все из директории в директорию на другом сервере

  • Опции SSH (при указании опций ssh и опции нужно заключить в кавычки)
    • /var/lib/mysql/mydb/data.MYI = файл который надо копировать
    • -p 22 = порт, тут просто для примера, 22 будет использоваться по-умолчанию, если опция не указана
    • root@server.ip:/var/lib/mysql/mydb/data.MYI = сервер куда надо скопировать и путь на нем
  • Опции Rsync
    • -P = показывать прогресс во время копирования
    • -v = вывод детальной информации (можно так же использовать -vv для еще большей детализации)
    • -e "ssh <опции>" = использовать ssh как удаленный шел
    • Так же можно использовать
      • -a = режим архивации, не будет передавать владельца, группу, время, пропустит символические ссылки и устройства
      • -r = рекурсивное копирование
      • -z = компрессия во время передачи, может быть полезна в зависимости от типа файла
      • --exclude 'foldername' = пропустить указанную папку/файл

Согласно информации из этой статьи: http://linuxaria.com/article/tar-rsync-netcat-scp , cпособ "rsync+ssh" превосходит "scp" по скорости примерно в два раза.

Именно с помощью этой утилиты и нужно копировать файлы.

Итоги

Текста довольно много, но суть тут такая:

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

На этом все.

Post Scriptum

Если же у вас много денег, то переходите лучше сразу на сторону AWS, там копирование Volume-ов делается в пару кликов внутри панели управления. Быстро. Удобно. Очень дорого.

Похожие статьи

Автор: | Рейтинг: 4/5 | Теги: , , ,

Есть 1 комментарий.

Написать свой

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Разрешены HTML-теги: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>


Ниже приводятся ссылки на блоги ссылающиеся на этот пост:
  1. Pingback от Ремонт MySQL таблиц с помощью myisamchk 06.01.2020