Не так давно я знакомился кластером Galera для MariaDB. Поэтому решил подготовить небольшую шпаргалку о том, как выполняется установка MariaDB Galera Cluster.
Общее описание схемы развертывания
Схема развертывания:
Кластер Galera работает в режиме “active – active”, т.е. каждый узел может как читать данные, так и выполнять запись в базу. Для настройки кластера необходимо минимум три сервера.
В качестве операционной системы на узлах кластера я использовал Ubuntu Server 22.04.
Предварительные требования
Если на узлах вашего кластера включен брандмауэр, то необходимо убедиться в том, что для всех необходимых портов настроены соответствующие исключения. Полный перечень портов для исключения доступен в разделе документации. Кратки приведу список портов, необходимых для корректно работы кластера Galera:
Порт 3306
TCP используется сервером MariaDB по умолчанию. Если вы изменили номер порта, то не забудьте скорректировать номер порта при настройке исключения.- Порт
4567 TCP и UDP используется для репликации
. Порт 4568 TCP
.- Порт
4444
TCP.
Установка MariaDB Galera Cluster
Первый шаг – установка пакета сервера MariaDB:
sudo apt -y install mariadb-server
Теперь я выполню первоначальную настройку безопасности сервера MariaDB:
mysql_secure_installation
Редактируем конфигурационный файл с параметрами для запуска калетра Galera:
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
Контент на первой ноде:
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.10.10.16,10.10.10.17,10.10.10.18"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_cluster_name="MariaDB_Cluster"
wsrep_node_address="10.10.10.16"
Тут важно отменить несколько параметров:
- wsrep_cluster_address – в этом параметры нужно перечислить IP-адреса всех узлов кластера.
- wsrep_cluster_name – этот параметр указывает кластерной имя.
- wsrep_node_address – указывается IP-адрес текущего узла кластера.
На второй и третьей ноде отличается только параметр “wsrep_node_address” – указывается актуальный IP-адрес для кторого и третьего узла соответственно.
wsrep_node_address="10.10.10.29"
В конфигурационной файле /etc/mysql/mariadb.conf.d/50-server.cnf добавить строку:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Вносим изменения:
bind-address = 0.0.0.0
У меня есть статья по оптимизации конфигурационного файла для сервера MySQL. Информация из этой статьи в большей степени применима и для сервера MaraDB.
Пример моего конфигурационного файла /etc/mysql/mariadb.conf.d/50-server.cnf:
[mysqld]
# GENERAL
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid_file = /var/lib/mysql/mysql.pid
user = mysql
port = 3306
bind-address = 0.0.0.0
# INNODB
innodb_buffer_pool_size = 2G
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
# LOGGING
log_error = /var/log/mysql/mysql-error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
# OTHER
tmp_table_size = 32M
max_heap_table_size = 32M
max_connections = 300
thread_cache_size = 30
table_open_cache = 2000
open_files_limit = 65535
Создаем кластер на первом узле:
sudo galera_new_cluster
Перезапускаем службу mariadb на втором и третьем узле кластера:
systemctl restart mariadb
Проверка после установки
Проверяем общее количество узлов в кластере – их должно быть три в нашем случае:
mysql -u root -p -e "show status like 'wsrep_cluster_size'"
Все верно. Теперь попробуем создать тестовую базу и проверим – отреплицируются ли изменения на два оставшихся узла кластера.
Создаем тестовую базу на первом узле кластера. Запускаем клиент MySQL на первом узле:
mysql -u root -p
Создаем тестовую базу данных:
create database tst;
use tst;
create table distro(id int,dist varchar(50));
insert into distro values(1,'Ubuntu');
insert into distro values(2,'CentOS');
insert into distro values(3,'Mint');
Запускаем клиент MySQL на втором узле:
mysql -u root -p
Проверяем доступность данных
select * from tst.distro;
Все хорошо, данные доступны. Аналогичную проверку необходимо выполнить и на третьем узле кластера.
Что-то пошло не так
Если что-то не работает, то без анализа журналов не обойтись. Стандартное расположение журналов сервера MariaDB:
/var/log/mysql/mysql.log
Если вы использовали мой конфигурационный файл выше, то ошибки будут расположены вот в этом журнале:
/var/log/mysql/mysql-error.log
Можно еще посмотреть журнале службы mariadb:
sudo journalctl -u mariadb.service
Анализируем журналы выше, делаем какие-то предположения, меняем настройки и проверяем. Очень часто ответы есть буквально на первых строчках поисковика.