Введение
В этой лабораторной работе вы изучите основы репликации MySQL. Репликация — это процесс, который позволяет поддерживать копии базы данных MySQL на нескольких серверах. Это часто используется для балансировки нагрузки, резервного копирования данных и обеспечения высокой доступности.
Вы будете использовать Docker для создания реалистичной настройки репликации master-slave с двумя отдельными контейнерами MySQL. Сначала вы запустите и проверите контейнер master, который предварительно настроен с включенным бинарным логированием. Вы создадите специального пользователя репликации на master. Затем вы настроите второй контейнер для работы в качестве slave, подключите его к master и проверите правильность синхронизации данных. Такой практический подход поможет вам понять ключевые шаги, связанные с управлением реальной средой репликации MySQL.
Настройка среды Docker
На этом первом этапе вы настроите необходимые контейнеры Docker для среды репликации master-slave. Вы создадите выделенную сеть и запустите два контейнера MySQL.
Создание сети Docker:
Выделенная сеть позволяет контейнерам общаться друг с другом по имени. Создайте сеть с именем
mysql-net.docker network create mysql-netЗапуск контейнера Master MySQL:
Далее запустите контейнер master. Эта команда использует образ
mysql:5.7и конфигурирует его с идентификатором сервера (server ID) 1, а также включает бинарное логирование (binary logging) для базы данныхreplication_db.docker run -d \ --name mysql-master \ --network mysql-net \ -e MYSQL_ROOT_PASSWORD=lab_password \ -e MYSQL_DATABASE=replication_db \ mysql:5.7 \ mysqld --server-id=1 --log-bin=mysql-bin --binlog-do-db=replication_dbЗапуск контейнера Slave MySQL:
Теперь запустите контейнер slave. Этот контейнер также находится в той же сети и сконфигурирован с идентификатором сервера (server ID) 2. Мы также заранее создаем базу данных
replication_db, чтобы slave мог корректно применять изменения от master.docker run -d \ --name mysql-slave \ --network mysql-net \ -e MYSQL_ROOT_PASSWORD=lab_password \ -e MYSQL_DATABASE=replication_db \ mysql:5.7 \ mysqld --server-id=2 --relay-log=mysql-relay-bin --log-slave-updates=1Ожидание инициализации контейнеров:
Контейнерам MySQL требуется некоторое время для инициализации. Подождите около 15 секунд, чтобы проверить, запущены ли контейнеры.
docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfe8c98d2ad0 mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-slave fc125bf293ea mysql:5.7 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp mysql-master
Теперь, когда ваша среда настроена, вы можете перейти к настройке сервера master.
Проверка конфигурации сервера Master
Теперь, когда контейнеры запущены, следующим шагом является проверка правильности настройки сервера master для репликации. Основная задача master — записывать все изменения базы данных в свой бинарный лог (binary log), который slave будет читать позже.
Сначала откройте терминал на вашем рабочем столе.
Сейчас мы подключимся к контейнеру master и проверим его конфигурацию.
Подключение к контейнеру Master:
Используйте команду
docker exec, чтобы открыть оболочку MySQL внутри контейнераmysql-master. Вам будет предложено ввести пароль, который —lab_password.docker exec -it mysql-master mysql -uroot -plab_passwordПроверка бинарного логирования и идентификатора сервера:
Как только вы увидите приглашение
mysql>, выполните следующие команды, чтобы убедиться, что бинарное логирование включено, а идентификатор сервера установлен правильно.SHOW VARIABLES LIKE 'log_bin';Вывод должен показать, что
log_binустановлен вON.+---------------+----+ | Variable_name | Value | +---------------+----+ | log_bin | ON | +---------------+----+ 1 row in set (0.01 sec)Далее проверьте идентификатор сервера.
SHOW VARIABLES LIKE 'server_id';Вывод должен показать, что
server_idустановлен в1.+---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+ 1 row in set (0.00 sec)Теперь, когда вы проверили конфигурацию, вы можете выйти из оболочки MySQL.
exit;
Вы успешно подтвердили, что сервер master готов к репликации.
Создание пользователя для репликации и тестовой базы данных
Сервер slave должен подключаться к master для чтения бинарного лога. В целях безопасности лучшей практикой является создание выделенной учетной записи пользователя для этой цели с ограниченными привилегиями. На этом шаге вы создадите пользователя для репликации и заполните тестовую базу данных, чтобы наблюдать за работой репликации.
Подключение к серверу Master:
Откройте оболочку MySQL внутри контейнера
mysql-master.docker exec -it mysql-master mysql -uroot -plab_passwordСоздание пользователя для репликации:
В приглашении
mysql>выполните следующую команду, чтобы создать пользователя с именемrepl_userи паролемrepl_password. Этот пользователь будет использоваться slave для подключения. Мы используем'@'%', чтобы разрешить пользователю подключаться с любого хоста, включая наш контейнер slave в сети Docker.CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';Предоставление привилегий репликации:
Новому пользователю требуются привилегии
REPLICATION SLAVE, которые позволяют ему читать бинарные логи с master.GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';После предоставления привилегий перезагрузите таблицы привилегий, чтобы немедленно применить изменения.
FLUSH PRIVILEGES;Проверка статуса бинарного лога Master:
Перед настройкой slave вам необходимо знать точные координаты в бинарном логе master, с которых slave должен начать репликацию. Команда
SHOW MASTER STATUSпредоставляет эту информацию.SHOW MASTER STATUS;Вывод будет выглядеть примерно так. Запишите значения
FileиPosition, так как они понадобятся вам на следующем шаге.+------------------+----------+------------------+--------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+------------------+--------------------+-------------------+ | mysql-bin.000001 | 337 | replication_db | | | +------------------+----------+------------------+--------------------+-------------------+ 1 row in set (0.00 sec)Создание тестовой таблицы и данных:
База данных
replication_dbбыла создана при запуске контейнера. Давайте создадим таблицу и вставим некоторые данные для тестирования репликации.USE replication_db; CREATE TABLE messages ( id INT PRIMARY KEY AUTO_INCREMENT, content VARCHAR(255) ); INSERT INTO messages (content) VALUES ('Hello from the master!');Вы можете проверить, были ли данные вставлены корректно.
SELECT * FROM messages;Вы должны увидеть строку, которую только что вставили.
+----+------------------------+ | id | content | +----+------------------------+ | 1 | Hello from the master! | +----+------------------------+ 1 row in set (0.00 sec)Теперь выйдите из оболочки MySQL.
exit;
Вы подготовили сервер master, создав пользователя для репликации и некоторые тестовые данные.
Настройка и запуск сервера Slave
Теперь, когда master готов, вы настроите контейнер slave. На этом шаге вы используете координаты бинарного лога, которые вы записали с master на Шаге 3, чтобы указать slave, откуда начинать репликацию.
Подключение к контейнеру Slave:
Сначала откройте оболочку MySQL внутри контейнера
mysql-slave.docker exec -it mysql-slave mysql -uroot -plab_passwordНастройка подключения Slave к Master:
Теперь вы используете команду
CHANGE MASTER TOдля настройки параметров репликации. Используйте значенияFileиPosition, которые вы записали изSHOW MASTER STATUSна Шаге 3.MASTER_HOST— это'mysql-master', что работает, поскольку оба контейнера находятся в одной сети Docker.Примечание: Замените
mysql-bin.000001и номер позиции на фактические значения, которые вы записали на Шаге 3. Если у вас нет этих значений, вы можете выполнитьdocker exec mysql-master mysql -uroot -plab_password -e "SHOW MASTER STATUS;"в новом терминале, чтобы получить их.CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=337;Эта команда настраивает slave со всей необходимой информацией для подключения к master.
Запуск потоков Slave:
Наконец, запустите процесс репликации, выполнив команду
START SLAVE. Это запустит два потока: поток I/O, который получает бинарные логи с master, и поток SQL, который выполняет события из логов.START SLAVE;Теперь вы можете выйти из оболочки MySQL.
exit;
Slave теперь настроен и должен пытаться подключиться к master и реплицировать данные.
Проверка репликации
После запуска slave финальным шагом является проверка корректности работы репликации. Вы проверите статус slave и убедитесь, что данные с master были скопированы.
Подключение к серверу Slave:
Откройте оболочку MySQL в контейнере
mysql-slave.docker exec -it mysql-slave mysql -uroot -plab_passwordПроверка статуса Slave:
Наиболее важной командой для мониторинга репликации является
SHOW SLAVE STATUS. Модификатор\Gформатирует вывод вертикально, что значительно облегчает чтение.SHOW SLAVE STATUS\GНайдите в выводе следующие две строки. Обе должны иметь значение
Yes.Slave_IO_Running: Yes: Это подтверждает, что slave успешно подключен к master и получает данные бинарного лога.Slave_SQL_Running: Yes: Это подтверждает, что slave успешно выполняет события из бинарного лога.
Еще одним важным полем является
Seconds_Behind_Master. Значение0указывает на то, что slave полностью синхронизирован с master.Рабочий статус будет выглядеть примерно так (некоторые значения могут отличаться):
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: mysql-master Master_User: repl_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 529 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 699 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes ... Seconds_Behind_Master: 0 ...Проверка реплицированных данных:
Теперь проверьте, были ли база данных
replication_dbи ее данные скопированы с master.SHOW DATABASES;В списке вы должны увидеть
replication_db.+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | replication_db | | sys | +--------------------+Переключитесь на базу данных и выполните запрос к таблице
messages.USE replication_db; SELECT * FROM messages;Данные, которые вы вставили на master, теперь должны присутствовать на slave.
+----+------------------------+ | id | content | +----+------------------------+ | 1 | Hello from the master! | +----+------------------------+ 1 row in set (0.00 sec)Это подтверждает корректность работы репликации. Теперь вы можете выйти из оболочки MySQL.
exit;
Вы успешно настроили и проверили базовую среду репликации master-slave MySQL с использованием Docker.
Резюме
В этой лабораторной работе вы изучили основные шаги по настройке репликации MySQL master-slave с использованием Docker. Вы начали с создания двух отдельных контейнеров MySQL, один для master, другой для slave, объединенных сетью Docker. Вы проверили конфигурацию master, которая включала включенный бинарный лог и уникальный идентификатор сервера. Затем вы создали выделенного пользователя для репликации на master для безопасного соединения. После подготовки master вы настроили контейнер slave с помощью команды CHANGE MASTER TO для установки соединения с координатами бинарного лога master. Наконец, вы проверили успешность репликации, проверив статус slave с помощью SHOW SLAVE STATUS и подтвердив, что тестовые данные были корректно синхронизированы. Эта лабораторная работа предоставила вам необходимые навыки для настройки, управления и проверки реальной конфигурации репликации MySQL.



