====== Percona XtraDB Cluster на Debian 11 ======
===== Установка кластера =====
# Обновляем систему:
apt update
# Устанавливаем необходимые пакеты:
apt install -y wget gnupg2 lsb-release curl
# Закачиваем установочный пакет percona
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
# Устанавливаем его через dpkg:
dpkg -i percona-release_latest.generic_all.deb
# Обновляем информацию о пакетах:
apt update
# Включаем репозиторийна установку Percona XtraDB Cluster:
percona-release setup pxc80
# Устанавливаем кластер:
apt install -y percona-xtradb-cluster
В процессе установке нужно будет **__установить пароль__** root на MySQL. Эти действия необходимо выполнить на **__каждой ноде__** кластера.
===== Конфигурирование кластера =====
У нас имеется три виртуальных машины в локальной сети 10.20.30.0/24:
^ Node ^ Host ^ IP ^
| Node 1 | pxc1 | 10.20.30.2 |
| Node 2 | pxc2 | 10.20.30.3 |
| Node 3 | pxc3 | 10.20.30.4 |
# Останавливаем Percona. После новой установки он не стартует сам.
# Это необходимо сделать, если вы запускали сервер вручную самостоятельно.
service mysql stop
# Отредактируем файл конфигурации, в Debian or Ubuntu это /etc/mysql/mysql.conf.d/mysqld.cnf:
# Указываем в переменной через запятую состав кластера.
wsrep_cluster_address=gcomm://10.20.30.2,10.20.30.3,10.20.30.4
# Конфигурируем ноду 1.
# Требуется указать имя ноды и её IP адрес
# Остальные параметры можно оставить определенными по-умолчанию.
wsrep_node_name=pxc1
wsrep_node_address=10.20.30.2
# Для ноды 2
wsrep_node_name=pxc2
wsrep_node_address=10.20.30.3
# Для ноды 3
wsrep_node_name=pxc3
wsrep_node_address=10.20.30.4
По сути настройки всех нод аналогичные, разницы между ними нет. В файле конфигурации следует указать список всех участников и для каждой ноды - ее IP адрес и имя. Есть еще настройки для шифрования трафика, но их пока оставляем за пределами этой заметки.
===== Стартуем кластер =====
В результате на текущий момент у нас имеется три одинаковых по характеристикам и настройкам сервера с установленным и выключенным mysql percona clister. **pxc1 для подключения** и подключаем остальные две (2 и 3) к первой.
==== bootstap-им первую ноду ====
# Стартуем (bootstap-им первую ноду)
# Нода в этот момент находится в режиме для подключения, она не смотрит в сформированный нами конфиг
# и выставляет переменную wsrep_cluster_conf_id в 1
root@pxc1:~# systemctl start mysql@bootstrap.service
systemctl start mysql@bootstrap.service
Смотрим в mysql на первой ноде, что происходит:
mysql> show status like 'wsrep%';
| wsrep_cluster_size | 1 |
| wsrep_cluster_state_uuid | 67682be6-fb38-11ed-aa0e-1a0b1104418d |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 2 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy (modified by Percona ) |
| wsrep_provider_version | 4.14(779b689) |
| wsrep_ready | ON |
| wsrep_thread_count | 9 |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
79 rows in set (0.01 sec)
Видим, что первая нода работает и ждет подключений остальных.
==== Стартуем вторую ноду ====
root@pxc2:~# service mysql start
service mysql start
mysql> show status like 'wsrep%';
....
| wsrep_cluster_conf_id | 4 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | 67682be6-fb38-11ed-aa0e-1a0b1104418d |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 0 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy (modified by Percona ) |
| wsrep_provider_version | 4.14(779b689) |
| wsrep_ready | ON |
| wsrep_thread_count | 9 |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
79 rows in set (0.00 sec)
Видим, что в составе ноды появился второй участник, на это указывает параметр wsrep_cluster_size, равный **2**. Аналогично добавляем третью ноду.
==== Добавляем ноду 3 ====
# Добавляем ноду 3
#
root@pxc3:~# service mysql start
service mysql start
Скорее всего, что нода так же добавится и параметр wsrep_cluster_size установится в 3. У меня именно так и произошло, но после нескольких попыток.
==== Переключение первой ноды в обычный режим ====
Все это хорошо, но кластер сейчас в режиме добавления. И нам нужно переключить первую ноду в обычный режим и проверить его работу кластера, ради чего все затевалось то?
# На первой ноде останавливаем bootstrap
#
root@pxc1:~# systemctl stop mysql@bootstrap.service
systemctl stop mysql@bootstrap.service
# Теперь стартуем mysql в обычном режиме
#
root@pxc1:~# systemctl start mysql
systemctl start mysql
==== Включение кластера ====
mysql> show status like 'wsrep%';
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 67682be6-fb38-11ed-aa0e-1a0b1104418d |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 0 |
| wsrep_provider_capabilities | :MULTI_MASTER:CERTIFICATION:PARALLEL_APPLYING:TRX_REPLAY:ISOLATION:PAUSE:CAUSAL_READS:INCREMENTAL_WRITESET:UNORDERED:PREORDERED:STREAMING:NBO: |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy (modified by Percona ) |
| wsrep_provider_version | 4.14(779b689) |
| wsrep_ready | ON |
| wsrep_thread_count | 9 |
+----------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
79 rows in set (0.00 sec)
mysql>
Видим два параметра: wsrep_cluster_size 3 и текущее состояние кластера wsrep_cluster_state_uuid, он должен совпадать на всех нодах кластера, проверяем это от 1 до 3.
==== Проверка репликации кластера на тестовой БД ====
На **первой** ноде выполняем команду в mysql:
# На первой ноде выполняем команду в mysql
pxc1: mysql> CREATE DATABASE tempo;
CREATE DATABASE tempo;
На **второй** ноде:
# На второй ноде выполняем команду в mysql
pxc2: mysql> USE tempo;
mysql> USE tempo;
Database changed
На **третьей** ноде выполняем команду в mysql:
# На третьей ноде выполняем команду в mysql
pxc3: mysql> CREATE TABLE tempo.example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
mysql> CREATE TABLE tempo.example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Query OK, 0 rows affected (7.60 sec)
Теперь снова на **первой** ноде выполняем команду в MySQL
# На первой ноде выполняем команду в mysql
pxc1: mysql> INSERT INTO tempo.example VALUES (1, 'pxc1');
mysql> INSERT INTO tempo.example VALUES (1, 'pxc1');
Query OK, 1 row affected (1.35 sec)
Как видим, наш кластер живет и работает неплохо. Теперь можно заливать в него БД...