Хотелось бы минимизировать время простоя (в период «переключения»).
Мы работаем на EC2 с данными на томе EBS. Безопасно ли делать снимок тома базы данных во время его работы и использовать его для восстановления на новом, или мне нужно сначала выключить старую базу данных?
Я бы посоветовал:
FLUSH TABLES WITH READ LOCK;
.Затем в точке переключения:
FLUSH LOGS;
на старой машине.STOP SLAVE; RESET MASTER;
на новой машине.Есть несколько более тонких деталей, например, являетесь ли вы активным пользователем InnoDB. Но это общая суть.
Почему бы не настроить второй сервер MYSQL в качестве подчиненного, реплицировать, а затем перенастроить подчиненный сервер в качестве главного?
Дэн Си прав, но я хотел бы уточнить первые 3 шага.
Ради скорости, и чтобы избежать бедствий, сделайте все это в клиенте mysql CLI следующим образом:
sudo mysql -e "FLUSH TABLES; FLUSH TABLES WITH READ LOCK; SYSTEM ec2-create-snapshot vol-4d826724; UNLOCK TABLES;"
Я полагаюсь на следующие моменты:
Я вижу это описание двусмысленно, или явно неправ по всему интернету! В документации четко сказано: "Если клиентское соединение разрывается, сервер снимает блокировки таблицы, удерживаемые клиентом.". Так что вы не может открыть клиент mysql, сбросить + заблокировать, выйти из клиента, сделать снимок, открыть клиент mysql, разблокировать таблицы. В результате вы получите противоречивый снимок.
Некоторые сверхточные считыватели правильно определят, что "РАЗБЛОКИРОВАТЬ ТАБЛИЦЫ" не нужны, потому что клиентское соединение все равно закрывается в конце. Я положил его туда, потому что так людям удобнее.
Я процитировал для вас 6 источников. Я надеюсь, что вы чувствуете себя уверенно, делая это сейчас. Дайте нам знать, если у вас возникнут сомнения.
Сначала убедитесь, что бинлоги включены. Сделайте снимок уровня файловой системы (например, LVM или аналогичный) каталога mysql под глобальной блокировкой чтения (FLUSH TABLES WITH READ LOCK
). Используйте этот снимок для настройки нового сервера и настройки репликации в старую систему (вы можете выяснить имя и положение binlog (master_log_file
/master_log_pos
), посмотрев на размер новейшего бинлога в снимке).
Когда вы будете готовы к переходу, остановите все записи (read_only=true
, уничтожьте все соединения) на старом сервере и дождитесь, пока новый сервер не догонит репликацию. Затем сделайте новый сервер доступным для записи и отключите старый.
В зависимости от того, какие запросы выполняются к вашей базе данных, у вас может быть время простоя порядка секунд. Однако это зависит от детерминированности ваших запросов на запись, так что старый и новый сервер будут иметь точно такие же данные.