Mysql (часть 5). Установка и настройка Percona XtraDB Cluster
В предыдущих статьях шла речь о настройка mysql репликации разных типов используя Percona mysql server. Была четкая схема с мастерами и слейвами и для каждого хоста назначалась и настраивалась конкретная роль и это была достаточно рутинная работа. Поднять mysql кластер можно в несколько раз быстрее используя такую вещь, как Percona XtraDB Cluster, о чем и пойдет речь в данной статье.Создадим Percona XtraDB Cluster с трех серверов под управлением операционной системы Ubuntu 12.04.Установка будет произведена из репозитория. Для начала, логинимся на первый сервер, добавляем ключик и репозитории.
root@pxc1:~#apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
root@pxc1:~#vim /etc/apt/sources.list.d/pxe.list
…
deb http://repo.percona.com/apt precise main
deb-src http://repo.percona.com/apt precise main
...
root@pxc1:~#apt-get update
Теперь ставим непосредственно Percona XtraDB Cluster пакет.
root@pxc1:~#apt-get install percona-xtradb-cluster-56
Во время установки нужно будет ввести пароль для доступа к mysql БД. Перед добавлением ноды в кластер, нужно стопнуть mysql.
root@pxc1:~#/etc/init.d/mysql stop
Добавляем главный конфигурационных файл для первого mysql PXC1 сервера.
root@pxc1:~#cat /etc/mysql/my.cnf
…
[mysqld]
# Логи
log_error = /var/log/mysql/mysql.err
# Директория с БД
datadir=/var/lib/mysql
# Пользователь
user=mysql
# Путь к Galera модуля
wsrep_provider=/usr/lib/libgalera_smm.so
# URL с IP адресами серверов, которые входят в кластер
wsrep_cluster_address=gcomm://192.168.1.150,192.168.1.151,192.168.1.152
# Формат бинлогов
binlog_format=ROW
# Дефолтный механизм хранения данных
default_storage_engine=InnoDB
# Режим лока при работе с автоинкремент значениями
innodb_autoinc_lock_mode=2
# Адрес первой ноды в кластере
wsrep_node_address=192.168.1.150
# Метод передачи снепшотов БД
wsrep_sst_method=xtrabackup-v2
# Имя кластера
wsrep_cluster_name=test_mysql_cluster
# Аутентификация для SST
wsrep_sst_auth="sstuser:DOGUQpj0Se8Q9oy7"
Теперь можно стартовать mysql сервер в режиме bootstrap.
root@pxc1:~#/etc/init.d/mysql bootstrap-pxc
После этого у нас добавиться первая нода в кластер. Для проверки, можно запустить команду.
root@pxc1:~# mysql -u root -p -e "show status like 'wsrep%';" | grep -E 'local_state|cluster|ready|connected'
wsrep_local_state_uuid b2cf979d-54ca-11e5-9bb4-628c43a251a6
wsrep_local_state 4
wsrep_local_state_comment Synced
wsrep_cluster_conf_id 1
wsrep_cluster_size 1
wsrep_cluster_state_uuid b2cf979d-54ca-11e5-9bb4-628c43a251a6
wsrep_cluster_status Primary
wsrep_connected ON
wsrep_ready ON
Этот вывод означает, что все ок. Теперь нужно добавить юзера с привилегиями для SST операций, которого мы добавили в конце my.cnf файла.
root@pxc1:~# mysql -u root -p
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'DOGUQpj0Se8Q9oy7';
Query OK, 0 rows affected (1.27 sec)
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
Query OK, 0 rows affected (0.62 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.48 sec)
Далее переходим к настройке второго сервера. Устанавливаем mysql Percona XtraDB Cluster таким же образом и переходим к редактированию my.cnf файла.
root@pxc2:~#cat /etc/mysql/my.cnf
…
[mysqld]
# Логи
log_error = /var/log/mysql/mysql.err
# Директория с БД
datadir=/var/lib/mysql
# Пользователь
user=mysql
# Путь к Galera модуля
wsrep_provider=/usr/lib/libgalera_smm.so
# URL с IP адресами серверов, которые входят в кластер
wsrep_cluster_address=gcomm://192.168.1.150,192.168.1.151,192.168.1.152
# Формат бинлогов
binlog_format=ROW
# Дефолтный механизм хранения данных
default_storage_engine=InnoDB
# Режим лока при работе с автоинкремент значениями
innodb_autoinc_lock_mode=2
# Адрес первой ноды в кластере
wsrep_node_address=192.168.1.151
# Метод передачи снепшотов БД
wsrep_sst_method=xtrabackup-v2
# Имя кластера
wsrep_cluster_name=test_mysql_cluster
# Аутентификация для SST
wsrep_sst_auth="sstuser:DOGUQpj0Se8Q9oy7"
И стартуем mysql в нормально режиме.
root@pxc2:~#/etc/init.d/mysql start
После этого, второй сервер добавиться в кластер. Проверяем.
root@pxc2:~# mysql -u root -p -e "show status like 'wsrep%';" | grep -E 'local_state|cluster|ready|connected'
wsrep_local_state_uuid b2cf979d-54ca-11e5-9bb4-628c43a251a6
wsrep_local_state 4
wsrep_local_state_comment Synced
wsrep_cluster_conf_id 4
wsrep_cluster_size 2
wsrep_cluster_state_uuid b2cf979d-54ca-11e5-9bb4-628c43a251a6
wsrep_cluster_status Primary
wsrep_connected ON
wsrep_ready ON
Ну и добавляем последнюю ноду. Устанавливаем Percona XtraDB Cluster и создаем my.cnf.
root@pxc3:~#cat /etc/mysql/my.cnf
…
[mysqld]
# Логи
log_error = /var/log/mysql/mysql.err
# Директория с БД
datadir=/var/lib/mysql
# Пользователь
user=mysql
# Путь к Galera модуля
wsrep_provider=/usr/lib/libgalera_smm.so
# URL с IP адресами серверов, которые входят в кластер
wsrep_cluster_address=gcomm://192.168.1.150,192.168.1.151,192.168.1.152
# Формат бинлогов
binlog_format=ROW
# Дефолтный механизм хранения данных
default_storage_engine=InnoDB
# Режим лока при работе с автоинкремент значениями
innodb_autoinc_lock_mode=2
# Адрес первой ноды в кластере
wsrep_node_address=192.168.1.152
# Метод передачи снепшотов БД
wsrep_sst_method=xtrabackup-v2
# Имя кластера
wsrep_cluster_name=test_mysql_cluster
# Аутентификация для SST
wsrep_sst_auth="sstuser:DOGUQpj0Se8Q9oy7"
И стартуем mysql.
root@pxc3:~#/etc/init.d/mysql start
Проверяем статус кластера.
root@pxc3:~# mysql -u root -p -e "show status like 'wsrep%';" | grep -E 'local_state|cluster|ready|connected'
wsrep_local_state_uuid b2cf979d-54ca-11e5-9bb4-628c43a251a6
wsrep_local_state 4
wsrep_local_state_comment Synced
wsrep_cluster_conf_id 7
wsrep_cluster_size 3
wsrep_cluster_state_uuid b2cf979d-54ca-11e5-9bb4-628c43a251a6
wsrep_cluster_status Primary
wsrep_connected ON
wsrep_ready ON
Как видим, у нас все 3 ноды успешно добавлены в кластер. Теперь можно протестировать работу.Переходим на первую ноду, создаем тестовую БД, таблицу и добавляем запись в неё.
root@pxc1:~# mysql -u root –p
mysql> CREATE DATABASE firstDB;
Query OK, 1 row affected (0.01 sec)
mysql> USE firstDB;
Database changed
mysql> CREATE TABLE records (rec VARCHAR(50));
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO records VALUE ("pxc1 record");
Query OK, 1 row affected (0.12 sec)
mysql> SELECT * FROM records;
+-------------+
| rec |
+-------------+
| pxc1 record |
+-------------+
1 row in set (0.00 sec)
Теперь идем на второй сервер и проверяем работает ли репликация.
root@pxc2:~# mysql -uroot -p
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| firstDB |
| mysql |
| performance_schema |
| test |
+--------------------+
Как видим, БД среплицировалась. Теперь добавив еще одну запись в таблицу.
mysql> INSERT INTO records VALUE ("pxc2 record");
Query OK, 1 row affected (0.04 sec)
mysql> SELECT * FROM records;
+-------------+
| rec |
+-------------+
| pxc1 record |
| pxc2 record |
+-------------+
2 rows in set (0.00 sec)
Первая запись среплицировалась и теперь у нас есть две записи. Проверяем последний сервер.
root@pxc3:~# mysql -u root -p
mysql> USE firstDB;
Database changed
mysql> SELECT * FROM records;
+-------------+
| rec |
+-------------+
| pxc1 record |
| pxc2 record |
+-------------+
2 rows in set (0.00 sec)
Кластер работает как положено. Для тестов, еще можно выключить одну машину и через некоторое время включить обратно. В этом случаи в кластере будет только две машины, а после включения третей – все данные, которые были добавлены в период колапса будут среплицированы на поднявшуюся ноду.