Как Жека приложение с сервера на сервер переносил (IT-триллер)

Всем привет!
Решил рассказать недавний опыт переноса приложения с одного сервера на другой.
Может быть кому-то пригодится, и что-то полезное в комментах напишете.
Приложение: джава-прога с веб-мордой.
Сервер 1 (старый): CentOS 7
Сервер 2 (новый): AstraLinux 1.7
Прога — всё в докере: джава, постгрес, нжинкс, файлбит.
По сути перенос — это копирование файлов между серверами.
На новом сервере монтируем докеровские папки со старого сервера, и всё работает «as expected».
Это не первый мой подобный перенос, и я придерживался такого алгоритма:
Прошлые проекты занимали в предалах 5-20 гб, а последний — 85 гб, именно большой размер превратил рутину в триллер.
Вводные
Перенос делается по Плану-графику, в который вовлечены некоторые другие участники.
Остановка проги — это остановка продакшена.
То есть всё нужно делать максимально быстро.
Количество файлов для копирования — порядка 136 тысяч, общий размер 85 гб.
Между серверами локальная сеть, скорость копирования порядка 50-100 мбит/с.
Проблема #1 — оборвалось создание архива
Для архивирования я использовал «zip -0… ».
Ждал около часа и начал переживать, что процесс идёт слишком медленно.
Решил параллельно запустить копирование всей папки через scp.
Не учёл простой момент, что если законнектиться тем же юзером, то предыдущий коннект оборвётся, и мой архив тоже оборвётся.
Дело в том, что я делал архив на старом сервере, зайдя на него с нового по ssh.
И копирование папки хотел запустить тоже с нового.
В итоге архив успел вобрать в себя 51 гб.
Погуглил — можно ли долить файлы в zip — нельзя! :(
Что ж, заново создавать архив времени будто и нет, буду копировать просто папку, как и собирался.
Проблема #2 — оборвалось копирование папки
Запустил копирование папки через scp.
Визуально выглядело, что копирует примерно с той же скоростью, что и запаковка в архив.
Ну и славненько, ждём-с!
Проходит примерно час — оборвался коннект — суука! :( :)
Успел передать 48 гб.
Погуглил — можно ли в scp докопировать оставшиеся файлы — нельзя! Либо используй rsync, либо запрещай на уровне пермишенов запись для существующих файлов.
rsync я никогда не использовал — надо разбираться, а времени будто и нет.
Пермишены ставить — мне показалось, что прога всё равно будет качать файлы, а потом отваливаться по доступу, и это будет всё равно медленно и долго.
Сообразил, что может же быть архив, в который можно дописывать файлы.
Действительно, tar-архив умеет паковаться без сжатия и поддерживает дозапись.
Кайф! Запакуем-те: «tar -cf… ».
Проблема #3 — неожиданный конец файла
Ждал около часа, и тут пришёл наш знакомый «обрыв соединения».
Ну это ерунда (нет).
Знаем, проходили, подготовлены.
Успел запаковать 55 гб.
Стартую дозапись файлов в архив: «tar -uf… ».
Он минут 5 соображает, сверяет что уже записано и говорит, что у архива плохой END_OF_FILE. Суууууука! :(
Да что ж такое!
У меня остаётся последняя надежда — rsync.
Нагуглил набор опций для него, которые позволят мне докачать только отсутствующие файлы, к тем что уже скачаны через scp.
Запустил: «rsync -hvrPt… ».
Проблема #4 — на старом сервере не установлен rsync
Ну это совсем ерунда (нет).
Зашёл на сервер, запустил «yum install rsync». Изи, но: «404 not found!». Ещё одна «сууука!». :)
Посмотрел, что там в репозиториях линукса — зеркало яндекса. Вернул дефолтные УРЛ-ы, не помогло.
А я такой юзер линукса — у меня есть bash, из которого я немного шевелю файлы и докер, остальное не хочу не буду.
Обновить ядро, пакеты — да, приходилось, потому что «надо», и репы от яндекса я сам вписывал когда-то.
А я такой человек — когда нависает срочность, то впадаю в некий ступор, особенно по теме, в которой не разбираюсь.
Понял, что сам не справляюсь («ебАное айти!»), написал наудачу «товарищу, который шарит».
Он мне подсказал пару вариантов, вторым вариантом было рабочее зеркало для центоса, которое позволило установить rsync.
Спасибо, Randomize!
Заключение
rsync оказалась идеальной утилитой для переноса папок: качает быстро, умеет докачивать только новое, имена файлов бегут по порядку, можно прикинуть, на каком этапе процесс.
Забавно, с каким скрипом я до неё добрался.
И немного жаль, что это случилось на последнем проекте, требующем переноса (в обозримом будущем).
Спасибо за внимание.
Решил рассказать недавний опыт переноса приложения с одного сервера на другой.
Может быть кому-то пригодится, и что-то полезное в комментах напишете.
Приложение: джава-прога с веб-мордой.
Сервер 1 (старый): CentOS 7
Сервер 2 (новый): AstraLinux 1.7
Прога — всё в докере: джава, постгрес, нжинкс, файлбит.
По сути перенос — это копирование файлов между серверами.
На новом сервере монтируем докеровские папки со старого сервера, и всё работает «as expected».
Это не первый мой подобный перенос, и я придерживался такого алгоритма:
- Останавливаем контейнер с прогой
- Делаем бэкап БД, т.к. хочется накатить его на постгрес свежей версии, (н-р 12.4 -> 16.4) простое копирование папки не сработает
- Останавливаем все контейнеры
- Запаковываем всё в архив без сжатия; для удобства, чтобы затем копировать 1 файл и видеть сколько времени осталось, да и по скорости это должно быть быстрее
- Копируем через scp с сервера на сервер
Прошлые проекты занимали в предалах 5-20 гб, а последний — 85 гб, именно большой размер превратил рутину в триллер.
Вводные
Перенос делается по Плану-графику, в который вовлечены некоторые другие участники.
Остановка проги — это остановка продакшена.
То есть всё нужно делать максимально быстро.
Количество файлов для копирования — порядка 136 тысяч, общий размер 85 гб.
Между серверами локальная сеть, скорость копирования порядка 50-100 мбит/с.
Проблема #1 — оборвалось создание архива
Для архивирования я использовал «zip -0… ».
Ждал около часа и начал переживать, что процесс идёт слишком медленно.
Решил параллельно запустить копирование всей папки через scp.
Не учёл простой момент, что если законнектиться тем же юзером, то предыдущий коннект оборвётся, и мой архив тоже оборвётся.
Дело в том, что я делал архив на старом сервере, зайдя на него с нового по ssh.
И копирование папки хотел запустить тоже с нового.
В итоге архив успел вобрать в себя 51 гб.
Погуглил — можно ли долить файлы в zip — нельзя! :(
Что ж, заново создавать архив времени будто и нет, буду копировать просто папку, как и собирался.
Проблема #2 — оборвалось копирование папки
Запустил копирование папки через scp.
Визуально выглядело, что копирует примерно с той же скоростью, что и запаковка в архив.
Ну и славненько, ждём-с!
Проходит примерно час — оборвался коннект — суука! :( :)
Успел передать 48 гб.
Погуглил — можно ли в scp докопировать оставшиеся файлы — нельзя! Либо используй rsync, либо запрещай на уровне пермишенов запись для существующих файлов.
rsync я никогда не использовал — надо разбираться, а времени будто и нет.
Пермишены ставить — мне показалось, что прога всё равно будет качать файлы, а потом отваливаться по доступу, и это будет всё равно медленно и долго.
Сообразил, что может же быть архив, в который можно дописывать файлы.
Действительно, tar-архив умеет паковаться без сжатия и поддерживает дозапись.
Кайф! Запакуем-те: «tar -cf… ».
Проблема #3 — неожиданный конец файла
Ждал около часа, и тут пришёл наш знакомый «обрыв соединения».
Ну это ерунда (нет).
Знаем, проходили, подготовлены.
Успел запаковать 55 гб.
Стартую дозапись файлов в архив: «tar -uf… ».
Он минут 5 соображает, сверяет что уже записано и говорит, что у архива плохой END_OF_FILE. Суууууука! :(
Да что ж такое!
У меня остаётся последняя надежда — rsync.
Нагуглил набор опций для него, которые позволят мне докачать только отсутствующие файлы, к тем что уже скачаны через scp.
Запустил: «rsync -hvrPt… ».
Проблема #4 — на старом сервере не установлен rsync
Ну это совсем ерунда (нет).
Зашёл на сервер, запустил «yum install rsync». Изи, но: «404 not found!». Ещё одна «сууука!». :)
Посмотрел, что там в репозиториях линукса — зеркало яндекса. Вернул дефолтные УРЛ-ы, не помогло.
А я такой юзер линукса — у меня есть bash, из которого я немного шевелю файлы и докер, остальное не хочу не буду.
Обновить ядро, пакеты — да, приходилось, потому что «надо», и репы от яндекса я сам вписывал когда-то.
А я такой человек — когда нависает срочность, то впадаю в некий ступор, особенно по теме, в которой не разбираюсь.
Понял, что сам не справляюсь («ебАное айти!»), написал наудачу «товарищу, который шарит».
Он мне подсказал пару вариантов, вторым вариантом было рабочее зеркало для центоса, которое позволило установить rsync.
Спасибо, Randomize!
Заключение
rsync оказалась идеальной утилитой для переноса папок: качает быстро, умеет докачивать только новое, имена файлов бегут по порядку, можно прикинуть, на каком этапе процесс.
Забавно, с каким скрипом я до неё добрался.
И немного жаль, что это случилось на последнем проекте, требующем переноса (в обозримом будущем).
Спасибо за внимание.
Для параллельного выполнения всякого в shell, рекомендую tmux. Он делает тебе в консоли независимые сеансы.
Для удобного копирования всякого по сети с сервера на сервер, ещё можно использовать mc. Экспириенс как в Volkov Commander. Оно не настолько быстрое, как rsync, но, зато графическое и краисивое)
Вроде и на для астры есть tmux, пока не понял, как мне сразу из bitwise законнектиться в сессию к tmux'y, наверное так нельзя.
Фишка в том, что на сервер я коннекчусь через 2 логина: сначала по ssh в шлюз, а далее выбираю сервер за шлюзом и уже в него.
А «mc» умеет коннектиться по ssh? Буду знать. Полагаю, в нём можно при «повторном» копировании выбрать «Skip duplicates»/for all.
Кстати, возможно, нужно будет снова переезд проги делать, другой. С астры 1.7 на астру 1.8. Я так понял мажорные версии нельзя просто так взять и обновить.
Да, пункт «SFTP Link...»
И дальше из примонтированной по sshfs папки можно выборочно докопировать файлы, если нужны не все. Ещё вроде можно указать опции для реконнекта.
rsync круто копирует, но в нём туева куча параметров и настроек и они все на что-то влияют. Например, rsync может по-разному определять, надо ли копировать файл — может по таймстампу создания или редактирования, может использовать rolling hash, может ещё как. Ещё вопрос, что rsync будет делать с симлинками. Мне обычно лень во всём этом разбираться, я один и тот же скрипт копирую и какие-то опции по необходимости добавляю/убираю.