====== 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) Как видим, наш кластер живет и работает неплохо. Теперь можно заливать в него БД...