LINUX.ORG.RU
ФорумAdmin

Подскажите, как вы делаете автоматическую репликацию MySQL?


1

2

Нужно сделать репликацию MySQL. Все мануалы, где я про это читал, предполагают кучу ручной работы после каждого перезапуска мастера или слейва - руками лочить первый сервер, выяснять номер файла лога, позицию, куча дел на втором сервере (реплике), и т.д. Это неприемлемо в моих условиях. Подскажите, как вы делаете автоматическую репликацию, чтобы она *просто работала*? Т.е. два сервера, на «главном» - база, на «второстепенном» - чтобы была точная копия базы, чтобы вся эта красота переживала ребуты, рестарты, как мастера, так и слейва, чтобы не нужно было заходить и руками что-то делать. Тут ещё деталь - второстепенный лишь частично «второстепенный» - это отдельный сервер со своими базами, но просто как доп фишка этот второй сервер будет содержать копию баз первого.

Как это *грамотно* сделать? Может уже есть готовые решения? Наверняка ведь тем же вопросом задавался кто-то до меня.

Я перелопатил всё, до чего дотянулся, но ничего не нашёл. Надеюсь на помощь опытных коллег.


Хм. Оно и так рестарты переживает без проблем вроде бы.

Главное чтобы бинарные логи сохранялись, а слейв уже после своего перезапуска всё подтянет с нужной точки.

Про перезапуск мастера точно не скажу, но вроде бы тоже никаких проблем не вижу серьезных.

Номера логов и т.п. нужны только при первичном переносе данных на слейв.

blind_oracle ★★★★★
()

1 мастер + 3 слейва. При перезапуске mysql на мастере или его перезагрузке всё поднимается само. Слейвы при рестарте тоже продолжают оттуда , где остановились. Всё *просто работает*.

это отдельный сервер со своими базами

Главное, чтобы эти свои базы и таблицы не назывались одинаково на мастере и слейве, а то они перестанут быть своими. Или исключения для репликации добавить в конфиг слейва.

Ну и до кучи вот и еще.

fjoe
()

думаю автор про те случаи когда обрывается связь между слейвом и мастером и слетает репликация - то есть идут ошибки по дубликатам индексов и без вмешательства админа репликация не заработает

можно заюзать такой костыль

--- 8>< -------------------------------------------------------------------------------
#!/bin/bash

# проверка статуса слейва - должно быть 2 строки с 'YES'
COL=`/usr/bin/mysql -ppass -e 'show slave status\G' | grep Running | grep Yes | wc -l`

# если строки не две
if [ «$COL» -ne «2» ] ; then
# остановка слейва
/usr/bin/mysql -ppass -e 'stop slave'
# сброс слейва
/usr/bin/mysql -ppass -e 'reset slave'
# смотрим имя файла и позицию на мастере
FILE=`mysql -h master_ip -ppass -e 'show master status' | grep -v File | awk ' {print $1}'`
POS=`mysql -h master_ip -ppass -e 'show master status' | grep -v File | awk ' {print $2}'`
# настройка слейва
mysql -ppass -e 'CHANGE MASTER TO MASTER_LOG_FILE=$FILE, MASTER_LOG_POS=$POS'
# старт слейва
/usr/bin/mysql -ppass -e 'start slave'
fi
------------------------------------------------------------------------------ ><8 ---

x97Rang ★★★
()
Ответ на: комментарий от x97Rang

думаю автор про те случаи когда обрывается связь между слейвом и мастером

Да, именно так. Связь обрывается - и привет. Приходится вручную.

xl743
() автор топика
Ответ на: комментарий от xl743

Да, всё как в мануале. Слейвы ведь просто читают бинарный лог с определенной точки. Файл такой-то, позиция такая-то. Ну порвалась связь, и что? Слейв подсоединяется заново, и продолжает исполнение транзакций из бинарного с того места, где он закончил.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

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

x97Rang ★★★
()
Ответ на: комментарий от xl743

есть 2 варианта

1) использую скрипт для отправки смс(Мегафон) через почту

#!/bin/bash

COL=`/usr/bin/mysql -ppass -e 'show slave status\G' | grep Running | grep Yes | wc -l`

if [ $COL -ne «2» ] ; then
echo «Slave not work» | /usr/bin/mail -s mirror_error my_login@sms.ugsm.ru
fi

2) можно настроить триггер в zabbix (система мониторинга)
тоже будет или письмо приходить или смс

x97Rang ★★★
()
Ответ на: комментарий от x97Rang

окончательный рабочий вариант

#!/bin/bash

# проверка статуса слейва - должно быть 2 строки с 'YES'
COL=`/usr/bin/mysql -ppass -e 'show slave status\G' | grep Running | grep Yes | wc -l`

# если строки не две
if [ «$COL» -ne «2» ] ; then
# остановка слейва
/usr/bin/mysql -ppass -e 'stop slave'
# сброс слейва
/usr/bin/mysql -ppass -e 'reset slave'
# смотрим имя файла и позицию на мастере
FILE=`mysql -h master_ip -ppass -e 'show master status' | grep -v File | awk ' {print $1}'`
POS=`mysql -h master_ip -ppass -e 'show master status' | grep -v File | awk ' {print $2}'`
# настройка слейва
mysql -pdebianhekbn2 -e «CHANGE MASTER TO MASTER_LOG_FILE='$FILE', MASTER_LOG_POS=$POS»
# старт слейва
/usr/bin/mysql -ppass -e 'start slave'
fi

x97Rang ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.