Перенесення сайту (ів) без простою і втрати даних між виділеними серверами, savepearlharbor

Здавалося б, що складного перенести сайт на інший сервер? Напевно багато хто з нас копіювали свої перші хоумпейджі з хостингу на хостинг в пошуках кращого, будучи ще навчаючись в школі або на перших курсах університету. Або вішаючи на вуха локшини керівництву, пояснювали, що завдання це не наважується миттєво і сайт добу працювати не буде, бо DNS така штука ...

  • Скопіювати файли
  • Зробити дамб баз даних
  • Розгорнути на новому сервері
  • На старому сервері замінити всі коннект до бд до нового
  • налаштувати DNS
  • ...

Скільки це займе часу? Скільки дорогоцінних хвилин сайт не працюватиме \ не працюватиме правильно?

Чомусь я не знайшов будь-якої статті на Хабре, тому вирішив написати кілька прийомів, як можна перенести корявий проект або відразу кілька так, щоб шеф був задоволений стабільною роботою сайту.

Все це актуально швидше для сайтів, написаних на РНР, для адміністраторів зіткнулися з проектами, де не використовувалися фреймворки, cms і голова при написанні коду.

1. Перенесення файлів

Кращий спосіб через ssh за допомогою rsync:

Так rsync синхронізує папки Інкрементальний, тобто копіює тільки те - чого не вистачає і не зачепить щось нове. Наприклад, можна написати невеликий bash скрипт, який буде синхронізувати всі папки з старого сервера на новий в момент поновлення DNS, але все ж найкращим варіантом буде через пару діб синхронізувати папки з ключем -n (-dry-run) щоб просто побачити розбіжності. Думаю в документації по rsync знайдуться вирішення будь-яких завдань по синхронізації файлів. Програма повинна бути встановлена ​​на обидва сервера.

За протоколом FTP rsync працювати не вміє, тоді використовуємо lftp:

2. Перенесення БД на прикладі MySQL

На обох машинах відкриваємо порт сервера MySQL в світ:

Я напишу приклад як я роблю бекапи кожен день, вирізка з logrotate.d:

Чому не класично «mysqldump -u root -p database> dump.sql»? Тоді не будуть збережені view і процедури. Правильно робить дампи MySQL Workbench, звідти я і взяв цю команду.

Далі, в змінну $ CMD додаємо -h ip_старий_сервер і міняємо рядок $ CMD $ i | gzip -c> /srv/dumps/$i/$i.sql.gz на:

Звичайно потрібно попередньо створити всі бази даних:

3. Перенаправлення всіх з'єднань до localhost: 3306 - старий сервер на новий сервер

Досить просто, використовуємо ssh tunnel (попередньо зупинивши mysql):

Причому ssh потрібно тільки на локальній машині. перевіряємо:

Отримуємо віддалений MySQL сервер на локальній машині. Все б добре, але MySQL client якщо бачить, що з'єднання йде до localhost то з'єднується з сервером через локальний socket і ніякі настройки його робити так відучити не можуть. Тобто

Або як зазвичай ми пишемо в скриптах:

Працювати не будуть, тому що таке з'єднання теж буде по оброблено через локальний сокет. Звичайно можна пробігтися по всіх з'єднаннях сайту і замінити localhost на 127.0.0.1 або зовнішній IP сервера, уже запрацює, але є спосіб краще.

Знайти єдиний збіг по тексту localhost і замінити на що-небудь інше, на кшталт lacalhost, в обох файлах. Після локальні з'єднання будуть працювати через TCP / IP! Єдине MySQL не пускає користувачів у яких віддалений хост може бути тільки localhost в привілеї. Це треба виправити на% під час перенесення.

Припустимо настройки веб сервера, по цій темі повно матеріалів.
У підсумку ми маємо дві робочі машини з одним сервером БД. Спокійно переналаштовує DNS і йдемо спати!

p.s. Так само прийшла в голову ідея проксіровать запити з старого сервера на новий через nginx. Хто-небудь робив так?