: | : |
‹ | › | |||||
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
2018-03-19 09:47:17 4416 1
Настройка Master-Slave репликации Mysql
MySQL репликация типа Master-Slave часто используется для обеспечения отказоустойчивости приложений. Кроме этого, она позволяет распределить нагрузку на базу данных между несколькими серверами
Настройка будеи производится на двух серверах с операциооной системой Ubuntu16.04. Master - mysql-node1(10.25.128.116), Slave - mysql-node2(10.25.128.149)
Настройка Master сервера
Устанавливаем mysql
root@mysql-node1:~# apt-get install mysql-server mysql-client
Задаем пароль администратора СУБД

Запускаем скрипт первоначальной настройки Mysql
root@mysql-node1:~# mysql_secure_installation
Securing the MySQL server deployment. -----Вводим пароль администратора Enter password for user root: VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin? -----Оставляем пароль администратора без извениний Press y|Y for Yes, any other key for No: Using existing password for root. Change the password for root?((Press y|Y for Yes, any other key for No): no ... skipping. By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. ----- Удаляем ананимных пользователей Remove anonymous users? (Press y|Y for Yes, any other key for No): y Success. Normally, root should only be allowed to connect from "localhost". This ensures that someone cannot guess at the root password from the network. ----- Отключаем возможность подключаения под пользователем root удаленно Disallow root login remotely? (Press y|Y for Yes, any other key for No): y Success. By default, MySQL comes with a database named "test" that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. ------Удаляем тестовую базу данных Remove test database and access to it? (Press y|Y for Yes, any other key for No): y - Dropping test database... Success. - Removing privileges on test database... Success. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. ------Перезапуск привелегий Reload privilege tables now? (Press y|Y for Yes, any other key for No): y Success. All done!
Переходим к настройке Master сервера
Создадим базу и таблицу в этой базе
Подключаемся к СУБД под пользователем root
root@mysql-node1:~# mysql -u root -p
Создаем базу:
mysql> CREATE DATABASE repdb; Query OK, 1 row affected (0.00 sec)
Переходим в созданную базу:
mysql> USE repdb Database changed
Создаем таблицу:
mysql> CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, name VARCHAR(255), age VARCHAR(10), role VARCHAR(100)); Query OK, 0 rows affected (0.26 sec)
Добавим несколько записей в эту таблицу:
mysql> INSERT INTO users (name,age,role) VALUES ("Alexei", 30, "admin"); Query OK, 1 row affected (0.04 sec)
Добавим еще некоторое количество и получаем такую таблицу:
mysql> SELECT * FROM users; +----+--------+------+-------+ | id | name | age | role | +----+--------+------+-------+ | 1 | Alexei | 30 | admin | | 2 | Petya | 20 | user | | 3 | Ivan | 40 | boss | +----+--------+------+-------+
Переходим в файл настроек /etc/mysql/mysql.conf.d/mysqld.cnf и прописываем следующие директивы:
root@mysql-node1:~# vim /etc/mysql/mysql.conf.d/mysqld.cnf
... # На каких сетевых адресах ожидать подключения, ставим все bind-address = 0.0.0.0 # Id сервера, произвольное число server-id = 1 # путь к бинарному лог-файлу log_bin = /var/log/mysql/mysql-bin.log #Имя базы, которую будем реплицировать binlog_do_db = repdb ...
Перезапускаем Mysql
root@mysql-node1:~# systemctl restart mysql
Теперь необходимо создать пользователя с правами на репликацию
Подключаемся к СУБД
root@mysql-node1:~# mysql -u root -p
Создаем пользователя:
mysql> GRANT REPLICATION SLAVE ON *.* TO "slave_user"@"%" IDENTIFIED BY "1234567"; Query OK, 0 rows affected, 1 warning (0.04 sec)
Создаем пользователя slave_user с правами на slave репликацию на все базу данных, который может подключаться с луюого хоста. Пароль - 1234567
Обновляем привелегии:
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.04 sec)
Блокируем все таблицы в нашей базе:
mysql> USE repdb Database changed mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec)
Проверяем статус Master:
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 595 | repdb | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)>
Колонки "File" и "Postion" мы будем использовать при запуске Slave-севрера.
Теперь необходимо сделать Дамп базы, что бы перенести ее на Slave-сервер, выходим из консоли СУБД и выполняем команду:
root@mysql-node1:~# mysqldump -u root -p repdb > /tmp/repdb.sql
Был созздан файл /tmp/repdb.sql, который содержит Дамп базы repdb
Теперь снова подключаемся к СУБД и разблокируем таблицы
root@mysql-node1:~# mysql -u root -p
mysql> USE repdb Database changed mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec)
Настройка Slave-сервера
Выполняем теже операции по установке СУБД Mysql
Подключаемся к СУБД и создаем пустую базу repdb
root@mysql-node2:~# mysql -u root -p
mysql> CREATE DATABASE repdb; Query OK, 1 row affected (0.00 sec)
Выходим из консоли СУБД, переносим на Slave-сервер файл с Дампом базу с Master-севрера, например с помощью scp (только предварительно надо настроить ssh-сервер)
root@mysql-node2:~# scp root@10.25.128.116:/tmp/repdb.sql /tmp/ root@10.25.128.116"s password: repdb.sql 100% 2030 2.0KB/s 00:01
теперь загружаем Дамп.
root@mysql-node2:~# mysql -u root -p repdb < /tmp/repdb.sql
Далее переходим к настройке самого СУБД, идем в файл /etc/mysql/mysql.conf.d/mysqld.cnf и правим там директивы
root@mysql-node2:~# vim /etc/mysql/mysql.conf.d/mysqld.cnf
... # Указываем отличный от Master-сервера ID server-id = 2 # Путь к relay лог-файлу relay-log = /var/log/mysql/mysql-relay-bin.log # Путь к лог-файлу на Master-сервере log_bin = /var/log/mysql/mysql-bin.log # База для реплики binlog_do_db = repdb ...
Перезапускаем сервер
root@mysql-node2:~# systemctl restart mysql
Теперь необходимо включить репликацию, заходим в консоль СУБД и выполняем команду
root@mysql-node2:~# mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST = "10.25.128.116", MASTER_USER = "slave_user", MASTER_PASSWORD = "1234567", MASTER_LOG_FILE = "mysql-bin.000001", MASTER_LOG_POS = 595; Query OK, 0 rows affected, 2 warnings (0.41 sec)
Где указываем ip-адрес Master-сервера, имя и пароль пользователя для репликации, и данные из ответа команды "SHOW MASTER STATUS", которую выполняли на Master-сервере ранее (File,Position)
Запускаем репликацию на Slave:
mysql> START SLAVE; Query OK, 0 rows affected (0.03 sec)
Проверяем статус репликации:
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.25.128.116 Master_User: slave_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 154 Relay_Log_File: mysql-relay-bin.000007 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000003 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: 527 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: e3eca077-1d30-11e8-a190-00163e54223e 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)
Все хорошо, теперь проверим работу репликации, добавим на Master-сервере запись в таблицу, а потом проверим появится ли она на Slave
mysql> INSERT INTO users (name,age,role) VALUES ("NEW USER", "99", "test"); Query OK, 1 row affected (0.09 sec)
Теперь переходим на Slave сервер и делаем запрос SELECT на таблицу и видим, что запись сделанная на Mastere появилась и на Slave
mysql> SELECT * FROM users; +----+----------+------+-------+ | id | name | age | role | +----+----------+------+-------+ | 1 | Alexei | 30 | admin | | 2 | Petya | 20 | user | | 3 | Ivan | 40 | boss | | 4 | NEW USER | 99 | test | +----+----------+------+-------+ 4 rows in set (0.00 sec)
Теперь мы сохраним нашу базу в случае падения Mastera или сможем сбалансировать запросы на чтение на оба сервера.
Введите ответ:
+
=
Игорь
2020-02-13 12:57:09
Отличная статья! Думаю, было бы не лишним про версию mysql сказать. И про GTID, SBR/RBR/mixed