У меня репликация MySQL настроена в рабочей среде следующим образом:
БД1 -> БД2 DB1 -> БАК
Где DB2
и BAK
являются подчиненными по отношению к DB1
. Все 3 сервера синхронизированы (отставание от главного сервера составляет 0 секунд) и имеют более 30 ГБ данных.
Я хотел бы поместить серверы в новую конфигурацию «главный-подчиненный» следующим образом:
DB1 -> DB2 -> БАК
Каков наилучший способ смены главного хоста BAK
?
Есть ли способ избежать необходимости останавливать подчиненный поток DB2
и получать mysqldump для BAK
(5-6 часового процесса)?
решение1
Они называют это каскадной репликацией master-slave-slave. Вам нужно включить log-bin и log-slave-updates на DB2, см. здесь:
После того, как это будет запущено на BD2, на BAK вам нужно будет сменить ведущее устройство и сбросить настройки ведомого устройства, чтобы очистить его журнал, вот так:
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, если хотите, на случай, если что-то пойдет не так, например, позиции журналов будут неверными или что-то в этом роде...
решение2
Как вы говорите, дамп и импорт могут длиться вечно. Гораздо лучший вариант — использоватьxtrabackup, который выполнит восстановление примерно с той же скоростью, с которой он сможет скопировать файлы на место.Я написал об этом в блогенекоторое время назад. Я считаю, что это идеальный способ настройки подчиненных, действительно быстрый и простой. Резервное копирование занимает много времени, но восстановление происходит очень быстро. Я также настоятельно рекомендую вам использоватьпигзвместо gzip, если вы сжимаете резервные копии, — это легко увеличило время резервного копирования в 4 раза.
Если вы можете договориться об остановке обоих подчиненных серверов одновременно (так, чтобы они оба указывали на один и тот же журнал и позицию на db1), например, остановив DB1 на мгновение, то вы можете безопасно перенаправить BAK на DB2, используя его основную информацию, без необходимости выполнять длительное восстановление. Как говорит troyengel, самое важное — вам нужно, чтобы log-slave-updates был включен для ретрансляции, в противном случае в BAK будут отправлены только операторы, исходящие из DB2.
Я бы также рекомендовал вам установить DB2 в режим только для чтения. Это не повлияет на репликацию, но будет безопаснее, поскольку у вас не будет данных на DB2 и BAK, которых нет на DB1.