Копирование больших файлов между серверамию: rsync, scp, mc
Иногда бывает необходимость что-то сделать с большим файлом, при этом действия эти желательно делать на другом сервере. Например, по какой-то причине посыпалась большая таблица базы MyISAM, таблицу эту изолировали, сервис перезапустили, все работает. Запускать восстановление такой таблицы на основном сервере не охота, тк это отнимет его ресурсы. Выход тут такой..
Копируем базу на другой сервер в том же датацентре и запускаем восстановление на нем. Это особенно удобно, если у хостера есть клауд и можно взять почасово большой сервер в аренду за копейки. Процесс в целом не сложный, берем файлы копируем, на другой сервер, делаем там с ними что надо и возвращаем назад. Выглядит просто, пока вы не столкнетесь с копированием файла в 1.5TB (1500 Гб).
Midnight Commander
Прежде всего, хочу предостеречь от копирования через всеми любимый Midnight Commander. Что может быть проще открыл соединение по SSH, во второй панельке нажал F5 и начал ждать. Не делайте так: во-первых MC перед передачей копирует файл локально, т.е. для копирования 1,5 TB он скопирует его сперва во временный файл на той же машине, а только затем начнет передачу. Во вторых, передача будет работать медленно. В общем, про MC лучше забыть.
Мультиплексер Screen
Далее рассмотрим вариант, когда копирование у вас займет 6-8 часов. Например, вы запустили копирование и видите что скорость у вас в районе 10-20 MB/s, а время до окончания больше часа. Не тормозите, прерывайте копирование, тк за этот час у вас может произойти обрыв терминальной сессии с вашим исходным сервером и копирование прервется. Для того, чтобы этого избежать используйте утилиту-мультиплексер screen. На сервере выполняете:
1 2 3 |
apt-get install screen |
далее, опять так на сервере, запускаете еще одну сессию, командой
1 2 3 |
screen -a |
и уже внутри нее, запускаете копирование. После того, как копирование начнется, вы сможете нажать сочетание клавиш: Ctrl+Alt+D, и отключиться от этой терминальной сессии. Процесс копирования продолжится в фоне. Далее вы можете вообще отключиться от сервера. А, например через 30-40 минут, войти обратно на сервер и выполнить
1 2 3 |
screen -r |
для подключения обратно к сессии где идет копирование. Больше информации и параметров этой утилиты вы всегда можете глянуть в гугле или в man.
Как поделить файл на более мелкие
В зависимости от ситуации, может понадобиться разделить файл на части, для этого используем утилиту split. Делается это так
1 2 3 |
split -b 100G data.MYI |
- 100G = разбить на файлы по 100Гб
- data.MYI = наш огромный файл
- на выходе получатся файлы в формате xaa xab xac..
Далее копируем их по отдельности и склеиваем в нужном месте командой
1 2 3 |
cat xaa xab xac > data.MYI |
Как сделать тоже самое в Windows я писал тут: Linux разбить файл на несколько частей, а потом склеить в Linux или Windows
Копирование по SSH
Самый простой вариант, это скопировать файлы по SSH используя scp.
1 2 3 |
scp -P 22 /var/lib/mysql/mydb/data.MYI root@server.ip:/var/lib/mysql/mydb/data.MYI |
- /var/lib/mysql/mydb/data.MYI = файл который надо копировать
- -P 22 = порт, тут просто для примера, 22 будет использоваться по-умолчанию, если опция не указана
- root@server.ip:/var/lib/mysql/mydb/data.MYI = сервер куда надо скопировать и путь на нем
- в зависимости от файла так же можно добавить опцию -C которая указывает что нужно сделать компрессию при передаче
Основная проблема в этом случае, что если соединение будет прервано, то при повторном запуске копирование пойдет заново.
Копирование через Rsync по SSH
Исправить предыдущий недочет можно с помощью утилиты rsync, вот так
1 2 3 |
rsync -Pv -e'ssh -p 22' --progress /var/lib/mysql/mydb/data.MYI root@server.ip:/var/lib/mysql/mydb/data.MYI |
или если нужно скопировать все из директории в директорию на другом сервере
1 2 3 |
rsync -Pvr -e'ssh -p 22' --progress /var/lib/mysql/mydb/* root@server.ip:/var/lib/mysql/mydb |
- Опции SSH (при указании опций ssh и опции нужно заключить в кавычки)
- /var/lib/mysql/mydb/data.MYI = файл который надо копировать
- -p 22 = порт, тут просто для примера, 22 будет использоваться по-умолчанию, если опция не указана
- root@server.ip:/var/lib/mysql/mydb/data.MYI = сервер куда надо скопировать и путь на нем
- Так же можно использовать
- -i = путь к ключу, например ~/.ssh/id_rsa
- Опции Rsync
- -P = показывать прогресс во время копирования + продолжать докачку. Тоже самое, что использование двух опций:
- --partial = докачивать файлы скачанные частично, вместо того чтобы удалить недокачанный файл и начать загрузку по новой
- --progress = показывать прогресс копирования
- -v = вывод детальной информации (можно так же использовать -vv для еще большей детализации)
- -e "ssh <опции>" = использовать ssh как удаленный шел
- Так же можно использовать
- -a = режим архивации, не будет передавать владельца, группу, время, пропустит символические ссылки и устройства
- -r = рекурсивное копирование
- -z = компрессия во время передачи, может быть полезна в зависимости от типа файла
- --compress-level=1 = сжимать файлы с уровнем копресии от 1 до 9, где 9 - наибольшее сжатие.
- --exclude 'foldername' = пропустить указанную папку/файл
- --owner --group --chown=www-data:www-data = изменить пользователя и группу (нужно указывать все три флага)
- --perms -chmod=Du=rwx,Dgo=rx,Fu=rw,Fog=r = изменить модификаторы доступа (нужно указывать два флага)
- -P = показывать прогресс во время копирования + продолжать докачку. Тоже самое, что использование двух опций:
Более сложный пример, копирования к себе с удаленного сервера, с измененным портом и авторизации по ключу. После копирования папкам будет установлен пользователь www-data и группа www-data; папкам назначены права 0755, а файлам 0644.
1 2 3 4 5 6 7 8 9 10 11 12 |
rsync \ --owner --group \ --chown=www-data:www-data \ --perms \ --chmod=Du=rwx,Dgo=rx,Fu=rw,Fog=r \ --compress-level=1 \ --progress \ -vr \ -e'ssh -p 2222 -i /root/.ssh/d2hz' \ root@server.ip:/home/store/shared_storage/test ./ |
Согласно информации из этой статьи: http://linuxaria.com/article/tar-rsync-netcat-scp , cпособ "rsync+ssh" превосходит "scp" по скорости примерно в два раза.
Именно с помощью этой утилиты и нужно копировать файлы.
Итоги
Текста довольно много, но суть тут такая:
- Используем утилиту screen, чтобы можно было отключиться от сервера и вернуться к терминальной сессии через время.
- Используем rsync, т.к. в случае обрыва, он начнет не с начала, а с того места где произошел обрыв
На этом все.
Post Scriptum
Если же у вас много денег, то переходите лучше сразу на сторону AWS, там копирование Volume-ов делается в пару кликов внутри панели управления. Быстро. Удобно. Очень дорого.
Author: | Tags: /
| Rating:
1 comment.
Write a comment