0

Установка и настройка Percona XtraDB Cluster

Если стоит задача сделать mysql базу данных отказоустойчивой, и при этом распределить нагрузку между серерами, то стоит обратить внимание на Percona XtraDB Cluster.

Вступление

Percona Cluster использует Gallera.

Galera Cluster for MySQL is an easy-to-use high-availability solution
with high system up-time, no data loss, and scalability
for future growth

Собственно Percona — это форк MySQL, в которую парни добавили много вкусных плюшек. При этом настоятельно рекомендуется использовать таблицы типа InnoDB(у percona это XtraDB), а не MyISAM.

The Cluster consists of Nodes. Recommended configuration is to have at least 3 nodes, but you can make it running with 2 nodes as well.

Авторы проекта рекомендуют использовать 3 ноды. От этой рекомендации я отклонятся не буду, поэтому разворачиваю 3 Centos6.

Стоит отметить, что в случае использования XtraDB можно получить:

  • Консистентность данных
  • Доступность

Т.е. данные на всех нодах консистентны, доступность кластера сохраняется при отказе одной ноды. Но при этом отсутствует partitioning tolerance. Это значит, что при потери связи между нодами они не будут работать как две отдельные ноды.

Подотовка нод

Для простоты подготавливаю /etc/hosts. Добавляю туда:

192.168.122.50  percona1.local
192.168.122.51  percona2.local
192.168.122.52  percona3.local

Добавляю репозиторий percona
# yum install http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm

Устанавливаю необходимый для работы Percona XtraDB Cluster пакет. Он необходим для Xtrabackup SST. Подробности в мануале.
EPEL
# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
socat
# yum -y install socat

На данный момент не поддерживается SELinux. Придется его отключить в /etc/sysconfig/selinux

SELINUX=disabled

Не обхожу стороной и firewall. Нужно открыть порты 3306, 4444, 4567, 4568.

Установка Percona кластера

Перед установкой нужно заменить mysql-libs, а затем установить Percona-XtraDB-Cluster-56
# yum update
При этом будет предложено заменить mysql-libs. Соглашаюсь без колебаний.
# yum install Percona-XtraDB-Cluster-56

Нужно создать пользователя для SST. Для этого стартую mysql и создаю пользователя:
# mysql
mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cret_password';
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
mysql> FLUSH PRIVILEGES;

Не буду выкладывать весь my.cnf. Смысла в этом нет, т.к. параметры многих значений звисят от сервера, на котором установлена DB, да и информации в интернетах предостаточно. Укажу, что необходимо для работы узлов в кластере:

# Path to Gallera lib
wsrep_provider=/usr/lib64/libgalera_smm.so
# Addresses other nodes in cluster
wsrep_cluster_address=gcomm://192.168.122.50,192.168.122.51,192.168.122.52
# Количество потоков репликации
wsrep_slave_threads=4
# Method of State Snapshot Transfer
wsrep_sst_method=xtrabackup-v2
# Format of binlog
binlog_format=ROW
# Default storage engine. MyISAM experemental for now.
default_storage_engine=InnoDB
# authoincrement lock method
innodb_autoinc_lock_mode=2
# IP address this node
wsrep_node_address=192.168.122.50
# XtraDB Cluster Name
wsrep_cluster_name=my_centos_cluster
# Authentication data for SST
wsrep_sst_auth="sstuser:s3cret_password"

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

Первая нода запускается:
# /etc/init.d/mysql bootstrap-pxc
Это означает, что при первом запуске именно эта нода является источником информации.
Остальные ноды запускаются проще:
# /etc/init.d/mysql start
В дальнейшем, если кластер не падал, то любая нода запускается ключом start.

Восстановление кластера

В случае, если встал весь кластер (кстати, на одной ноде он работать не будет), то необходимо остановить все ноды, запустить одну с ключом bootstrap-pxc, остальные просто start.

Остальные ноды делаю по аналогии и запускаю. Особое внимание обращаю на firewall.
Дальнейший шаг — настройка load balancer’а, например haproxy.

Alexey Egorychev

FreeBSD and Linux sysadmin. Know many systems like mailsystems, DB, WWW stack. Automation with salt, ansible. Monitoring with nagios, zabbix.