Galera
Содержание
Настройка Galera
Введение
Существует задача увеличению доступности и отказоустойчивости MySQL и у нее есть много разных решений. Это кластеризация, master реплкация, Master-Slave репликация. В этой статье хочу рассказать об одном из таких решений это Multi-Master репликация на основе Galera.
К плюсам Galera относятся:
- отсутствие единой точки отказа;
- возможность развернуть решение в разных датацентрах для большей отказоустойчивости включая географически удаленные друг от друга;
- синхронизация, отсутствие потери данных при репликации;
- настоящая Мастер репликация;
Ограничения:
- работает только на innoDB;
- при работе с транзацкиями нельзя лочить таблицу.
Мы будем использовать MariaDB и Ubuntu 12.04 LTS.
Схема
Мы будем делать один Multi-Master. В нашем случае сервера образуют единый Galera кластер. Это решение из области High Avalible. Минимальное рекомендуемое количество серверов (нод) - 3шт. Если вы будете использовать две ноды, то возможна ситуация "Split Brain" при падении одной из нод.
Установка
Будет считать что у нас уже установлена Ubuntu. Если установлена MariaDB или MySQL удалите их. На каждой ноде делаем следующие действия.
Вначале поставим ряд библиотек. libaio1 - для асинхронных системных вызовов важных для высокой производительности libssl - ssl libdbd-mysql-perl, libdbi-perl - интерфейс для mysql
apt-get install libaio1 libssl0.9.8 mysql-client libdbd-mysql-perl libdbi-perl
Скачиваем и ставим Galera provider:
wget https://launchpad.net/galera/2.x/23.2.4/+download/galera-23.2.4-i386.deb dpkg -i galera-23.2.4-i386.deb
для amd64
wget https://launchpad.net/galera/2.x/23.2.4/+download/galera-23.2.4-amd64.deb
Скачиваем и ставим патч
wget https://launchpad.net/codership-mysql/5.5/5.5.28-23.7/+download/mysql-server-wsrep-5.5.28-23.7-i386.deb dpkg -i mysql-server-wsrep-5.5.28-23.7-i386.deb
для amd64
wget https://launchpad.net/codership-mysql/5.5/5.5.28-23.7/+download/mysql-server-wsrep-5.5.28-23.7-i386.deb dpkg -i mysql-server-wsrep-5.5.28-23.7-amd64.deb
Будем ловить ошибки здесь /var/log/mysql
mkdir -pv /var/log/mysql && chown mysql:mysql -R /var/log/mysql
Запускаем MySQL и делаем полный доступ для пользователя galera под которым будет осуществляться репликация
service mysql start mysql -p
grant all privileges on *.* to galera@'%' identified by 'pwd'; flush privileges;
Теперь на разных нодах делаем чуть разные вещи. Очень важно, что на первой ноде wsrep_cluster_address="gcomm://" - на момент запуска эта нода будет главной и то, что будет на ней, в итоге будет на всем кластере. Эта опция пригодится в трех случаях:
- когда вы хотите сделать galera кластер на основе текущего сервера;
- если по какой-то причине ваш текущий galera кластер развалился на несколько частей, то вы берете наиболее полную часть и делаете ее главной;
- при первом запуске кластера.
Редактируем файл /etc/mysql/conf.d/wsrep.cnf
- Нода 1
wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="galera" wsrep_cluster_address="gcomm://" wsrep_node_address="gcomm://192.168.1.1" wsrep_sst_method=mysqldump wsrep_sst_auth=galera:pwd
- Нода 2
wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="galera" wsrep_cluster_address="gcomm://192.168.1.1,192.168.1.2,192.168.1.3" wsrep_node_address="gcomm://192.168.1.2" wsrep_sst_method=mysqldump wsrep_sst_auth=galera:pwd
- Нода 3
wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="galera" wsrep_cluster_address="gcomm://192.168.1.1,192.168.1.2,192.168.1.3" wsrep_node_address="gcomm://192.168.1.3" wsrep_sst_method=mysqldump wsrep_sst_auth=galera:pwd
Теперь о очереди перезапускаем все ноды. Начиная с первого, это важно, т.к. нода 1 у нас будет примари, а остальные будут брать данные с нее.
service mysql restart
Смотрим логи. Если ошибок нет, то в ноде 1 указываем
wsrep_cluster_address="gcomm://192.168.1.1,192.168.1.2,192.168.1.3"
и перезапускаем mysql. смотрим логи, в кототрых будет что-то вроде этого:
[Note] WSREP: Quorum results: version = 2, component = PRIMARY, conf_id = 22, members = 3/3 (joined/total),
Пробуем создать таблицу на одной из нод, такая же таблица должны появиться на двух других. Тоже самое будет если вы создаете базы данных, тригеры, пользователей и т.д.. Galera cluster настроен.
Дополнительные опции.
wsrep_sst_method SST - State Snapshot Transfer. Это полная копия данных от одной ноды к другой. Это используется, когда новая нода подключается к кластеру и синхронизируется с данными всего кластера.
Есть два разных пути синхронизиции в galera, через mysqldump и путем копирования фалов. Копирование файлов хороший способ, если сервера являющиеся нодами являются похожими, это делается копированием через rsync или xtrabackup, другой способ основан на mysqldump. Какой выбрать способ решать вам в каждом конкретном случае, лучше начать с mysqldump, т.к. этот способ работает стабильнее.
Данная опция особенно актуальна, если вы используете большие объемы данных.
Остается добавить, что с MariaDB изначально не идет xtrabackup. Нужно его поставить отдельно. На Ubuntu xtrabackup ставим так:
echo -e "# Percona repository list - created 2013-07-12 16:48 UTC\n# http://www.percona.com/doc/percona-server/5.5/installation/apt_repo.html\ndeb http://repo.percona.com/apt precise main\ndeb-src http://repo.percona.com/apt precise main" > /etc/apt/sources.list.d/Percona.list gpg --keyserver hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A && gpg -a --export CD2EFD2A | apt-key apt-get update apt-get -y install percona-toolkit percona-xtrabackup netcat-openbsd
Тестирование
Теперь можно заняться тестированием. При создании таблиц/пользователей/триггеров на одной ноде они будут появляться на двух других. Если этого не происходит, то смотрим логи.
Теперь пробуем отключить например ноду два и после этого на ноду 1 записать данные. В логах вы увидите что-то проде этого
[Note] WSREP: Quorum results: version = 2, component = PRIMARY, conf_id = 19, members = 2/2 (joined/total),
После этого включаем ноду 2 и в логах должно через некоторое время появится следующее:
WSREP: Shifting JOINED -> SYNCED WSREP: Synchronized with group, ready for connections
Проверяем, что в таблицах на ноде 2 появились ранее записанные данные.
В следующий раз более подробно о тестировании под большими нагрузками и с какими проблемами при этом приходится сталкиваться.
Варианты использования
- Galera cluster может быть развернут в разных датацентрах. Датацентры могут быть географически сильно удалены друг от друга.
- Можно использовать балансировщик, например mysql-proxy, HAproxy, GLB (Galera Load Balancer, http://freecode.com/projects/glb )
При использовании балансировщика увеличивается скорость выполнения разных SELECT запросов, за счет того что они выполняются на разных нодах.
Подробно
- http://www.codership.com/files/presentations/Galera_Tutorial_UC2012.pdf
- http://www.codership.com/wiki/doku.php?id=info
03/07/2013 Вы можете связаться со мной public@front.ru