Кластер MariaDB Galera 10.0

Появилась задача создать надёжный сервис БД типа MySQL. Я предпочитаю MariaDB, которая с версии 10 поддерживает работу master-master, но данная схема работает только для двух серверов и плохо относится к ситуации split-brain.

Выбор пал на MariaDB Galera, которая позволяет использовать multi-master, а в ситуации split-brain работает механизм minority opinion.

Так как это не для домашних целей, платформой будет CentOS 7.

Имеем 3 сервера с адресами:

  • 10.0.0.1 — galera1;
  • 10.0.0.2 — galera2;
  • 10.0.0.3 — galera3.

Все процедуры идентичны, отличается только команда запуска и 2 строчки в файле конфигурации.

Отключаем функции безопасности на время установки, чтобы не нарваться на дополнительные сложности:

# setenforce 0
# systemctl stop firewalld

Добавляем репозиторий в файле /etc/yum.repos.d/MariaDB.repo:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Ставим необходимые пакеты, запускаем сервер БД и проводим базовую настройку (ставим пароль на root, удаляем тестовую БД и отключаем удалённый доступ для root):

# yum  install socat MariaDB-Galera-server MariaDB-client
# service mysql start
# /usr/bin/mysql_secure_installation

Добавляем пользователя для служебных процессов на сервере:

# mysql -u root -p
DELETE FROM mysql.user WHERE user='';
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'dbpass';
GRANT USAGE ON *.* to sst_user@'%' IDENTIFIED BY 'dbpass';
GRANT ALL PRIVILEGES on *.* to sst_user@'%';
FLUSH PRIVILEGES;
quit

После этого тормозим сервер БД:

# service mysql stop

Добавляем настройки для кластера в конец файла /etc/my.cnf.d/server.cnf (меняя $host_ip и $host_name на значения для конкретного сервера):

binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.0.0.1,10.0.0.2,10.0.0.3"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='$host_ip'
wsrep_node_name='$host_name'
wsrep_sst_method=rsync
wsrep_sst_auth=sst_user:dbpass

Для первого запускаемого сервера кластера команда запуска будет следущая (заставит сервер инициализировать кластер, вместо попыток подключиться к существующему, а так как он первый он просто не сможет запуститься):

# /etc/rc.d/init.d/mysql start --wsrep-new-cluster

Для второго и остальных серверов команда запуска:

# service mysql start

Статус кластера можно посмотреть следующей командой:

# mysql -u root -p -e "show status like 'wsrep%'"