Galera

Материал из OpenWiki
Перейти к: навигация, поиск

Настройка Galera

Введение

Существует задача увеличению доступности и отказоустойчивости MySQL и у нее есть много разных решений. Это кластеризация, master реплкация, Master-Slave репликация. В этой статье хочу рассказать об одном из таких решений это Multi-Master репликация на основе Galera.

К плюсам Galera относятся:

  • отсутствие единой точки отказа;
  • возможность развернуть решение в разных датацентрах для большей отказоустойчивости включая географически удаленные друг от друга;
  • синхронизация, отсутствие потери данных при репликации;
  • настоящая Мастер репликация;


Ограничения:

  • работает только на innoDB;
  • при работе с транзацкиями нельзя лочить таблицу.

Мы будем использовать MariaDB и Ubuntu 12.04 LTS.

Схема

Мы будем делать один Multi-Master. В нашем случае сервера образуют единый Galera кластер. Это решение из области High Avalible. Минимальное рекомендуемое количество серверов (нод) - 3шт. Если вы будете использовать две ноды, то возможна ситуация "Split Brain" при падении одной из нод.

Chema1.png

Установка

Будет считать что у нас уже установлена 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 )

Mysql galera proxy.png


При использовании балансировщика увеличивается скорость выполнения разных SELECT запросов, за счет того что они выполняются на разных нодах.

Подробно


03/07/2013
Вы можете связаться со мной public@front.ru