Основы репликации MySQL

MySQLBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите основы репликации MySQL. Репликация — это процесс, который позволяет поддерживать копии базы данных MySQL на нескольких серверах. Это часто используется для балансировки нагрузки, резервного копирования данных и обеспечения высокой доступности.

Вы будете использовать Docker для создания реалистичной настройки репликации master-slave с двумя отдельными контейнерами MySQL. Сначала вы запустите и проверите контейнер master, который предварительно настроен с включенным бинарным логированием. Вы создадите специального пользователя репликации на master. Затем вы настроите второй контейнер для работы в качестве slave, подключите его к master и проверите правильность синхронизации данных. Такой практический подход поможет вам понять ключевые шаги, связанные с управлением реальной средой репликации MySQL.

Настройка среды Docker

На этом первом этапе вы настроите необходимые контейнеры Docker для среды репликации master-slave. Вы создадите выделенную сеть и запустите два контейнера MySQL.

  1. Создание сети Docker:

    Выделенная сеть позволяет контейнерам общаться друг с другом по имени. Создайте сеть с именем mysql-net.

    docker network create mysql-net
  2. Запуск контейнера 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
  3. Запуск контейнера 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
  4. Ожидание инициализации контейнеров:

    Контейнерам MySQL требуется некоторое время для инициализации. Подождите около 15 секунд, чтобы проверить, запущены ли контейнеры.

    docker ps
    CONTAINER 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 и проверим его конфигурацию.

  1. Подключение к контейнеру Master:

    Используйте команду docker exec, чтобы открыть оболочку MySQL внутри контейнера mysql-master. Вам будет предложено ввести пароль, который — lab_password.

    docker exec -it mysql-master mysql -uroot -plab_password
  2. Проверка бинарного логирования и идентификатора сервера:

    Как только вы увидите приглашение 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 для чтения бинарного лога. В целях безопасности лучшей практикой является создание выделенной учетной записи пользователя для этой цели с ограниченными привилегиями. На этом шаге вы создадите пользователя для репликации и заполните тестовую базу данных, чтобы наблюдать за работой репликации.

  1. Подключение к серверу Master:

    Откройте оболочку MySQL внутри контейнера mysql-master.

    docker exec -it mysql-master mysql -uroot -plab_password
  2. Создание пользователя для репликации:

    В приглашении mysql> выполните следующую команду, чтобы создать пользователя с именем repl_user и паролем repl_password. Этот пользователь будет использоваться slave для подключения. Мы используем '@'%', чтобы разрешить пользователю подключаться с любого хоста, включая наш контейнер slave в сети Docker.

    CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
  3. Предоставление привилегий репликации:

    Новому пользователю требуются привилегии REPLICATION SLAVE, которые позволяют ему читать бинарные логи с master.

    GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';

    После предоставления привилегий перезагрузите таблицы привилегий, чтобы немедленно применить изменения.

    FLUSH PRIVILEGES;
  4. Проверка статуса бинарного лога 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)
  5. Создание тестовой таблицы и данных:

    База данных 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, откуда начинать репликацию.

  1. Подключение к контейнеру Slave:

    Сначала откройте оболочку MySQL внутри контейнера mysql-slave.

    docker exec -it mysql-slave mysql -uroot -plab_password
  2. Настройка подключения 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.

  3. Запуск потоков Slave:

    Наконец, запустите процесс репликации, выполнив команду START SLAVE. Это запустит два потока: поток I/O, который получает бинарные логи с master, и поток SQL, который выполняет события из логов.

    START SLAVE;

    Теперь вы можете выйти из оболочки MySQL.

    exit;

Slave теперь настроен и должен пытаться подключиться к master и реплицировать данные.

Проверка репликации

После запуска slave финальным шагом является проверка корректности работы репликации. Вы проверите статус slave и убедитесь, что данные с master были скопированы.

  1. Подключение к серверу Slave:

    Откройте оболочку MySQL в контейнере mysql-slave.

    docker exec -it mysql-slave mysql -uroot -plab_password
  2. Проверка статуса 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
    ...
  3. Проверка реплицированных данных:

    Теперь проверьте, были ли база данных 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.