В предыдущих статьях шла речь о настройка 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)
Кластер работает как положено. Для тестов, еще можно выключить одну машину и через некоторое время включить обратно. В этом случаи в кластере будет только две машины, а после включения третей – все данные, которые были добавлены в период колапса будут среплицированы на поднявшуюся ноду.
Как сделать управляющей 2-ю ноду?
Здравствуйте. Это описано в этом FAQ