Кластеризация обеспечивает высокую доступность данных путем передачи изменений на разные серверы, потенциально расположенные в разных центрах обработки данных. Если один из серверов отказывает, другие серверы продолжают обслуживать полученные данные.
Кластеры делятся на два типа: активно-пассивные (active-passive) и активно-активные (active-active).
В первом случае все операции записи происходят на одном активном (ведущем) сервере, после чего обновления копируются пассивными (или ведомыми) серверами. В случае сбоя активного сервера один из пассивных серверов занимает его место. Некоторые кластеры типа active-passive поддерживают операцию SELECT на пассивных нодах. В кластерах второго типа все ноды могут выполнять операции чтения и записи; изменение, внесённое на один из серверов, скопируется остальными серверами.
MariaDB – это открытая система управления реляционными базами данных, полностью совместимая с популярной системой MySQL. Galera – это средство для кластеризации баз данных, которое позволяет настраивать кластеры с несколькими мастерами и синхронной репликацией. Galera автоматически выполняет синхронизацию данных на разных нодах, позволяя отправлять запросы на чтение и запись на любую ноду в кластере.
Данный мануал поможет настроить активно-активный кластер Galera на БД MariaDB.
Установка MariaDB
Начиная с версии 10.1, MariaDB объединяет пакеты MariaDB Server и MariaDB Galera Server в один пакет. Потому достаточно установить mariadb-server, а Galera и несколько зависимостей установятся автоматически.
Существуют следующие основные пакеты связанные с mariadb:
- mariadb-client — клиент mariadb
- mariadb-server — сервер mariadb
apt install mariadb-server
В Debian и его производных, таких как Ubuntu, распространена практика автоматического запуска и включения демонов через systemd сразу после их установки. То же самое относится и к сервису MariaDB. Вы можете проверить, работает ли служба MariaDB, с помощью следующей команды.
systemctl status mariadb
Кроме того, вам также необходимо знать другие общие команды для управления службой MariaDB в systemd, которые включают команды для запуска, перезапуска, остановки и перезагрузки службы MariaDB, как показано.
systemctl start mariadb systemctl restart mariadb systemctl stop mariadb systemctl reload mariadb
Теперь у вас есть все необходимые компоненты для настройки кластера, нужно только убедиться, что на сервере есть rsync:
sudo apt install rsync
Это установит новейшую версию rsync или предложит обновить до нее вашу текущую установку.
Настройка MariaDB
Процесс установки MariaDB включает в себя защиту установки по умолчанию, и это можно сделать, запустив сценарий оболочки mysql_secure_installation, который позволит вам добавить немного дополнительной безопасности к вашему экземпляру MariaDB c помощью:
- Установки пароля для учетных записей root.
- Отключения удаленного входа в систему root.
- Удаления учетных записей анонимных пользователей.
- Удаления тестовой базы данных, к которой по умолчанию могут обращаться анонимные пользователи.
Чтобы вызвать сценарий безопасности, выполните следующую команду и ответьте на вопросы.
mysql_secure_installation
Запустится скрипт, с запросами на то или иное действие. Вот ответы:
- Skip root password for root
Мы еще не устанавливали пароль для root, поэтому при запуске скрипта и запросе пароля для root, просто нажмите Enter. - Install new password for root: security
А вот тут можно установить пароль для root - Do remove an anonymous user
На вопрос о том, удалить ли анонимного пользователя, отвечаем да - Do not disallow remote connections
Не запрещаем коннект к нашему северу с удаленных серверов (если, конечно, эта опция вам нужна, в другом случае, запретите ее) - Do remove a test database
Тестовая база нам не нужна — удаляйте ее - Do reload the privileges
Перегрузим привилегии для их активации
После того, как вы защитили установку MariaDB, вы можете подключиться к оболочке mysql, используя пароль пользователя root.
mysql -u root -p MariaDB [(none)]> exit;
Настройка hosts
nano /etc/hosts 127.0.0.1 localhost nameserver 10.0.0.1 n1 10.0.0.2 n2 10.0.0.3 n3 10.0.0.4 n4 10.0.0.254 db
на всех нодах.
Настройка первой ноды n1
Все ноды кластера будут использовать почти одинаковые настройки. Потому сначала можно настроить одну машину, а затем просто скопировать её конфигурации на остальные ноды.
nano /etc/mysql/mariadb.conf.d/60-galera.cnf
Скопируйте и вставьте в него следующий код. В этой конфигурации указываются различные параметры кластера, сведения о текущем сервере и других серверах в кластере, а также параметры репликации. Обратите внимание, что в конфигурации нужно указывать внутренние IP-адреса ваших серверов.
[galera] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name="db_cluster" wsrep_cluster_address="gcomm://n2, n3, n4" # Galera Synchronization Configuration wsrep_sst_method=rsync # Galera Node Configuration wsrep_node_address="10.0.0.1" wsrep_node_name="n1"
- Первый раздел изменяет или повторно задаёт настройки MariaDB/MySQL, необходимые для корректной работы кластера. Например, Galera Cluster не сможет работать с MyISAM и подобными нетранзакционными системами хранения. Также mysqld нельзя связывать с IP-адресом локального хоста.
- Раздел Galera Provider Configuration настраивает компоненты MariaDB, которые предоставляют интерфейс репликации WriteSet.
- Раздел Galera Cluster Configuration определяет ноды, входящие в кластер, с помощью IP-адреса или доменного имени, а также задает имя кластера (благодаря чему все члены кластера входят в одну группу). Замените условные данные своими данными; вместо wsrep_cluster_name укажите более описательное имя (или оставьте все как есть). Вместо wsrep_cluster_address укажите внутренние IP-адреса нод кластера.
- Раздел Galera Synchronization Configuration указывает, как кластер будет взаимодействовать и синхронизировать данные между нодами, которые находятся в сети. Для этого в данном мануале используется rsync.
- Раздел Galera Node Configuration задаёт IP-адрес и имя текущего сервера. Это помогает при диагностике проблем в логах и позволяет ссылаться на сервер. Вместо wsrep_node_address укажите адрес текущей машины, а затем присвойте ей уникальное имя.
Теперь, когда вы успешно настроили свою первую ноду, вы можете перейти к настройке оставшихся нод.
Настройка остальных нод
Теперь нужно создать конфигурационный файл на других нодах кластера. Откройте файл:
nano /etc/mysql/mariadb.conf.d/60-galera.cnf
[galera] binlog_format=ROW default-storage-engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera Provider Configuration wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera Cluster Configuration wsrep_cluster_name="db_cluster" wsrep_cluster_address="gcomm://n1, n3, n4" # Galera Synchronization Configuration wsrep_sst_method=rsync # Galera Node Configuration wsrep_node_address="10.0.0.2" wsrep_node_name="n2"
Повторите эти действия на оставшейся ноде.
Кластер почти готов, осталось только открыть порты в брандмауэре.
Настройка брандмауэра
Galera использует четыре порта:
- 3306: для соединения с клиентами MySQL и для State Snapshot Transfer (работает через метод mysqldump).
- 4567: для репликации Galera Cluster и для многоадресной репликации по UDP и TCP.
- 4568: Incremental State Transfer.
- 4444: остальные операции State Snapshot Transfer.
Откройте эти порты. Убедившись, что репликация работает, вы сможете закрыть все ненужные порты и ограничить трафик только серверами кластера.
Чтобы открыть порты, используйте:
ufw allow from ip_address_nodes to any port 3306 ufw allow from ip_address_nodes to any port 4567 ufw allow from ip_address_nodes to any port 4568 ufw allow from ip_address_nodes to any port 4444/tcp ufw allow from ip_address_nodes to any port 4567/udp
Не забудьте повторить это на остальных нодах.
Теперь можно запустить кластер.
Запуск кластера
Запустите кластер MariaDB. Но для начала вам нужно остановить текущий сервис MariaDB.
systemctl stop mysql
Запуск первой ноды
Чтобы запустить первую ноду, используйте специальный загрузочный скрипт. Согласно настройкам кластера каждая запущенная нода будет пытаться подключиться хотя бы к одной из нод, перечисленных в файле galera.cnf. Без сценария galera_new_cluster, который позволяет системе systemd отправить флаг –wsrep-new-cluster, обычная команда запуска кластера не сработает, потому что на данный момент не существует нод, к которым можно подключиться.
sudo galera_new_cluster sudo systemctl start mysql После успешного выполнения скрипта нода регистрируется как часть кластера. Чтобы убедиться в этом, запустите:
sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
На остальных нодах можно использовать стандартную команду mysql. Она найдет доступные ноды кластера и подключится к ним.
Запуск второй ноды
Чтобы запустить вторую ноду, запустите mysql:
sudo systemctl start mysql
При успешном выполнении команды выходные данные не будут отображаться. Размер кластера будет увеличиваться при подключении каждой новой ноды:
sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
Запуск третьей ноды
Запустите команду mysql:
sudo systemctl start mysql
Если нода запущена успешно, размер кластера увеличится:
sudo mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'" +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
Теперь кластер запущен, а ноды могут взаимодействовать между собой.
Тестирование репликации
Теперь нужно убедиться, что ноды кластера успешно реплицируют данные.
Внесите изменения в БД на первой ноде.
Запись данных на первой ноде
Создайте на первой ноде новую базу данных. Следующие команды создадут БД playground и таблицу equipment.
mysql -u root -p -e 'CREATE DATABASE playground; CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id)); INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
В предыдущей команде оператор CREATE DATABASE создает базу данных playground. Оператор CREATE создает в ней таблицу equipment, в которой есть столбец id с автоинкрементом и другие столбцы. Столбцы type, quant и color нужны для хранения типа, количества и цвета оборудования. Оператор INSERT вставляет запись type slide, quantity 2, color blue.
Чтение и запись на второй ноде
Теперь перейдите на вторую ноду и убедитесь, что кластер выполняет репликацию:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Если репликация работает правильно, данные, введённые на первой ноде, появятся в БД второй ноды.
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+
Добавьте в кластер новые данные:
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
Чтение и запись на третьей ноде
Затем перейдитена третью ноду и просмотрите БД. Теперь она должна содержать новые данные, добавленные на первой и второй ноде.
mysql -u root -p -e 'SELECT * FROM playground.equipment;' +----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+
Добавьте в таблицу еще одно новое значение:
mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
Чтение на первой ноде
Теперь вернитесь на первую ноду. Запросите данные БД:
mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Вы увидите такой вывод, в котором будут содержаться все новые данные, добавленные со всех нод кластера:
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+
Как видите, репликация данных успешно работает в кластере.
В случае команда galera_new_cluster не работает.
проблема решена путем редактирования файла /var/lib/mysql/grastate.dat и изменения safe_to_bootstrap на 1.
после этого galera_new_cluster работает.
Добавить комментарий