Кластер для БД. master-slave и master-master

Thank you for reading this post, don't forget to subscribe!

Настрой­ка кла­сте­ра пока­за­на на при­ме­ре систе­мы Linux CentOS 7 и MariaDB 5.

1. Master - Slave

Для нача­ла настро­им кла­стер Master - Slave (репли­ка­ция в одном направлении).

На обо­их сер­ве­рах сра­зу зай­дем под поль­зо­ва­те­лем root для более удоб­ной работы:

$ sudo su

Так­же на обо­их сер­ве­рах откро­ем порт 3306, на кото­ром рабо­та­ет сер­вер базы данных:

Теперь на пер­вом сер­ве­ре откро­ем на редак­ти­ро­ва­ние кон­фи­гу­ра­ци­он­ный файл MariaDB:

# vi /etc/my.cnf.d/server.cnf

и при­ве­дем его к сле­ду­ю­ще­му виду:

[mysqld]
server-id = 1
log_bin = mysql-bin
log_error = mysql-bin.err
binlog_ignore_db = information_schema,mysql,test

*  server-id: иден­ти­фи­ка­тор сер­ве­ра, для каж­дой ноды кла­сте­ра дол­жен быть свой. log_bin: имя бинар­но­го лог-фай­ла. log_error: имя лог-фай­ла с ошиб­ка­ми. binlog_ignore_db: пере­чис­ле­ние баз дан­ных, для кото­рых не выпол­нять репли­ка­цию (в дан­ном при­ме­ре, исклю­че­ны слу­жеб­ных базы).

Пере­за­гру­жа­ем сер­вис, что­бы изме­не­ния всту­пи­ли в силу:

# systemctl restart mariadb

Под­клю­ча­ем­ся к MariaDB под учет­ной запи­сью root:

# mysql -uroot -p

 

И созда­ем слу­жеб­ную учет­ную запись для репликации:

MariaDB [(none)]> GRANT replication slave ON *.* TO "replmy"@"192.168.1.156" IDENTIFIED BY "password";

replmy: имя учет­ной запи­си (мож­но исполь­зо­вать любое). 192.168.1.156: IP-адрес вто­ро­го сер­ве­ра, с кото­рым будем реп­ли­ци­ро­вать дан­ные. password: пароль для учет­ной запи­си (жела­тель­но, сложный).

 

Бло­ки­ру­ем все таб­ли­цы всех баз для чте­ния и записи:

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;

* само собой, это при­ве­дет к про­стою в рабо­те. Поэто­му, если сер­вер уже исполь­зу­ет­ся, луч­ше это сде­лать в нера­бо­чее время.

 

Выве­ди­те состо­я­ние рабо­ты СУРБД:

MariaDB [(none)]> show master status\G

Резуль­тат будет, при­мер­но, таким:

            File: mysql-bin.000005
Position: 404
Binlog_Do_DB:
Binlog_Ignore_DB: information_schema,mysql

 

Запом­ни­те или запи­ши­те зна­че­ния для File и Position. Они пона­до­бят­ся при настрой­ке вто­рич­ной ноды кластера.

Если в MariaDB уже есть рабо­чие базы, выхо­дим из оболочки:

MariaDB [(none)]> \q

 

и дела­ем резерв­ную копию всех баз:

mysqldump -uroot -p --databases db1 db2 > /tmp/mydb_dump.sql

* дан­ная коман­да сде­ла­ет дамп баз db1, db2 и сохра­нит его в файл /tmp/mydb_dump.sql.

 

Теперь сно­ва под­клю­ча­ем­ся к MariaDB:

# mysql -uroot -p

 

и сни­мем ранее уста­нов­лен­ные блокировки:

MariaDB [(none)]> SET GLOBAL read_only = OFF;

и отклю­чим­ся от СУРБД:

MariaDB [(none)]> \q

 

Полу­чен­ный файл с резерв­ной копи­ей нуж­но пере­не­сти на вто­рой сер­вер, напри­мер, при помо­щи такой команды:

scp /tmp/mydb_dump.sql test@192.168.1.156:/tmp

* в дан­ном при­ме­ре, мы ско­пи­ру­ем файл /tmp/mydb_dump.sql в ката­лог /tmp сер­ве­ра 192.168.1.156 под­клю­чив­шись под учет­ной запи­сью test.

 

В про­цес­се систе­ма может попро­сить при­нять сер­ти­фи­кат: про­сто наби­ра­ем yes

Are you sure you want to continue connecting (yes/no)? yes

и после вво­дим пароль для учет­ной запи­си test на вто­ром сервере.

 

Теперь под­клю­чи­тесь ко вто­ро­му серверу.

Откро­ем на редак­ти­ро­ва­ние кон­фи­гу­ра­ци­он­ный файл MariaDB:

# vi /etc/my.cnf.d/server.cnf

и при­ве­дем его к сле­ду­ю­ще­му виду:

[mysqld]
server-id = 2

*  server-id: напом­ню, что это иден­ти­фи­ка­тор сер­ве­ра и для каж­дой ноды кла­сте­ра он дол­жен быть уникальным.

 

Пере­за­гру­жа­ем сер­вис, что­бы изме­не­ния всту­пи­ли в силу:

# systemctl restart mariadb

Вос­ста­но­вим базу из дам­па, кото­рый был сде­лан на пер­вом сер­ве­ре. Если это не потре­бо­ва­лось, про­пу­сти­те этот шаг.

# mysql -v -uroot -p < /tmp/mydb_dump.sql

* файл /tmp/mydb_dump.sql мы ско­пи­ро­ва­ли с пер­во­го сервера.

 

Теперь под­клю­чим­ся к MariaDB:

# mysql -uroot -p

 

и вве­дем такую команду:

MariaDB [(none)]> change master to master_host = "192.168.1.155", master_user = "replmy", master_password = "password", master_log_file = "mysql-bin.000005", master_log_pos = 404;

192.168.1.155: IP-адрес мое­го пер­во­го сер­ве­ра. replmy: учет­ная запись для репли­ка­ции, кото­рая была созда­на на пер­вом сер­ве­ре. password: пароль для учет­ной запи­си, так­же был сде­лан на пер­вом сер­ве­ре. mysql-bin.000005: имя фай­ла, кото­рое мы долж­ны были запи­сать или запом­нить (у вас может быть дру­гим). 404: номер пози­ции, с кото­рой необ­хо­ди­мо начать репли­ка­цию (так­же долж­ны были запи­сать или запом­нить ранее).

 

Теперь запу­стим вто­рич­ный сер­вер для репликации:

MariaDB [(none)]> start slave;

 

И про­ве­рим состо­я­ние репликации:

MariaDB [(none)]> SHOW SLAVE STATUS\G

Обра­ти­те вни­ма­ние на поля Read_Master_Log_Pos и Exec_Master_Log_Pos. Они долж­ны отли­чать­ся от началь­но­го зна­че­ния (в нашем при­ме­ре, 404). Так­же посмот­ри­те на поле Last_IO_Error — оно долж­но быть пустым.

Отклю­чи­тесь от mariadb:

MariaDB [(none)]> \q

Настрой­ка кла­сте­ра в режи­ме Master - Slave закончена.

Что­бы про­ве­рить, насколь­ко хоро­шо рабо­та­ет репли­ка­ция, попро­буй­те вне­сти изме­не­ние на пер­вом сер­ве­ре — на вто­ром оно долж­но появить­ся, почти, сразу.

2. Настройка кластера MariaDB в режиме Master - Master

Если одно­сто­рон­не­го режи­ма копи­ро­ва­ния дан­ных нам недо­ста­точ­но, про­дол­жа­ем настройку.

На вто­ром сер­ве­ре откро­ем кон­фи­гу­ра­ци­он­ный файл MariaDB:

# vi /etc/my.cnf.d/server.cnf

и допи­шем в него следующее:

log_bin=mysql-bin
log_error=mysql-bin.err
binlog-ignore-db=information_schema,mysql,test

 

Пере­за­гру­зим демон для при­ме­не­ния настроек:

systemctl restart mariadb

 

Теперь под­клю­чим­ся к MariaDB:

# mysql -uroot -p

и созда­дим учет­ную запись для репли­ка­ции с пер­во­го сервера:

MariaDB [(none)]> GRANT replication slave ON *.* TO "replmy"@"192.168.1.155" IDENTIFIED BY "password";

replmy: имя учет­ной запи­си (мож­но исполь­зо­вать любое). 192.168.1.155: IP-адрес пер­во­го сер­ве­ра, с кото­рым будем реп­ли­ци­ро­вать дан­ные. password: пароль для учет­ной запи­си (жела­тель­но, сложный).

 

Выве­дем состо­я­ние рабо­ты мастера:

MariaDB [(none)]> show master status\G

Как и при настрой­ке пер­во­го сер­ве­ра, запом­ни­те или запи­ши­те зна­че­ния для File и Position.

 

Теперь под­клю­чи­тесь к пер­во­му серверу.

И зай­дем в команд­ную обо­лоч­ку MariaDB:

# mysql -uroot -p

вве­дем такую команду:

MariaDB [(none)]> change master to master_host = "192.168.1.156", master_user = "replmy", master_password = "password", master_log_file = "mysql-bin.000003", master_log_pos = 245;

192.168.1.156: IP-адрес мое­го вто­ро­го сер­ве­ра. replmy: учет­ная запись для репли­ка­ции, кото­рая была созда­на на вто­ром сер­ве­ре. password: пароль для учет­ной запи­си, так­же был сде­лан на вто­ром сер­ве­ре. mysql-bin.000003: имя фай­ла, кото­рое мы долж­ны были запи­сать или запом­нить (у вас может быть дру­гим). 245: номер пози­ции, с кото­рой необ­хо­ди­мо начать репли­ка­цию (так­же долж­ны были запи­сать или запом­нить ранее).

 

Теперь запу­стим вто­рич­ный сер­вер для репликации:

MariaDB [(none)]> start slave;

 

И про­ве­рим состо­я­ние репликации:

MariaDB [(none)]> SHOW SLAVE STATUS\G

Отклю­чи­тесь от СУРБД:

MariaDB [(none)]> \q

Настрой­ка кла­сте­ра в режи­ме Master - Master закончена.

Теперь оста­ет­ся окон­ча­тель­но убе­дить­ся, что репли­ка­ция рабо­та­ет. Вне­си­те изме­не­ния на пер­вом сер­ве­ре — они долж­ны попасть на вто­рой. И наобо­рот, при вне­се­нии изме­не­ний на вто­ром сер­ве­ре, они долж­ны попа­дать на первый.