У меня в производстве настроена репликация MySQL следующим образом:
DB1 -> DB2 DB1 -> BAK
куда DB2
и BAK
рабы DB1
. Все 3 сервера синхронизированы (0 секунд отстает от главного) и имеют более 30 ГБ данных.
Я хотел бы поместить серверы в новую конфигурацию главный-подчиненный следующим образом:
DB1 -> DB2 -> BAK
Как лучше всего сменить главный хост на BAK
?
Есть ли способ избежать остановки подчиненного потока на DB2
и получить mysqldump для BAK
(5-6 часовые процессы)?
Они называют это каскадной репликацией главный-подчиненный-подчиненный. Вам необходимо включить обновления log-bin и log-slave-update в DB2, см. Здесь:
После того, как это работает на BD2, на BAK вам нужно сменить ведущее устройство и сбросить ведомое устройство, чтобы очистить его информацию журнала, ala:
mysql> stop slave;
mysql> change master to MASTER_HOST="BAK name or IP", .....
mysql> reset slave;
mysql> start slave
Где '...' - варианты, как обычно: http://dev.mysql.com/doc/refman/5.0/en/change-master-to.html
Теоретически это должно сделать это за вас без необходимости создавать новый дамп и импортировать его - я бы обязательно запустил журналы сброса на главном сервере и сделал резервные копии BAK, если вы хотите, на случай, если что-то пойдет не так с получением вашего журнала позиции неправильные или что-то вроде ...
Как вы говорите, дамп и импорт могут длиться вечно. Гораздо лучший вариант - использовать xtrabackup, который выполнит восстановление настолько быстро, насколько это возможно при копировании файлов на место. Я писал об этом в блоге некоторое время назад. Я считаю, что это идеальный способ настройки рабов, очень быстрый и простой. Резервное копирование занимает много времени, но восстановление происходит очень быстро. Я также настоятельно рекомендую вам использовать свинья вместо gzip, если вы сжимаете свои резервные копии - это легко увеличило время резервного копирования в 4 раза.
Если вы можете организовать остановку обоих ведомых устройств одновременно (чтобы они оба указывали на один и тот же журнал и позицию на db1), например, мгновенно остановив DB1, то вы можете безопасно перенаправить BAK в DB2, используя информацию о главном устройстве без необходимости. сделать длительное восстановление. Как говорит troyengel, наиболее важным является то, что вам нужны обновления log-slave для выполнения ретрансляции, в противном случае в BAK будут отправляться только операторы, созданные в DB2.
Я также рекомендую вам установить DB2 только для чтения. Это не повлияет на репликацию, но безопаснее, так как вы не получите данные в DB2 и BAK, которых нет в DB1.