Создайте подчиненный MySQL из другого ведомого, но направьте его на мастер

8

проблема

У меня есть настройки репликации MySQL между 2 серверами, master ( A ) и slave ( B ). Мне нужно добавить нового раба в смесь ( С ). Я хочу, чтобы это ведомое устройство получало обновления непосредственно от главного устройства, я не хочу репликации цепей от подчиненного устройства. Тем не менее, мастер «горячий», я обычно использую Xtrabackup для создания полной резервной копии мастера, но это блокирует его на хорошие 10 минут, так как размер базы данных составляет около 20 ГБ.

Возможное решение

ПРОМЫШЛЕННЫЕ СТОЛЫ С ЧИТАЮЩЕЙСЯ БЛОКИРОВКОЙ на подчиненном устройстве B , используйте SHOW SLAVE STATUS на B , запишите binlog и position. Затем создайте резервную копию базы данных с помощью Xtrabackup, отправьте резервную копию на C и используйте ее для создания ведомого устройства и установите для репликации указатель на A с позицией binlog, которую я только что записал.

Вопрос

Есть ли лучший способ, который не требует, чтобы я заблокировал B так долго? Или что-то, что легче автоматизировать?

Алекс Ресари
источник

Ответы:

20

Эй, я знаю сумасшедший метод создания ведомого без увеличения какой-либо операции ведущего (ServerA) или ведомого (ServerB)

Шаг 1) Настройте новый сервер (ServerC)

Шаг 2) На ServerC, установите MySQL (той же версии, что и ServerB)

Шаг 3) На ServerC служба MySQL останавливается

Шаг 4) Скопируйте /etc/my.cnf с сервера B на сервер C

Шаг 5) На ServerC измените server_id на значение, отличное от ServerA и ServerB

Шаг 6) rsync / var / lib / mysql на сервере B для сервера C

Шаг 7) Когда rsync завершится, запустите «STOP SLAVE;» на сервереB

Шаг 8) rsync / var / lib / mysql на сервере B для сервера C

Шаг 9) На сервере B запустите «START SLAVE;»

Шаг 10) На сервере С запускается служба mysql

Шаг 11) На сервере C запустите «НАЧАТЬ РАБА;» (Сделайте это, если skip-slave-start находится в /etc/my.cnf)

Попробуйте!

Кстати, я абсолютно уверен, что это сработает, потому что я только что сделал это для клиента за последние 2 дня. Клиент имел 2,7 ТБ данных на ведомом устройстве. Я rsyncd на другой сервер, пока ведомое устройство было еще активно. rsync занял около 11 часов. Я тогда побежал СТОП РАБА; на первом рабе и снова запустил rsync. Это заняло еще час. Затем я выполнил вышеуказанный шаг, и все готово.

RolandoMySQLDBA
источник
ЛОЛ. Я собирался прокомментировать OP, чтобы использовать ваше предложение, и вот его г-н Роландо, администратор "Холодильника". Роландо ударил ногтем по голове, и это предпочтительный метод без необходимости останавливать любого Мастера и не останавливать вашего B-раба на слишком длительный период.
coderwhiz
2
Я знаю, что это довольно старый пост, но кто-то спросил меня об этом методе. Это прекрасно работает, если предположить, что новый раб и старый раб точно такие же. Если новый раб - другая арка, он не будет работать (iirc). И я почти уверен, что если вы используете табличные пространства innodb для каждого файла, это не сработает. Самое безопасное решение - сделать полное резервное копирование с мастера, если есть какие-либо сомнения.
Лусис
@lusis - Ваш комментарий очень верный. В идеальном мире, который, как думают большинство клиентов MySQL, они хотят, это делается, поскольку все спецификации оборудования идентичны. В настройках, где оборудование отличается, mysqldumps и перезагрузка являются самыми безопасными. Вы должны отправить свой комментарий в качестве ответа. Я бы проголосовал за это. Посмотрим, будут ли другие !!!
RolandoMySQLDBA
Я следовал за процедурой. После запуска mysql на SlaveC я получаю сообщение об ошибке: «Возможно, ваша база данных повреждена или вы скопировали табличное пространство InnoDB, но не файлы журнала InnoDB». И на start slave(SlaveC) я получаю «Не удалось открыть релейный журнал» /var/log/mysql/mysql-relay-bin.001603 »
Хуссейн Тамболи,
Таким образом, вы можете легко потерять данные на ServerC.
Акузминский
3

Когда мы добавляем раба в наш микс, мы делаем следующее:

  • отключить одного раба
  • скопировать каталог данных базы данных на нового ведомого устройства (настройки подчиненного устройства -binlog position, master host и т. д. - будут правильными, поскольку мы скопировали с подчиненного устройства)
  • запустить оригинальный раб
  • изменить идентификатор сервера в my.cnf для нового ведомого
  • начать новый раб
sreimer
источник
Я просто должен был сделать это сам сегодня днем
sreimer
1

Я сделал то, что предлагает @RolandoMySQLDBA, но также добавил шаги 6 ' и 8' (это решает то, что комментирует @Hussain Tamboli .):

Шаг 1) Настройте новый сервер (ServerC)

Шаг 2) На ServerC, установите MySQL (той же версии, что и ServerB)

Шаг 3) На ServerC служба MySQL останавливается

Шаг 4) Скопируйте /etc/my.cnf с сервера B на сервер C

Шаг 5) На ServerC измените server_id на значение, отличное от ServerA и ServerB

Шаг 6) rsync / var / lib / mysql на сервере B для сервера C

Шаг 6 ') rsync / var / log / mysql с сервера B на сервер C

Шаг 7) Когда rsync завершится, запустите «STOP SLAVE;» на сервереB

Шаг 8) rsync / var / lib / mysql на сервере B для сервера C

Шаг 8 ') rsync / var / log / mysql с сервера B на сервер C

Шаг 9) На сервере B запустите «START SLAVE;»

Шаг 10) На сервере С запускается служба mysql

Шаг 11) На сервере C запустите «НАЧАТЬ РАБА;» (Сделайте это, если skip-slave-start находится в /etc/my.cnf)

Пер Барсело
источник
Ваш ответ не полный, и он ссылается на другие вещи. это не форум, улучшите свой ответ, чтобы быть полным самостоятельно.
asdmin
0

У вас есть опция «ЗАГРУЗИТЬ ДАННЫЕ ИЗ МАСТЕРА», но это крайне не рекомендуется.

Вы делаете еженедельные / еженедельные резервные копии в вашей системе? Если это так, также отметьте положение с вашей резервной копией, тогда вы можете использовать эту резервную копию для настройки нового ведомого устройства. Просто оставьте это, и позвольте этому обновляться в течение некоторого времени.

Jishi
источник
0

Я попробовал ответы Роландо и работал нормально, но он начал воспроизводиться с самого начала, и мне пришлось добавить больше кода ошибки, чтобы пропустить (я знаю, что это не рекомендуется, но я знаю, что я делал).

После выполнения шага 7 я проверил журнал mysql, записал имя и позицию журнала бина и продолжил до 9-го шага. Перед 10-м шагом я просто выполнил change masterдля файла журнала и позиции журнала. И продолжил с шага 11. Все выглядит нормально для меня.

колос
источник
-2

Вам нужно изменить подчиненный uuid в auto.cnf, чтобы мастер мог различить двух подчиненных.

Назгуль
источник