Репликация MySQL master-slave Docker

Репликация Docker master slave mysql может быть немного пугающей, но основы на самом деле довольно просты, всего лишь немного кропотливой работы. В этом примере я буду использовать Docker Swarm. для этого я предполагаю, что у вас уже установлен новый докер на машине. В моем примере используется CentOS 7.6, но он должен быть аналогичен другим системам, таким как Ubuntu. Наслаждайтесь постом!

Примечание: этот пост был первоначально опубликован на мой личный блог.

Получите образ mysql:

docker pull percona:5.7
  1. Две отдельные папки для master и slave.
  2. Каталог cnf содержит файлы конфигурации для mysql.
  3. Каталог данных имеет объем структурных данных mysql.
  4. Папки mysql, performance schema и sys НЕ ДОЛЖНЫ создаваться. это делается сервером MySQL при запуске.

Проверьте первое изображение в сообщении, чтобы понять это.

Создайте файлы роя докеров.

Я использую docker swarm, потому что это очень просто, но следующие несколько шагов, по сути, предназначены для создания контейнеров и их запуска. Аналогично работают и другие системы оркестрации. Если вы хотите использовать Kubernetes (k8s) и кластер высокой доступности, вам понадобится что-то вроде этой статьи от моего друга Алекса о «Как развернуть кластер Kubernetes HA».

Инициализировать рой докеров:

docker swarm init --advertise-addr=10.15.0.6

Присоединиться к роевому кластеру:

docker swarm join --token \
SWMTKN-1-3c32m8jq5epyaoo711b1beb2sirqgawhw98xd1jhua1c4jaqq9-1t44577d2t22snqnitujl8taf \
10.15.0.6:2377

Создайте конфигурационные файлы MySQL для ведущего и ведомого устройств:

Здесь добавьте этот файл: /opt/scripts/masterdb/cnf/master.cnf

[mysqld]
server-id=1
binlog_format=ROW
log-bin

Затем сделайте то же самое для ведомого здесь: /opt/scripts/slavedb/cnf/slave.cnf

[mysqld]
server-id=2

Создайте yml-файл docker swarm:

version: '3.2'

services:

  db_master:

    image: percona

    environment:

      MYSQL_ROOT_PASSWORD: examplei123!

    volumes:

      - /opt/scripts/masterdb/data:/var/lib/mysql

      - /opt/scripts/masterdb/cnf/master.cnf:/etc/my.cnf.d/master.cnf

  db_slave:

    image: percona

    environment:

      MYSQL_ROOT_PASSWORD: examplei123!

    volumes:

      - /opt/scripts/slavedb/data:/var/lib/mysql

      - /opt/scripts/slavedb/cnf/slave.cnf:/etc/my.cnf.d/slave.cnf

Запустите стек:

# docker stack deploy -c docker-master-slave.yml dbs

Creating network dbs_default

Creating service dbs_db_master

Creating service dbs_db_slave

#
# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8f5954413422 percona:latest "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 3306/tcp dbs_db_master.1.o95296xfp17d83c7rhb67s334

96157a26d449 percona:latest "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 3306/tcp dbs_db_slave.1.jpqgijiyvxbz3ymts1qwfwmwb

Теперь у нас есть контейнеры. Поработаем над репликацией.

Уведомление: Вам не нужно, если он работает, но вы можете остановить стек с помощью:

docker stack rm dbs

Создайте пользователя репликации на мастере:

Уведомление: символ «\» введен для перехода к строке, которую вы можете преобразовать в одну строку, если команда не работает для вас.

[root@srv-docker-db1 scripts]# docker exec -ti 18776ab98a0f 'mysql' -uroot -pd \
-vvv -e"GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'slavepass123'\G"

mysql: [Warning] Using a password on the command line interface can be insecure.

--------------

GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'slavepass123'

--------------

Query OK, 0 rows affected, 1 warning (0.00 sec)

Bye

[root@srv-docker-db1 scripts]#

Проверьте, работает ли:

# docker exec -it 8f5954413422 sh

sh-4.2$ mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.7.24-26 Percona Server (GPL), Release 26, Revision c8fe767

Copyright (c) 2009-2018 Percona LLC and/or its affiliates

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show grants for repl@'%';

+----------------------------------------------+

| Grants for repl@% |

+----------------------------------------------+

| GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' |

+----------------------------------------------+

1 row in set (0.00 sec)

mysql>

**As you see the user exists on master and has replication privileges.

Показать позицию двоичных журналов для репликации на ведомое устройство:

# docker exec -ti dbs_db_master.1.ndu3zg45si7o73pia77nryw9a 'db_master' -uroot -pexamplei123! -e "SHOW MASTER STATUS\G"

mysql: [Warning] Using a password on the command line interface can be insecure.

***************************1. row***************************
File: 3a34be5b7f9b-bin.000001
Position: 154

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:
    1. На этом этапе я также создал и очистил БД на мастере, чтобы вы увидели разницу после запуска репликации:
      слово-изображение-5.png

Настройте репликацию в соответствии с выводом мастера:

Можно сделать с хоста вне мастера следующим образом:

docker exec -ti slavedb 'db_master' -uroot -pmysecretpass -e'change master \ 
to master_host="mysql",master_user="repl", \
master_password="slavepass",master_log_file="mysqld-bin.000004", \ 
master_log_pos=310;"' -vvv

Или войдите в подчиненное устройство и выполните:

change master to master_host="db_master",master_user="repl", \
master_password="slavepass123",master_log_file="3a34be5b7f9b-bin.000001", \
master_log_pos=154;

Запустите подчиненную репликацию

START SLAVE;

Если после этого все шаги прошли хорошо, вы сможете увидеть статус репликации:

mysql> show slave status\G

***************************1. row***************************

Slave_IO_State: Waiting for master to send event

Master_Host: db_master

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: 3a34be5b7f9b-bin.000001

Read_Master_Log_Pos: 154

Relay_Log_File: 089eecce4162-relay-bin.000002

Relay_Log_Pos: 327

Relay_Master_Log_File: 3a34be5b7f9b-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

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: 154

Relay_Log_Space: 541

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: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: c67dabf3-fcea-11e8-8f31-02420a000103

Master_Info_File: /var/lib/mysql/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

mysql>

Убедитесь, что все работает

Затем мы закончили, но нам нужно убедиться, что это работает, для этого нам просто нужно создать что-то на главном устройстве, и это должно быть реплицировано на подчиненное устройство:

    1. Во-первых, помните, что в элементе (Показать позицию двоичных журналов для репликации на ведомое устройство) мы создали фиктивную базу данных на главном сервере. Если вы проверите сейчас, он не реплицировался в раб. Такое поведение ожидаемо.
      слово-изображение-6.png
    2. Итак, давайте попробуем снова создать еще одну БД на мастере, назовем ее «replicate_this». Для этого выполните это на мастере:

mysql> создать базу данных replicate_this;

    1. Если репликация работает должным образом, эта БД должна быть создана на ведомом устройстве следующим образом:
      слово-изображение-7.png

Вывод:

    1. Нам удалось создать простой пример репликации Percona MySQL 5.7.
    2. Все делалось с помощью докер-контейнеров.
    3. Это упрощенная версия, и ее не следует использовать в производственной среде.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *