Главная страница | Добавить в избранное    
   

 

» Статьи » Репликация MySQL

   
main1
pix
 

Репликация MySQL

Статьи  
pix pix pix

Настройка репликации


Допустим, у нас есть работающая база данных MySQL, уже наполненная данными и включенная в работу. И по одной из причин, описанных выше, мы собираемся включить репликацию нашего сервера. Наши исходные данные:
  • IP-адрес мастера 192.168.100.1, реплики — 192.168.100.2.
  • MySQL установлен и настроен
  • требуется настроить репликацию БД testdb
  • мы можем приостановить работу мастера на некоторое время
  • у нас, разумеется, есть root на обеих машинах

Настройки мастера

Обязательно укажем уникальный ID сервера, путь для бинарных логов и имя БД для репликации в секции [mysqld]:
server-id = 1
log-bin = /var/lib/mysql/mysql-bin
replicate-do-db = testdb
(будет реплицировать только данную базу, при не указаной дерективе возможно реплицировать любую базу имеющеюся в mysql)
Убедитесь, что у вас достаточно места на диске для бинарных логов.

Добавим пользователя replication, под правами которого будет производится репликация. Будет достаточно привилегии "replication slave ":
mysql@master> GRANT replication slave ON "testdb".* TO "replication"@"192.168.100.2" IDENTIFIED BY "password";

Перезагрузим MySQL, чтобы изменения в конфиге вступили в силу:
root@master# mysqld restart

Если все прошло успешно, команда "show master status " должна показать примерно следующее:
mysql@master> SHOW MASTER STATUS\G
File: mysql-bin.000003
Position: 98
Binlog_Do_DB:
Binlog_Ignore_DB:

Значение position должно увеличиваться по мере того, как вносятся изменения в БД на мастере.

Настройки реплики

Укажем ID сервера, имя БД для репликации и путь к relay-бинлогам в секции [mysqld] конфига, затем перезагрузим MySQL:
server-id = 2
relay-log = /var/lib/mysql/mysql-relay-bin
relay-log-index = /var/lib/mysql/mysql-relay-bin.index
replicate-do-db = testdb

root@replica# service mysqld restart


Переносим данные

Здесь нам придется заблокировать БД для записи. Для этого можно либо остановить работу приложений, либо воспользоваться установкой флажка read_only на мастере (внимание: на пользователей с привилегией SUPER этот флаг не действует). Если у нас есть таблицы MyISAM, сделаем также "flush tables":
mysql@master> FLUSH TABLES WITH READ LOCK;
mysql@master> SET GLOBAL read_only = ON;


Посмотрим состояние мастера командой «show master status» и запомним значения File и Position (после успешной блокировки мастера они не должны изменятся):
File: mysql-bin.000003
Position: 98

Делаем дамп БД, и после завершения операции снимаем блокировку мастера:

mysql@master> SET GLOBAL read_only = OFF;

Переносим дамп на реплику и восстанавливаем из него данные.

Наконец, запускаем репликацию командами "change master to" и "start slave" и посмотрим, все ли прошло хорошо:
mysql@replica> CHANGE MASTER TO MASTER_HOST = "192.168.100.1 ", MASTER_USER = "replication ", MASTER_PASSWORD = "password ", MASTER_LOG_FILE = "mysql-bin.000003 ", MASTER_LOG_POS = 98;
mysql@replica> start slave;

Значения MASTER_LOG_FILE и MASTER_LOG_POS мы берем с мастера.

Посмотрим, как идет репликация командой "show slave status ":
mysql@replica> SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.101
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 98
Relay_Log_File: mysql-relay-bin.001152
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: testdb,testdb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 5


Наиболее интересные сейчас значения я выделил. При успешном начале репликации их значения должны быть примерно такими, как в листинге (см. описание команды "show slave status " в документации). Значение Seconds_Behind_Master может быть любым целым числом.
Если репликация идет нормально, реплика будет следовать за мастером (номер лога в Master_Log_File и позиция Exec_Master_Log_Pos будут расти). Время отставания реплики от мастера (Seconds_Behind_Master), в идеале, должно быть равно нулю. Если оно не сокращается или растет, возможно, что нагрузка на реплику слишком высока — она просто не успевает повторять изменения, происходящие на мастере.
Если же значение Slave_IO_State пусто, а Seconds_Behind_Master равно NULL, репликация не началась. Смотрите лог MySQL для выяснения причины, устраняйте её и заново запускайте репликацию:
mysql@replica> start slave;

Путем этих нехитрых действий мы получаем реплику, данные которой идентичны данным на мастере.
Кстати, время блокировки мастера — это время создания дампа. Если он создается недопустимо долго, можно попробовать поступить так:
  • заблокировать запись в мастер флагом read_only, запомнить позицию и остановить MySQL.
  • после этого скопировать файлы БД на реплику и включить мастер.
  • начать репликацию обычным способом.

Существует несколько способов создать реплику без остановки мастера вообще, но они срабатывают не всегда.

MASTER - сервер

Следующая таблица показывает параметры, которые Вы можете использовать для главного (MASTER) сервера:

Опция Описание
log-bin=filename Записывать в двоичный файл регистрации модификаций filename. Обратите внимание, что, если Вы задаете этот параметр с расширением (например, log-bin=/mysql/logs/replication.log) версии до 3.23.24 не будут работать корректно, если Вы делаете FLUSH LOGS. Проблема была исправлена в версии 3.23.25. Если Вы используете этот вид имени файла регистрации, команды FLUSH LOGS будут игнорироваться. Чтобы очистить файл регистрации, выполните FLUSH MASTER на главной системе и FLUSH SLAVE на всех подчиненных. В версии 3.23.26 и в более поздних Вы должны использовать RESET MASTER и RESET SLAVE
log-bin-index=filename Поскольку пользователь мог бы выдавать команду FLUSH LOGS Вы должны знать, который файл регистрации является в настоящее время активным. Эта информация сохранена в двоичном индексном файле регистрации. Значение по умолчанию `hostname`.index. Вы можете использовать эту опцию, если Вы хотите переопределить значение. Например: log-bin-index=db.index.
sql-bin-update-same Если задано, то установка SQL_LOG_BIN автоматически установит в такое же значение и SQL_LOG_UPDATE и наоборот.
binlog-do-db=database_name Сообщает главной системе, что она должна регистрировать модификации в двоичном файле регистрации, если текущая база данных 'database_name'. Все прочие базы данных игнорируются. Обратите внимание, что, если Вы используете эту опцию, Вы должны гарантировать, что делаете модификации только в текущей базе данных. Например: binlog-do-db=some_database.
binlog-ignore-db=database_name Сообщает главной системе, что модификации, где текущая база данных является database_name, НЕ должны быть сохранены в двоичном файле регистрации. Обратите внимание, что, если Вы используете эту опцию, Вы должны гарантировать, что делаете модификации только в текущей базе данных. Например: binlog-ignore-db=some_database
slave-compressed = 1 разрешить сжимать поток

SLAVE - сервер

Следующая таблица показывает параметры, которые Вы можете использовать для подчиненной (SLAVE) системы:

Опция Описание
master-host=host Имя хоста или IP-адрес главной системы. Если не задано, подчиненный не будет работать вообще. Например: master-host=joker.botik.ru.
master-user=username Пользователь под именем которого надо связываться с главной системой. Пользователь должен иметь привилегию FILE. Если не задано, принимается пользователь test. Например: master-user=alexmv.
master-password=password Пароль для пользователя из предыдущего параметра. По умолчанию принимается пустой пароль. Например: master-password=pupsik.
master-port=portnumber Порт для связи с главной системой. Если не задан, принимается компилируемая установка MYSQL_PORT. Если Вы не меняли опции configure, это будет 3306. Например: master-port=3306.
master-connect-retry=seconds Число секунд, которые подчиненный будет бездействовать перед повторением попытки восстановить связь с главной системой в случае ее обрыва. Значение по умолчанию 60. Например: master-connect-retry=60.
master-ssl Включить поддержку SSL. Например: master-ssl.
master-ssl-key Имя файла с ключем SSL для главной системы. Например: master-ssl-key=SSL/master-key.pem.
master-ssl-cert Имя файла с сертификатом SSL для главной системы. Например: master-ssl-key=SSL/master-cert.pem.
master-info-file=filename Расположение файла, который хранит данные о ходе процесса репликации. Значение по умолчанию master.info в каталоге данных. Например: master-info-file=master.info.
replicate-do-table=db_name.table_name Сообщает, чтобы подчиненная система ограничила репликацию определенной таблицей. Чтобы определять больше, чем одну таблицу, используйте директиву несколько раз, по одному для каждой таблицы. Это будет работать для модификаций с перекрестной базой данных, в отличие от replicate-do-db. Например: replicate-do-table=some_db.some_table.
replicate-ignore-table=db_name.table_name Сообщает, чтобы подчиненная система не копировала определенную таблицу. Чтобы определять больше, чем одну таблицу, используйте директиву несколько раз, по одному для каждой таблицы. Это будет работать для модификаций с перекрестной базой данных, в отличие от replicate-ignore-db. Например: replicate-ignore-table=db_name.some_table.
replicate-wild-do-table=db_name.table_name Сообщает, чтобы подчиненная система ограничила репликацию таблицами, которые соответствуют определенному образцу подстановочных знаков. Чтобы определять больше, чем одну таблицу, используйте директиву несколько раз, по одному для каждой таблицы. Это будет работать для модификаций с перекрестной базой данных. Например: replicate-wild-do-table=foo%.bar% будет копировать только модификации к таблицам во всех базах данных, которые начинаются с foo и только для таблиц, имена которых начинаются с bar.
replicate-wild-ignore-table=db_name.table_name Противоположно предыдущей опции.
replicate-ignore-db=database_name Сообщает, чтобы подчиненная система не копировала определенную базу данных. Чтобы определять больше, чем одну базу, используйте директиву несколько раз, по одному для каждой. Эта опция не будет работать, если Вы используете перекрестные модификации базы данных. Если Вы нуждаетесь в перекрестных модификациях базы данных, следует удостовериться, что Вы имеете версию 3.23.28 или позже, и использовать replicate-wild-ignore-table=db_name.%. Например: replicate-ignore-db=some_db.
replicate-do-db=database_name Сообщает, чтобы подчиненная система ограничила репликацию определенной базой данных. Чтобы определять больше, чем одну базу, используйте директиву несколько раз, по одному для каждой. Эта опция не будет работать, если Вы используете перекрестные модификации базы данных, то есть под запретом оказываются запросы типа UPDATE some_db.some_table SET foo='bar' при выборе иной база или не выбрано никакой. Если Вы нуждаетесь в перекрестных модификациях базы данных, следует удостовериться, что Вы имеете версию 3.23.28 или позже, и использовать replicate-wild-do-table=db_name.%. Например: replicate-do-db=some_db.
log-slave-updates Сообщает, чтобы подчиненная система регистрировала модификации из подчиненного процесса в двоичном файле регистрации. По умолчанию Off.
replicate-rewrite-db=from_name->to_name Обновлять базу данных с именем, отличным от первоначального. Например: replicate-rewrite-db=master_db_name->slave_db_name.
skip-slave-start Сообщает, чтобы подчиненная система не запускалась как подчиненная. Пользователь может запустить это позже с помощью SLAVE START.
slave_read_timeout=# Число секунд, которое надо ждать перед разрывом связи.

Команды SQL, относящиеся к репликации

Реликация может контролироваться через интерфейс SQL.

Команда Описание
SLAVE START Запустить подчиненный (Slave) поток.
SLAVE STOP Выключить подчиненный (Slave) поток.
SET SQL_LOG_BIN=0 Отключает регистрацию модификации, если пользователь имеет привилегию process.
SET SQL_LOG_BIN=1 Заново запускает регистрацию модификации, если пользователь имеет привилегию process.
SET SQL_SLAVE_SKIP_COUNTER=n Пропустить следующие n событий от главной системы. Работает только, если подчиненный не запущен, иначе выдает ошибку. Полезно при ремонте сбоев.
RESET MASTER Удаляет все двоичные файлы регистрации, перечисленные в индексном файле, очищая индексный файл binlog. В версиях до 3.23.26 называлась FLUSH MASTER
RESET SLAVE Подчиненный забывает позицию репликации в главных файлах регистрации. В версиях до 3.23.26 называлась FLUSH SLAVE
LOAD TABLE tblname FROM MASTER Загрузить копию таблицы с главной системы на подчиненную
CHANGE MASTER TO master_def_list Изменяет параметры для значений, определенных в master_def_list и перезапускает подчиненный процесс. master_def_list представляет собой разделенный запятыми список master_def, где master_def один из элементов следующего перечня: MASTER_HOST, MASTER_USER, MASTER_PASSWORD, MASTER_PORT, MASTER_CONNECT_RETRY, MASTER_LOG_FILE, MASTER_LOG_POS. Например:
CHANGE MASTER TO
MASTER_HOST='master2.mycompany.com',
MASTER_USER='replication',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4;
Вы должны определить только значения, которые должны быть изменены. Значения, которые Вы опускаете, останутся теми же самыми, за исключением того случая, когда Вы изменяете главный компьютер или порт. В этом случае подчиненный считает, что, так как Вы соединяетесь с другим главным компьютером или иным портом, главная система поменялась. Следовательно, старые значения файла регистрации и позиции больше неприменимы и будут автоматически сброшены к пустой строке и 0 соответственно (это значения начала). Обратите внимание, что, если Вы перезапускаете подчиненный сервер, то он будет помнить последний главный сервер. Если это не нужно, Вы должны удалить файл master.info прежде, чем выполнить перезапуск, и подчиненный будет читать данные на главный сервер из файла my.cnf или из командной строки.
SHOW MASTER STATUS Обеспечивает информацию состояния binlog главной системы.
SHOW SLAVE STATUS Обеспечивает информацию состояния существенных параметров подчиненной системы.
SHOW MASTER LOGS Вносит в список двоичные протоколы на главной системе. Доступно с версии 3.23.28. Вы должны использовать эту команду до PURGE MASTER LOGS TO.
PURGE MASTER LOGS TO logname Удаляет все файлы регистрации репликаций, которые перечислены в индексе файла регистрации как находящиеся до определенного файла регистрации, и затем удаляет их из индекса файла регистрации так, чтобы данный файл регистрации теперь стал первым. Доступно с версии 3.23.28. Пример:
PURGE MASTER LOGS TO mysql-bin.010
Эта команда ничего не будет делать, если Вы имеете дело с активным подчиненным сервером, который в настоящее время читает один из файлов регистрации, которые Вы пробуете удалять. Команда безопасна для выполнения в то время, когда все подчиненные копируют данные. Сначала выясните, какие файлы обрабатывает каждый подчиненный командой SHOW SLAVE STATUS, затем выясните очередь протоколов на главной системе командой SHOW MASTER LOGS, найдите самый старый протокол на подчиненных, зарезервируйте все подготовленные к удалению протоколы, если считаете это необходимым, и удалите все старые протоколы.



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
 
Автор: hellevil | 15-12-2009, 12:26 | Просмотров: 16 093
 
pix
  Новости по теме    
pix pix pix
  • Как снять/изменить пароль root'a в MySQL
  • Копирование данных с помощью rsync + ssh
  • MySQL Error Codes
  • Создание программного RAID1 под FreeBSD c использованием gmirror
  • Настройка/установка natd/маршрутизатора в FreeBSD на основе natd+ipfw
  •  
     
     
    pix
     
    pix
    search
    navi
    poll
    calendar
    «    Март 2024    »
    ПнВтСрЧтПтСбВс
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
    main4
    pix pix pix

    2007 © www.DesktopBSD.ru
    Все права сохранены