Если стоит задача сделать 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.