НАСТРОЙКА КЛАСТЕРА GALERA НА MARIADB

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

Кла­сте­ри­за­ция под­дер­жи­ва­ет высо­кую доступ­ность дан­ных, пере­да­вая изме­не­ния на раз­ные сер­ве­ры, потен­ци­аль­но рас­по­ло­жен­ные в раз­ных ЦОД. Если один из сер­ве­ров отка­зы­ва­ет, дру­гие про­дол­жа­ют обслу­жи­вать полу­чен­ные данные.

Кла­сте­ры делят­ся на два типа: актив­но-пас­сив­ные (active-passive) и актив­но-актив­ные (active-active). В пер­вом слу­чае все опе­ра­ции запи­си про­ис­хо­дят на одном актив­ном (веду­щем) сер­ве­ре, после чего обнов­ле­ния копи­ру­ют­ся пас­сив­ны­ми (или ведо­мы­ми) сер­ве­ра­ми. В слу­чае сбоя актив­но­го сер­ве­ра один из пас­сив­ных сер­ве­ров зани­ма­ет его место. Неко­то­рые кла­сте­ры типа active-passive под­дер­жи­ва­ют опе­ра­цию SELECT на пас­сив­ных нодах. В кла­сте­рах вто­ро­го типа все ноды могут выпол­нять опе­ра­ции чте­ния и запи­си; изме­не­ние, вне­сён­ное на один из сер­ве­ров, ско­пи­ру­ет­ся осталь­ны­ми серверами.

MariaDB – это откры­тая реля­ци­он­ная СУБД, пол­но­стью сов­ме­сти­мая с попу­ляр­ной систе­мой MySQL. Вы може­те най­ти офи­ци­аль­ную доку­мен­та­цию MariaDB на этой стра­ни­цеGalera – это инстру­мент для кла­сте­ри­за­ции баз дан­ных, кото­рый поз­во­ля­ет настра­и­вать кла­сте­ры с несколь­ки­ми масте­ра­ми и син­хрон­ной репли­ка­ци­ей. Galera авто­ма­ти­че­ски выпол­ня­ет син­хро­ни­за­цию дан­ных на раз­ных нодах, поз­во­ляя отправ­лять запро­сы на чте­ние и запись на любую ноду в кла­сте­ре. Вы може­те узнать боль­ше о Galera в офи­ци­аль­ной доку­мен­та­ции.

Дан­ный ману­ал помо­жет настро­ить актив­но-актив­ный кла­стер Galera на БД MariaDB. для демон­стра­ции мы исполь­зу­ем три про­стых сер­ве­ра CentOS 7 – это наи­мень­ший доступ­ный кластер.

1: Добавление репозитория MariaDB

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

Сна­ча­ла нуж­но доба­вить соот­вет­ству­ю­щие репо­зи­то­рии паке­тов MariaDB на каж­дый из трех сер­ве­ров, что­бы затем уста­но­вить пра­виль­ную вер­сию MariaDB. После обнов­ле­ния репо­зи­то­ри­ев на всех трех сер­ве­рах вы смо­же­те перей­ти к уста­нов­ке MariaDB.

Сто­ит отме­тить, что MariaDB воз­ник­ла в каче­стве заме­ны MySQL, поэто­му во мно­гих кон­фи­гу­ра­ци­он­ных фай­лах и скрип­тах запус­ка вы уви­ди­те mysql, а не mariadb. Для согла­со­ван­но­сти кода мы будем исполь­зо­вать mysql.

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

При­ме­ча­ние: Офи­ци­аль­но­му репо­зи­то­рию от MariaDB мож­но дове­рять, но дале­ко не все внеш­ние репо­зи­то­рии так же надеж­ны. Обя­за­тель­но уста­нав­ли­вай­те паке­ты толь­ко из надеж­ных источников.

Сна­ча­ла добавь­те ключ репо­зи­то­рия MariaDB. Создай­те файл для него:

sudo vi /etc/yum.repos.d/mariadb.repo

Добавь­те в файл сле­ду­ю­щие строки:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Нажми­те кла­ви­шу esc, что­бы вер­нуть­ся в обыч­ный режим, затем вве­ди­те: wq, что­бы сохра­нить и вый­ти из файла.

Акти­ви­руй­те репозиторий:

sudo yum makecache --disablerepo='*' --enablerepo='mariadb'

Коман­да makecache кэши­ру­ет мета­дан­ные репо­зи­то­рия, что­бы мене­джер паке­тов мог уста­но­вить MariaDB с помо­щью фай­лов —disablerepo и —enablerepo, направ­ля­ю­щих коман­ду на файл репо­зи­то­рия mariadb, кото­рый вы толь­ко что создали.

Вы полу­чи­те такой вывод:

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
mariadb                                                                 | 2.9 kB  00:00:00
(1/3): mariadb/primary_db                                               |  43 kB  00:00:00
(2/3): mariadb/other_db                                                 | 8.3 kB  00:00:00
(3/3): mariadb/filelists_db                                             | 238 kB  00:00:00
Metadata Cache Created

Не забудь­те повто­рить эти дей­ствия на осталь­ных сер­ве­рах кластера.

2: Установка MariaDB

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

Начи­ная с вер­сии 10.1, MariaDB объ­еди­ня­ет паке­ты MariaDB Server и MariaDB Galera Server в еди­ный пакет. Пото­му доста­точ­но уста­но­вить mariadb-server, а Galera и несколь­ко зави­си­мо­стей уста­но­вят­ся автоматически.

sudo yum install MariaDB-server MariaDB-client

Сна­ча­ла нуж­но под­твер­дить уста­нов­ку, для это­го вве­ди­те yes. Затем будет пред­ло­же­но при­нять GPG ключ. Сно­ва вве­ди­те yes.

Когда уста­нов­ка будет завер­ше­на, запу­сти­те сер­вис mariadb:

sudo systemctl start mariadb

Добавь­те его в автозагрузку:

sudo systemctl enable mariadb

Начи­ная с вер­сии MariaDB 10.4, root-поль­зо­ва­тель MariaDB по умол­ча­нию постав­ля­ет­ся без паро­ля. Что­бы создать пароль, нуж­но вой­ти в MariaDB:

sudo mysql -uroot

В обо­лоч­ке MariaDB запу­сти­те эту команду:

set password = password("your_password");

Вы полу­чи­те такой вывод:

Query OK, 0 rows affected (0.001 sec)

Вый­ди­те из MariaDB:

quit;

Теперь у вас есть все необ­хо­ди­мые ком­по­нен­ты для нача­ла настрой­ки кла­сте­ра, нуж­но толь­ко убе­дить­ся, что на сер­ве­ре есть rsync и policycoreutils-python (для под­держ­ки SELinux):

sudo yum install rsync policycoreutils-python

Это уста­но­вит новей­шую вер­сию rsync и policycoreutils-python или пред­ло­жит обно­вить до нее вашу установку.

3: Настройка первой ноды

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

По умол­ча­нию MariaDB про­ве­ря­ет ката­лог /etc/mysql/conf.d, что­бы полу­чить допол­ни­тель­ные кон­фи­гу­ра­ции из.cnf. Создай­те такой файл в этом каталоге:

sudo vi /etc/my.cnf.d/galera.cnf

Ско­пи­руй­те и вставь­те в него такой код. В этой кон­фи­гу­ра­ции ука­зы­ва­ют­ся раз­лич­ные пара­мет­ры кла­сте­ра, све­де­ния о теку­щем сер­ве­ре и дру­гих нодах в кла­сте­ре, а так­же пара­мет­ры репли­ка­ции. Обра­ти­те вни­ма­ние, что в кон­фи­гу­ра­ции нуж­но ука­зы­вать внут­рен­ние IP-адре­са ваших серверов.

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"

  • Пер­вый раз­дел изме­ня­ет или повтор­но зада­ёт пара­мет­ры MariaDB/MySQL, необ­хо­ди­мые для кор­рект­ной рабо­ты кла­сте­ра. Напри­мер, Galera Cluster не смо­жет рабо­тать с MyISAM и подоб­ны­ми нетран­зак­ци­он­ны­ми систе­ма­ми хра­не­ния. Так­же mysqld нель­зя свя­зы­вать с IP-адре­сом локаль­но­го хоста. Подроб­ную инфор­ма­цию о настрой­ках Galera мож­но най­ти по этой ссыл­ке.
  • Раз­дел Galera Provider Configuration настра­и­ва­ет ком­по­нен­ты MariaDB, кото­рые предо­став­ля­ют интер­фейс репли­ка­ции WriteSet. Ука­жи­те эти пара­мет­ры для базо­вой сре­ды репли­ка­ции. Этот раз­дел не нуж­но пере­на­стра­и­вать, но если вам нуж­на допол­ни­тель­ная инфор­ма­ция, вы най­де­те ее здесь.
  • Раз­дел Galera Cluster Configuration пере­чис­ля­ет ноды, вхо­дя­щие в кла­стер, с помо­щью IP-адре­са или домен­но­го име­ни, а так­же опре­де­ля­ет имя кла­сте­ра (бла­го­да­ря чему все чле­ны кла­сте­ра вхо­дят в одну груп­пу). Заме­ни­те услов­ные дан­ные сво­и­ми дан­ны­ми; вме­сто wsrep_cluster_name ука­жи­те более опи­са­тель­ное имя (или оставь­те все как есть). Вме­сто wsrep_cluster_address ука­жи­те внут­рен­ние IP-адре­са нод кластера.
  • Раз­дел Galera Synchronization Configuration ука­зы­ва­ет, как чле­ны кла­сте­ра будут вза­и­мо­дей­ство­вать и син­хро­ни­зи­ро­вать дан­ные меж­ду собой. Для это­го в дан­ном мануа­ле исполь­зу­ет­ся rsync.
  • Раз­дел Galera Node Configuration ука­зы­ва­ет IP-адрес и имя теку­ще­го сер­ве­ра. Это помо­га­ет при диа­гно­сти­ке про­блем в логах и поз­во­ля­ет ссы­лать­ся на сер­вер. Вме­сто wsrep_node_address ука­жи­те адрес теку­щей маши­ны, а затем при­свой­те ей уни­каль­ное имя.

Ско­пи­руй­те содер­жи­мое это­го фай­ла в буфер обме­на, а затем сохра­ни­те и закрой­те файл.

4: Настройка остальных нод

Теперь нуж­но создать кон­фи­гу­ра­ци­он­ный файл на дру­гих нодах. Открой­те такой файл:

sudo vi /etc/mysql/my.cnf.d/galera.cnf

Вставь­те в него ско­пи­ро­ван­ные настрой­ки. Откор­рек­ти­руй­те Galera Node Configuration, ука­жи­те в этом раз­де­ле IP-адрес или домен­ное имя теку­щей ноды, а так­же выбе­ри­те для неё уни­каль­ное имя.

. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

Сохра­ни­те и закрой­те файл.

Повто­ри­те эти дей­ствия на осталь­ных нодах.

Кла­стер почти готов, оста­лось толь­ко открыть пор­ты в бранд­мау­э­ре и настро­ить поли­ти­ку SELinux.

5: Настройка брандмауэра

При­ме­ча­ние: Дан­ный раз­дел нуж­но выпол­нить на каж­дой ноде кластера.

На этом эта­пе мы настро­им бранд­мау­эр и откро­ем пор­ты, необ­хо­ди­мые для свя­зи меж­ду нодами.

Про­верь­те состо­я­ние бранд­мау­э­ра firewall:

sudo firewall-cmd --list-all

Коман­да вернула:

public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

В дан­ном слу­чае он под­дер­жи­ва­ет SSH, DHCP, HTTP и HTTPS. Если вы попы­та­е­тесь запу­стить кла­стер, вы не смо­же­те это­го сде­лать, пото­му что бранд­мау­эр его забло­ки­ру­ет. Что­бы испра­вить это, нуж­но доба­вить пра­ви­ла, кото­рые откро­ют тра­фик меж­ду MariaDB и Galera.

Galera может исполь­зо­вать четы­ре порта:

  • 3306: для соеди­не­ния с кли­ен­та­ми MySQL и для State Snapshot Transfer (рабо­та­ет через метод mysqldump).
  • 4567: для репли­ка­ции Galera Cluster и для мно­го­ад­рес­ной репли­ка­ции по UDP и TCP.
  • 4568: Incremental State Transfer.
  • 4444: осталь­ные опе­ра­ции State Snapshot Transfer.

Открой­те эти пор­ты в бранд­мау­э­ре. Убе­див­шись, что репли­ка­ция рабо­та­ет, вы смо­же­те закрыть все ненуж­ные пор­ты и огра­ни­чить тра­фик толь­ко сер­ве­ра­ми кластера.

Что­бы открыть пор­ты, исполь­зуй­те такие команды:

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4567/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4568/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4444/tcp
sudo firewall-cmd --permanent --zone=public --add-port=4567/udp

Читай­те так­жеНастрой­ка бранд­мау­э­ра FirewallD в CentOS 7

Исполь­зуя —zone = public и —add-port =, firewall-cmd откры­ва­ет эти пор­ты для пуб­лич­но­го тра­фи­ка. Флаг —permanent сохра­ня­ет эти пра­ви­ла для даль­ней­ших сессий.

Теперь добавь­те каж­дый сер­вер в зону public, выпол­нив сле­ду­ю­щие коман­ды. Заме­ни­те услов­ные адре­са соот­вет­ству­ю­щи­ми внут­рен­ни­ми IP-адре­са­ми ваших нод.

sudo firewall-cmd --permanent --zone=public --add-source=galera-node-1-ip/32
sudo firewall-cmd --permanent --zone=public --add-source=galera-node-2-ip/32
sudo firewall-cmd --permanent --zone=public --add-source=galera-node-3-ip/32

Пере­за­пу­сти­те брандмауэр:

sudo firewall-cmd --reload

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

Теперь мож­но создать поли­ти­ку SELinux.

6: Настройка политики SELinux(но лучше его отключить к ебеням)

Поли­ти­ка SELinux поз­во­лит всем нодам обме­ни­вать­ся дан­ны­ми и выпол­нять опе­ра­ции кластера.

SELinux – это модуль ядра Linux, кото­рый повы­ша­ет без­опас­ность опе­ра­ци­он­ных систем бла­го­да­ря под­держ­ке обя­за­тель­ных поли­тик кон­тро­ля досту­па. Он вклю­чен в CentOS 7 по умол­ча­нию и запре­ща­ет демо­ну MariaDB выпол­нять мно­же­ство потен­ци­аль­но опас­ных действий.

Что­бы создать поли­ти­ку, нуж­но выпол­нить в кла­сте­ре ряд дей­ствий с раз­ре­ша­ю­щим режи­мом SELinux для MySQL. Затем вы созда­ди­те поли­ти­ку из заре­ги­стри­ро­ван­ных собы­тий и, нако­нец, уста­но­ви­те при­ну­ди­тель­ное выпол­не­ние SELinux после уста­нов­ки политики.

Сна­ча­ла раз­ре­ши­те доступ к соот­вет­ству­ю­щим пор­там, выпол­нив на всех трех сер­ве­рах сле­ду­ю­щие команды:

sudo semanage port -a -t mysqld_port_t -p tcp 4567
sudo semanage port -a -t mysqld_port_t -p udp 4567
sudo semanage port -a -t mysqld_port_t -p tcp 4568
sudo semanage port -a -t mysqld_port_t -p tcp 4444

При­ме­ча­ние: Вы може­те полу­чить ошиб­ку ValueError при раз­ре­ше­нии досту­па к неко­то­рым из этих пор­тов. Это озна­ча­ет, что состо­я­ние SELinux для это­го пор­та уже уста­нов­ле­но, что в этом слу­чае не повли­я­ет на работу.

В этих коман­дах исполь­зу­ет­ся инстру­мент управ­ле­ния semanage с фла­гом –a, он доба­вит пор­ты и будет игно­ри­ро­вать сер­вер базы данных.

Затем выпол­ни­те сле­ду­ю­щую коман­ду на всех трех сер­ве­рах. Она вре­мен­но пере­во­дит домен MySQL SELinux в раз­ре­ши­тель­ный режим.

sudo semanage permissive -a mysqld_t

Обра­бот­ка этой коман­ды может занять мину­ту и не выве­дет ника­ких выход­ных данных.

Затем оста­но­ви­те сер­вер БД на всех нодах, что­бы загру­зить кла­стер базы дан­ных с общи­ми поли­ти­ка­ми SELinux. Для это­го выпол­ни­те на всех трех нодах сле­ду­ю­щую команду:

sudo systemctl stop mariadb

Запу­сти­те кла­стер для гене­ра­ции собы­тий вза­и­мо­дей­ствия меж­ду нода­ми, кото­рые будут добав­ле­ны в поли­ти­ку SELinux. На пер­вой ноде загру­зи­те кла­стер, выполнив:

sudo galera_new_cluster

Создай­те базу дан­ных и таб­ли­цу для реги­стра­ции собы­тий SST, выпол­нив на пер­вой ноде такую команду:

mysql -u root -p -e 'CREATE DATABASE selinux;
CREATE TABLE selinux.selinux_policy (id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id));
INSERT INTO selinux.selinux_policy VALUES ();'

Теперь запу­сти­те сер­вер на вто­рой ноде:

sudo systemctl start mariadb

Затем сде­лай­те то же самое на тре­тьей ноде:

sudo systemctl start mariadb

Вы не уви­ди­те вывод от преды­ду­щих команд. Что­бы сге­не­ри­ро­вать собы­тия IST, выпол­ни­те сле­ду­ю­щее на всех трех серверах:

mysql -u root -p -e 'INSERT INTO selinux.selinux_policy VALUES ();'

Теперь создай­те и вклю­чи­те поли­ти­ку SELinux, выпол­нив сле­ду­ю­щие коман­ды на всех трех серверах:

sudo grep mysql /var/log/audit/audit.log | sudo audit2allow -M Galera

Пер­вая коман­да ищет сге­не­ри­ро­ван­ные собы­тия в фай­ле audit.log и пере­да­ет их в модуль Galera.pp, создан­ный инстру­мен­том audit2allow. Это при­ве­дет к сле­ду­ю­ще­му выводу:

******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i Galera.pp

Далее сле­дуй­те инструк­ци­ям в выход­ных дан­ных и исполь­зуй­те сле­ду­ю­щую коман­ду для уста­нов­ки сге­не­ри­ро­ван­но­го модуля:

sudo semodule -i Galera.pp

Теперь, когда поли­ти­ка актив­на, отклю­чи­те раз­ре­ша­ю­щий режим для сер­ве­ра MariaDB:

sudo semanage permissive -d mysqld_t

Вы успеш­но созда­ли и вклю­чи­ли поли­ти­ку SELinux.

7: Запуск кластера

Запу­сти­те кла­стер MariaDB. Но для нача­ла вам нуж­но оста­но­вить теку­щий сер­вис MariaDB.

Остановка сервиса MariaDB

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

Сна­ча­ла выпол­ни­те сле­ду­ю­щую коман­ду на тре­тьей ноде:

sudo systemctl stop mariadb

Затем оста­но­ви­те сер­вис на вто­рой ноде:

sudo systemctl stop mariadb

Нако­нец, оста­но­ви­те сер­вис на пер­вой ноде:

sudo systemctl stop mariadb

systemctl не отоб­ра­жа­ет резуль­тат команд управ­ле­ния сер­ви­са­ми, поэто­му исполь­зуй­те сле­ду­ю­щую коман­ду на каж­дом из ваших сер­ве­ров, что­бы про­ве­рить состо­я­ние сервиса:

sudo systemctl status mariadb

Послед­няя стро­ка будет выгля­деть при­мер­но так:

. . .
Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.

Как толь­ко вы закро­е­те mariadb на всех сер­ве­рах, вы може­те про­дол­жить работу.

Запуск первой ноды

Что­бы запу­стить первую ноду, исполь­зуй­те спе­ци­аль­ный загру­зоч­ный сце­на­рий. Соглас­но настрой­кам кла­сте­ра каж­дая запу­щен­ная нода будет пытать­ся под­клю­чить­ся хотя бы к одной из нод, пере­чис­лен­ных в фай­ле galera.cnf. Без сце­на­рия galera_new_cluster, кото­рый поз­во­ля­ет систе­ме systemd отпра­вить флаг —wsrep-new-cluster, обыч­ная коман­да запус­ка кла­сте­ра не сра­бо­та­ет, пото­му что на дан­ный момент не суще­ству­ет нод, к кото­рым мож­но подключиться.

sudo galera_new_cluster

После успеш­но­го выпол­не­ния скрип­та нода реги­стри­ру­ет­ся как часть кла­сте­ра. Что­бы убе­дить­ся в этом, запустите:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

На осталь­ных нодах мож­но исполь­зо­вать стан­дарт­ную коман­ду mariadb. Она най­дет доступ­ные ноды кла­сте­ра и под­клю­чит­ся к ним.

Запуск второй ноды

Что­бы запу­стить вто­рую ноду, запу­сти­те  mariadb:

sudo systemctl start mariadb

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

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

Запуск третьей ноды

Запу­сти­те коман­ду mariadb:

sudo systemctl start mariadb

Если нода запу­ще­на успеш­но, раз­мер кла­сте­ра увеличится:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Вы уви­ди­те сле­ду­ю­щий вывод, кото­рый ука­зы­ва­ет, что тре­тья нода при­со­еди­ни­лась к кла­сте­ру и что общее коли­че­ство нод в кла­сте­ре- 3.

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Теперь кла­стер запу­щен, а ноды могут вза­и­мо­дей­ство­вать меж­ду собой.

8: Тестирование репликации

Теперь нуж­но убе­дить­ся, что ноды кла­сте­ра успеш­но реп­ли­ци­ру­ют данные.

Вне­си­те изме­не­ния в БД на пер­вой ноде.

Запись данных на первой ноде

Создай­те на пер­вой ноде новую базу дан­ных. Сле­ду­ю­щие коман­ды созда­дут БД playground и таб­ли­цу equipment.

mysql -u root -p -e 'CREATE DATABASE playground;
CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

В преды­ду­щей коман­де опе­ра­тор CREATE DATABASE созда­ет базу дан­ных playground. Опе­ра­тор CREATE созда­ет в ней таб­ли­цу equipment, в кото­рой есть стол­бец id с авто­ин­кре­мен­том и дру­гие столб­цы. Столб­цы type, quant и color нуж­ны для хра­не­ния типа, коли­че­ства и цве­та обо­ру­до­ва­ния. Опе­ра­тор INSERT встав­ля­ет запись type slide, quantity 2, color blue.

Чтение и запись на второй ноде

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

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Если репли­ка­ция рабо­та­ет пра­виль­но, дан­ные, вве­дён­ные на пер­вой ноде, появят­ся в БД вто­рой ноды.

+----+-------+-------+-------+
| id | type  | quant | color |
+----+-------+-------+-------+
|  1 | slide |     2 | blue  |
+----+-------+-------+-------+

Добавь­те в кла­стер новые данные:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Чтение и запись на третьей ноде

Затем перей­ди­те­на тре­тью ноду и про­смот­ри­те БД. Теперь она долж­на содер­жать новые дан­ные, добав­лен­ные на пер­вой и вто­рой ноде.

mysql -u root -p -e 'SELECT * FROM playground.equipment;'
+----+-------+-------+--------+
| id | type  | quant | color  |
+----+-------+-------+--------+
|  1 | slide |     2 | blue   |
|  2 | swing |    10 | yellow |
+----+-------+-------+--------+

Добавь­те в таб­ли­цу еще одно новое значение:

mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

Чтение на первой ноде

Теперь вер­ни­тесь на первую ноду. Запро­си­те дан­ные БД:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Вы уви­ди­те такой вывод, в кото­ром будут содер­жать­ся все новые дан­ные, добав­лен­ные со всех нод кластера:

+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  1 | slide  |     2 | blue   |
|  2 | swing  |    10 | yellow |
|  3 | seesaw |     3 | green  |
+----+--------+-------+--------+

Как види­те, репли­ка­ция дан­ных успеш­но рабо­та­ет в кластере.

Перед запус­ком в про­из­вод­ство реко­мен­ду­ем взгля­нуть на дру­гие сред­ства sst, такие как xtrabackup, кото­рый поз­во­ля­ет очень быст­ро настра­и­вать новые ноды без боль­ших пере­ры­вов в рабо­те актив­ных нод. Это не вли­я­ет на фак­ти­че­скую репли­ка­цию, но явля­ет­ся про­бле­мой при ини­ци­а­ли­за­ции нод.