Репликация позволяет решать несколько очень важных задач это повышение доступности и надёжности хранения данных. Начиная с версии 4.1.13 MySQL поддерживает кластеризацию. Итак, что даёт нам репликация?
Репликация процесс копирования данных одной БД между другими БД.
Master Server Главный сервер, с которого производиться копирование.Slave Server Подчинённый сервер, на который, производиться копирование данных.
Slave-сервер с определённой периодичностью будет опрашивать master-сервер на предмет изменений в базе. Таким образом все изменения в master-сервере будут повторяться на slave-сервере. Таким образом создаётся избыточность данных на двух серверах и тем самым достигается высокая доступность и надёжность данных. Важным преимуществом между “холодным копированием” заключается в том, что мы переносим по сети только изменения, а не все данные каждый раз. Тем более не стоит забывать что во время создания backup`а мы нагружаем наш master-сервер. Здесь же всё иначе, master-сервер все изменения в базе пишет в “бинарный журнальный лог”, присваивая каждой операции номер. Когда slave-сервер обращается к нашему главному серверу, то он сообщает номер последней операции, которую он уже произвёл у себя и получает все новые изменения отсчитывая от этого номера.
log-bin = my-bin
my-bin в данном случае это имя файла бинарного лога. В ходе работы базы в папке с данными (у меня это /var/lib/mysql) будут создаваться файлы my-bin.000001, my-bin.000002 и так далее, при каждом старте базы, будет создан новый файл. Вместе с этим будет создан файл my-bin.index в котором будут перечислен список всех бинарных логов. Продолжим настройку нашего главного сервера, добавим следующие строки:
server-id = 1 slave-compressed = 1 binlog-do-db = mydb
server-id является обязательным параметром, это идентификатор базы, пускай будет 1, каждый сервер в схеме репликаций должен иметь уникальный номер. На slave-сервере мы укажем server-id=2. slave-compressed я включил, потому что мой slave-сервер находиться не “рядом” и передача идёт по сети, в этом случае можно повысить скорость и разрешить сжимать поток. bin-do-db необязательный параметр, позволяет указать изменения какой именно базы будет писаться в бинарный журнальный лог.
Создадим отдельную учётную запись на головном сервере c привилегиями REPLICATION SLAVE, SELECT, RELOAD, SUPER. При создании учётной записи не забудьте правильно указать “Хост”. Например, если все наши slave-сервера находятся в зоне webnext.ru то мы можем ограничить доступ как ‘%.webnext.ru’.
Перед запуском подчинённого (slave) сервера, на нём необходимо разместить полную копию данных главного (master) сервера. Задача состоит в том, что на головном сервере необходимо сделать дамп базы в режиме блокировки на запись. И пока делается дамп необходимо узнать номер журнала и смещение от начала файла. Для этого выполните запрос:
В столбце File указано имя текущего журнального файла, а в столбце Position смещение относительно начала файла. Эти значения представляют собой координаты, с которых подчинённому серверу следует получать новые изменения.
Далее на slave-сервере следует выполнить следующую sql-команду.
Регистрация доменов RU за 350р!!!sdfsdf
fdgdg
I’m not robot! He-he-he!!!
I’m not robot! Vauuuu
Здравствуйте!
Всё настроил по статье, проверил. Все работает!!!
Подскажите, пожалуйста, ещё про такую ситуацию:
Остановил SLAVE-сервер, произвёл изменения данных в MASTER-сервере, запустил SLAVE-сервер, но у него обновления не проявились. Что делать???
2 blacknot — 22.03.2008:
blacknot, скажи глупому, как.. КАК указать в php список слейвов? Уже весь php.net вроде пересмотрел, не могу найти того что нужно… буду очень благодарен за маленький пример использования функции. всего одну-две строчки кода, пжл.
Интересно, а реально ли в майскле сделать репликаци мастер-слэйв только на некоторые таблицы базы.
Интересует именно такая задача.
О, нашёл сам уже.
Кому надо:
на слэйве добавляете
replicate-do-table=dbname.tablename1
replicate-do-table=dbname.tablename2
статья хорошая…информативная
О, блин, привет, Костя! Искал мануал по репликации гуглом, и нашёл твой сайт! Малацца! :)
подскажите, с какой частотой слейв будет обращаться на мастер?
то есть если я добавил запись на мастере, через какое время она появится на слейве?
У меня почти сразу, не успеваю глянуть - уже есть
Cпасибо, полезная статья!
везде ищу, и не могу найти ответа на вопрос:
как восстановить репликацию после перезагрузки slave? я уже пробовал, слэйв получал только настоящие изменение, а не те, которые были сделаны, до перезагрузки
так как быть?
Евгений
В my.cnf добавь
server-id=2
master-host=IPhost
master-user=user
master-password=passwort
replicate-do-db=db1
replicate-do-db=db2
log-bin=bin-log
В my.cnf добавь
Бессмысленно. Мускуль читает эти строки только 1 раз, потом создает свой файлик с этими реквизитами и в конфиге уже не роляет.
А есть ли какой скрипт или софтина чтобы синхронизировать текущую базу с той что есть в бекапе? Т.е. посмотреть какие таблички изменились и обновить только их.
А то я смотрю бинарные логи под гигабайт набегают в сутки, а реальных изменений по факту в базе получается мало и смысла гонять между серверами гигабайты каждый день нету.
Хотелось бы просто аплоадить на бекап-сервер только те таблички, которые изменились.
По-идее можно делать просто rsync файлов /var/lib/mysql, но может попасться момент когда данные в файл не полностью записались и в результате файл в бекапе получится кривой.
Т.е. нужно бы делать rsync каждого файла, но на этот момент сказать mysql-базе чтобы записала все изменения в него, а пока файл синхронизируется новые изменения туда не писала.
Каким-нибудь образом можно организовать такую синхронизацию?