Назад | Перейти на главную страницу

Как избежать простоя сервера при создании отношений Master-Slave?

Я готовлюсь к установке отношений MySQL master-slave или master-master. Прямо сейчас у меня есть один производственный сервер MySQL, и, конечно же, я не хочу простоев, пока подключаю ведомый.

Нет ли способа заставить подключить пустой ведомый и позволить ему «медленно» синхронизировать данные от ведущего, пока они не станут идентичными?

Я заметил, что я могу сделать дамп транзакции с mysqldump на главном устройстве, а затем импортировать его в подчиненное устройство, но к тому времени, когда подчиненное устройство импортировало дамп, будет записано много новых строк, и как подчиненное устройство получит их ?

Надеюсь, мне здесь не хватает чего-то очевидного, но обширный поиск в Google дает такие советы, как «поскольку это приведет к сокращению простоев в будущем, некоторые простои сейчас, возможно, не так уж и плохи». Но мне бы очень хотелось этого избежать.

Связанный вопрос для MyISAM, но я использую InnoDB.

Если вы используете 100% InnoDB, то вам повезло. Ты можешь использовать XtraBackup чтобы сделать полную резервную копию вашей главной базы данных без простоев или блокировок таблиц. Это будет последовательная резервная копия в стиле моментальных снимков, такая же, как и в случае, когда вы делаете FLUSH TABLES WITH READ LOCK или --master-data параметры.

Инструмент XtraBackup также помещает дополнительный файл в каталог резервных копий, который содержит информацию MASTER_LOG_POS и MASTER_LOG_FILE, необходимую для запуска репликации на ведомом устройстве.

Когда вы закончите резервное копирование, вам нужно будет запустить XtraBackup --prepare опцию резервного копирования, загрузите его в ведомое устройство, запустите резервный процесс MySQL ведомого устройства и сообщите ему новые необходимые значения MASTER_LOG_POS и MASTER_LOG_FILE.

Ты захочешь skip-slave-start в вашем my.cnf, прежде чем запускать раб.

Также имейте в виду, что mysql схема - это MyISAM по умолчанию (и если память работает правильно, это может быть только MyISAM), поэтому вам все равно придется быть осторожным, чтобы не вносить никаких изменений в любую из этих таблиц во время резервного копирования. Пока вы придерживаетесь этого правила, основная информация будет верной.

Часто бывает хорошей идеей игнорировать mysql схема в вашем my.cnf на ведомом устройстве и создавать пользователей только с привилегиями SELECT. Несогласованные и несинхронизированные ведомые устройства трудно обнаружить, и с ними трудно справиться даже при использовании инструментов, которые Percona (и Maatkit до них) предоставляют для этого.

Редактировать:

Хотя вы сказали, что используете InnoDB, для полноты картины есть другой способ, если вы используете таблицы MyISAM. Если у вас есть диспетчер томов со снимками (например, ZFS или LVM), вы можете запустить FLUSH TABLES WITH READ LOCK за которым следует SHOW MASTER STATUS, создайте снимок и запустите UNLOCK TABLES. Время простоя должно быть минимальным. Для сравнения: вчера вечером задание cron, которое выполняло это для резервного копирования одной из наших баз данных, заняло 6 секунд для создания моментального снимка, который является битом, в котором база данных «не работает», и 27 минут для копирования файлов из моментального снимка на сервер резервного копирования.

Невозможно запустить репликацию mysql "с нуля".

Вместо этого вы можете использовать mysqldump с --master-data=2 параметр при выгрузке ваших баз данных - то есть вот так:

mysqldump --master-data=2 --all-databases --opt -p > myinitialdump.sql

Эта команда заблокирует все таблицы в затронутых базах данных во время дампа и запишет координаты репликации в заголовок дампа в закомментированном виде, например:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000018', MASTER_LOG_POS=106;

После завершения импорта вы можете вручную запустить команду «изменить мастер на», добавив имя хоста вашего мастера и данные аутентификации - репликация начнется в точке дампа.

Имейте в виду, что процесс mysqldump сам по себе вызовет "простои" из-за конфликта блокировок - он устанавливает блокировки чтения для всех таблиц (аналогично тому, что делает команда FLUSH TABLES WITH READ LOCK) на все время создания дампа. Таким образом, запросы на запись ни в одну из таблиц не вернутся, если дамп не будет завершен. Кроме того, запросы на запись, вероятно, также будут блокировать любые последующие запросы чтения, если вы не указали low_priority_updates в вашей конфигурации MySQL или выдал SET GLOBAL LOW_PRIORITY_UPDATES = 1 перед дампом.