MySQL поддерживает одностороннюю и асинхронную репликацию. Сервер действует как главный сервер. Один или несколько других серверов действуют как подчиненные серверы. Главный сервер записывает обновления в двоичные файлы журналов и поддерживает индекс файлов журналов для отслеживания ротации журналов. Когда ведомое устройство подключается к ведущему, оно уведомляет ведущее устройство о местоположении последнего успешного обновления, которое ведомое устройство прочитало в журнале. Подчиненный сервер получает все обновления, которые произошли с тех пор, затем блокируется и ждет, пока главный сервер уведомит о следующем обновлении.
Зачем использовать репликацию «главный-подчиненный»?
1. Настройка главного/подчиненного сервера повышает надежность. Если что-то пойдет не так с главным сервером, вы можете переключиться на подчиненный сервер в качестве резервного.
2. Разделив нагрузку по обработке запросов клиентов между главным и подчиненным серверами, вы можете сократить время ответа клиентов. Но не обновляйте одновременно главный и подчиненный серверы, так как это может вызвать конфликты.
3. Еще одним преимуществом использования репликации является то, что вы можете использовать подчиненный сервер для выполнения резервного копирования, не нарушая работу главного сервера. Главный сервер может продолжать обработку обновлений во время процесса резервного копирования.
MySQL использует 3 потока для выполнения функций репликации (1 на главном сервере и два на подчиненном сервере). Когда выдается START SLAVE, подчиненный сервер создает поток ввода-вывода для подключения к главному серверу и позволяет главному серверу отправлять двоичные данные. log Главный сервер создает поток для отправки содержимого двоичного журнала на подчиненный сервер. Поток ввода-вывода подчиненного сервера считывает содержимое, отправленное потоком дампа Binlog главного сервера, и копирует данные в локальный файл на подчиненном сервере. каталог данных сервера, то есть журнал ретрансляции. Третий поток — это поток SQL. Подчиненный сервер использует этот поток для чтения журнала ретрансляции и выполнения обновлений, содержащихся в журнале, для запроса репликации, произошедшей на главном сервере, и Информация о подчиненном сервере.
В журнале ретрансляции по умолчанию используется имя файла в формате имя_хоста-реле-bin.nnnnnn, где имя_хоста — это имя хоста подчиненного сервера, а nnnnnn — порядковый номер. Создайте последовательные файлы журнала ретрансляции с последовательными порядковыми номерами, начиная с них. с номером 000001. Отслеживайте индексный файл журнала ретрансляции, чтобы определить используемый в данный момент файл журнала ретрансляции. Индексный файл журнала ретрансляции по умолчанию называется имя_хоста-реле-bin.index. По умолчанию эти файлы создаются в каталоге данных подчиненного сервера. имеет тот же формат, что и двоичный журнал, и его можно прочитать с помощью mysqlbinlog. Когда поток SQL выполнит все события в журнале ретрансляции, журнал ретрансляции будет автоматически удален
с сервера, а в каталоге данных будут созданы два дополнительных файла состояния.
.--master.info и relay-log.info. Файлы состояния сохраняются на жестком диске и не теряются при выключении подчиненного сервера. При следующем запуске подчиненного сервера эти файлы считываются, чтобы определить количество двоичных файлов. он прочитал журналы главного сервера и степень, в которой они обрабатывают свои собственные журналы ретрансляции.
Чтобы настроить репликацию главный-подчиненный:
1. Убедитесь, что версии MySQL, установленные на главном сервере и подчиненном сервере, одинаковы. и желательно последняя стабильная версия MySQL
на главном сервере. Репликация устанавливает учетную запись подключения. Этой учетной записи должно быть предоставлено разрешение REPLICATION SLAVE. Если учетная запись используется только для репликации (рекомендуется), никаких других разрешений предоставлять не нужно
. GRANT REPLICATION SLAVE ON *.*
-> TO 'replication' @'%.yourdomain.com' IDENTIFIED BY 'slavepass'
3. Выполните оператор FLUSH TABLES With READ LOCK, чтобы очистить все таблицы и заблокировать операторы записи:
mysql> FLUSH; ТАБЛИЦЫ С БЛОКИРОВКОЙ ЧТЕНИЯ;
не позволяют клиентской программе MySQL завершить работу. Терминал делает снимок основного каталога данных сервера.
shell> cd /usr/local/mysql/
shell> tar -cvf /tmp/mysql-snapshot.tar ./data
Если учетная запись пользователя подчиненного сервера отличается от учетной записи главного сервера, возможно, вы не захотите копировать база данных MySQL. В этом случае базу данных следует исключить из архива. Вам также не нужно включать в архив какие-либо файлы журналов или файлы master.info или Relay-log.info.
Когда блокировка чтения, установленная FLUSH TABLES With READ LOCK, действительна (т. е. клиентская программа mysql не завершается), прочитайте текущее имя двоичного журнала и значение смещения на главном сервере:
mysql > SHOW MASTER STATUS
+---; --- ---------+----------+--------------+----------- --- ----+
| Позиция | Binlog_Do_DB | Binlog_Ignore_DB
+--------------+----------+----- --- ------+------------------+
| mysql-bin.003 | тест | руководство,mysql
| --- -------+----------+--------------+------------- --- --+
В столбце «Файл» отображается имя журнала, а в столбце «Позиция» отображается смещение. В этом примере значение двоичного журнала — mysql-bin.003 со смещением 73. Запишите это значение. Эти значения понадобятся позже при настройке подчиненного сервера. Они представляют собой координаты репликации, с которых ведомый должен запускать новые обновления от ведущего.
Если --logs-bin не включен, когда главный сервер работает, имя журнала и значения местоположения, отображаемые SHOW MASTER STATUS, пусты. В этом случае значения, которые необходимо использовать при указании файла журнала и местоположении подчиненного сервера в дальнейшем, — это пустые строки ('') и 4.
После создания снимка и записи имени журнала и смещения верните к предыдущему среднему концу и перезапустите. Включите запись:
mysql> UNLOCK TABLES
4. Убедитесь, что раздел [mysqld] файла my.cnf на узле главного сервера включает опцию log-bin; В этом разделе также должен быть параметр server-id=Master_id, где master_id должен быть положительным целым числом от 1 до 232–1. Например:
[mysqld]
log-bin
server-id=1
Если эти параметры не указаны, вам следует добавить их и перезапустить сервер.
5. Остановите службу mysqld на подчиненном сервере и добавьте в его файл my.cnf следующую строку:
[mysqld]
server-id=2
Значение «slave_id» совпадает со значением «Master_id» и должно быть положительным целым числом от 1 до 232. –1. Кроме того, идентификатор подчиненного сервера должен отличаться от идентификатора главного сервера.
6. Сохраните данные в резервной папке. Убедитесь, что права доступа к этим файлам и каталогам правильные. Пользователь, под которым работает сервер MySQL, должен иметь возможность читать и записывать файлы, как и на главном сервере.
Shell> chown -R mysql:mysql /usr/local/mysql/data
7. Запустите подчиненный сервер. Выполните следующий оператор на подчиненном сервере, заменив значения параметров фактическими значениями для вашей системы:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
8. Запустите поток подчиненного сервера:
mysql> START SLAVE;
После выполнения этих процедур подчиненный сервер должен подключиться к главному серверу и дополнить его. обновления, произошедшие с момента создания моментального снимка.
9. Если произойдет ошибка репликации, сообщение об ошибке также появится в журнале ошибок (HOSTNAME.err) подчиненного сервера.
10. При копировании с сервера файлы master.info и HOSTNAME-relay-log.info будут найдены в его каталоге данных. Ведомое устройство использует эти два файла для отслеживания того, какая часть двоичного журнала ведущего устройства была обработана. Не удаляйте и не редактируйте эти файлы, если вы точно не знаете, что делаете, и полностью не понимаете их значение. Несмотря на это, лучше использовать оператор CHANGE MASTER TO.