Как настроить кластер Galera с MySQL 5.6 в Ubuntu 16.04

Вступление

Кластеризация обеспечивает высокую доступность вашей базы данных, распределяя изменения между различными серверами В случае сбоя одного из экземпляров другие уже доступны для продолжения обслуживания.

Кластеры бывают двух основных конфигураций: активно-пассивные и активно-активные. В активно-пассивных кластерах все записи выполняются на одном активном сервере, а затем копируются на один или несколько пассивных серверов, которые могут вступить во владение только в случае сбоя активного сервера. Некоторые активно-пассивные кластеры также допускают операции + SELECT + на пассивных узлах. В активно-активном кластере каждый узел доступен для чтения и записи, а внесенные в него изменения реплицируются на все.

В этом руководстве мы настроим активно-активный кластер MySQL Galera. В демонстрационных целях мы настроим и протестируем три узла, самый маленький настраиваемый кластер.

Предпосылки

Для этого вам понадобятся три сервера Ubuntu 16.04, каждый с:

Как только все эти предварительные условия будут выполнены, мы готовы установить программное обеспечение.

Шаг 1 - Добавление репозитория Galera на все серверы

MySQL, исправленный для включения кластеризации Galera, не включен в стандартные репозитории Ubuntu, поэтому мы начнем с добавления внешних репозиториев Ubuntu, поддерживаемых проектом Galera, на все три наших сервера.

На каждом сервере добавьте ключ хранилища с помощью команды + apt-key, которую` + app` будет использовать для проверки подлинности пакетов.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Получив доверенный ключ в базе данных каждого сервера, мы можем добавить репозитории. Для этого создайте новый файл с именем + galera.list + внутри + / etc / apt / sources.list.d / + на каждом сервере:

sudo nano /etc/apt/sources.list.d/galera.list

В текстовом редакторе добавьте следующие строки, которые сделают соответствующие репозитории доступными для менеджера пакетов APT:

/etc/apt/sources.list.d/galera.list

Сохраните и закройте файл (нажмите + CTRL + X +, + Y +, затем + ENTER +).

Репозитории Codership теперь доступны для всех трех ваших серверов. Однако важно, чтобы вы указали + apt +, чтобы они предпочитали репозитории Codership другим, чтобы обеспечить установку исправленных версий программного обеспечения, необходимого для создания кластера Galera. Для этого создайте еще один новый файл с именем + galera.pref + в каталоге + / etc / apt / preferences.d / +:

sudo nano /etc/apt/preferences.d/galera.pref

Добавьте следующие строки в текстовый редактор:

/etc/apt/preferences.d/galera.pref

# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

Сохраните и закройте этот файл, а затем запустите + sudo apt-get update, чтобы включить манифесты пакетов из новых репозиториев:

sudo apt-get update

Может появиться предупреждение о том, что подпись + использует алгоритм слабого дайджеста (SHA1) +. Существует an открытая проблема на GitHub, чтобы решить эту проблему. А пока можно продолжать.

После обновления репозиториев на всех трех серверах мы готовы установить MySQL и Galera.

Шаг 2 - Установка MySQL и Galera на все серверы

Выполните следующую команду на всех трех серверах, чтобы установить исправленную версию MySQL для работы с Galera, а также с Galera и несколькими зависимостями:

sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6

Во время установки вам будет предложено установить пароль для пользователя-администратора MySQL.

У нас должны быть все необходимые компоненты, чтобы начать настройку кластера, но так как мы будем полагаться на + rsync + в последующих шагах, давайте удостоверимся, что он также установлен на всех трех:

sudo apt-get install rsync

Это подтвердит, что новейшая версия + rsync + уже доступна, предложит вам обновить имеющуюся версию или установить ее.

После того, как мы установили MySQL на каждом из трех серверов, мы можем начать настройку.

Шаг 3 - Настройка первого узла

Каждый узел в кластере должен иметь почти идентичную конфигурацию. Из-за этого мы выполним всю конфигурацию на нашей первой машине, а затем скопируем ее на другие узлы.

По умолчанию MySQL настроен для проверки каталога + / etc / mysql / conf.d + для получения дополнительных настроек конфигурации из файлов, оканчивающихся на + .cnf +. Мы создадим файл в этом каталоге со всеми нашими специфичными для кластера директивами:

sudo nano /etc/mysql/conf.d/galera.cnf

Добавьте следующую конфигурацию в файл. Вам нужно будет изменить настройки, выделенные красным. Мы объясним, что означает каждый раздел ниже.

/etc/mysql/conf.d/galera.cnf на первом узле

[mysqld]
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="test_cluster"
wsrep_cluster_address="gcomm://,,"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
  • * Первый раздел * изменяет или повторно устанавливает параметры MySQL, которые позволят кластеру функционировать правильно. Например, Galera Cluster не будет работать с MyISAM или подобными нетранзакционными механизмами хранения, и + mysqld + не должен быть привязан к IP-адресу для localhost. Вы можете узнать о настройках более подробно на странице конфигурации Galera Cluster system page.

  • * Раздел «Настройка провайдера Galera» * настраивает компоненты MySQL, которые предоставляют API репликации с набором записей. В нашем случае это означает Galera, поскольку Galera является поставщиком wsrep (репликация с набором записей). Мы задаем общие параметры для настройки начальной среды репликации. Для этого не требуется никакой настройки, но вы можете узнать больше о Galera опциях конфигурации.

  • * Раздел «Конфигурация кластера Galera» * определяет кластер, идентифицируя элементы кластера по IP-адресу или разрешаемому имени домена и создавая имя для кластера, чтобы гарантировать, что члены присоединяются к правильной группе. Вы можете изменить + wsrep_cluster_name + на что-то более значимое, чем + test_cluster +, или оставить его как есть, но вы должны _ обновить_ + wsrep_cluster_address + `адресами ваших трех серверов. Если ваши серверы имеют частные IP-адреса, используйте их здесь.

  • * Раздел «Настройка синхронизации Galera» * определяет, как кластер будет взаимодействовать и синхронизировать данные между участниками. Это используется только для передачи состояния, которая происходит, когда узел подключается к сети. Для нашей начальной настройки мы используем + rsync +, потому что он общедоступен и делает то, что нам нужно сейчас.

  • * Раздел «Настройка узла Galera» * уточняет IP-адрес и имя текущего сервера. Это полезно при попытке диагностировать проблемы в журналах и для ссылки на каждый сервер несколькими способами. + Wsrep_node_address + должен совпадать с адресом машины, на которой вы находитесь, но вы можете выбрать любое имя, которое хотите, чтобы помочь вам идентифицировать узел в файлах журнала.

Когда вы будете удовлетворены файлом конфигурации кластера, скопируйте его содержимое в буфер обмена, а затем сохраните и закройте файл.

Теперь, когда первый сервер настроен, мы перейдем к следующим двум узлам.

Шаг 4 - Настройка оставшихся узлов

На каждом из оставшихся узлов откройте файл конфигурации:

sudo nano /etc/mysql/conf.d/galera.cnf

Вставьте конфигурацию, скопированную с первого узла, затем обновите «Конфигурацию узла Galera», чтобы использовать IP-адрес или разрешаемое имя домена для конкретного настраиваемого узла. Наконец, обновите его имя, которое вы можете установить на любое, что поможет вам идентифицировать узел в ваших файлах журнала:

/etc/mysql/conf.d/galera.cnf

. . .
# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
. . .

Сохраните и выйдите из файла на каждом сервере.

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

Шаг 5 - Открытие брандмауэра на каждом сервере

На каждом сервере давайте проверим состояние брандмауэра:

sudo ufw status

В этом случае только SSH разрешен через:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

У вас могут быть другие правила или вообще нет правил брандмауэра. Поскольку в этом случае разрешен только трафик SSH, вам необходимо добавить правила для трафика MySQL и Galera.

Galera может использовать четыре порта:

  • + 3306 + используется для клиентских подключений MySQL и State Snapshot Transfer, которые используют метод mysqldump.

  • + 4567 + используется Galera Cluster для репликации трафика, многоадресная репликация использует как транспорт UDP, так и TCP на этом порту.

  • + 4568 + используется для инкрементной передачи состояния.

  • + 4444 + используется для всех других состояний передачи снимков.

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

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

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

Шаг 6 - Запуск кластера

Для начала нам нужно остановить работающую службу MySQL, чтобы наш кластер мог быть подключен к сети.

Остановите MySQL на всех трех серверах:

Используйте команду ниже на всех трех серверах, чтобы остановить mysql, чтобы мы могли восстановить их в кластере:

sudo systemctl stop mysql

+ systemctl + не отображает результат всех команд управления службами, поэтому, чтобы убедиться в успехе, выполните следующую команду:

sudo systemctl status mysql

Если последняя строка выглядит примерно так, команда прошла успешно.

Output. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.

Как только мы завершим работу + mysql на всех серверах, мы готовы продолжить.

Подними первый узел:

Как мы настроили наш кластер, каждый подключенный узел пытается подключиться хотя бы к одному другому узлу, указанному в его файле + galera.cnf +, чтобы получить его начальное состояние. Обычный + systemctl start mysql потерпит неудачу, поскольку нет узлов, работающих для первого узла, с которым нужно соединиться, поэтому нам нужно передать параметр` + wsrep-new-cluster` первому узлу, который мы запускаем. Однако ни + systemd +, ни + service + должным образом не примут аргумент https://github.com/codership/mysql-wsrep/issues/266 [+ - wsrep-new-cluster + в настоящее время], поэтому нам нужно запустить первый узел, используя скрипт запуска в + / etc / init.d +. Сделав это, вы можете запустить остальные узлы с помощью + systemctl. +

sudo /etc/init.d/mysql start --wsrep-new-cluster

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

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

На остальных узлах мы можем нормально запустить + mysql. Они будут искать любого члена списка кластеров, который находится в сети, поэтому, когда они его найдут, они присоединятся к кластеру.

Подними Второй Узел:

Запустите + mysql:

sudo systemctl start mysql

Мы должны увидеть увеличение размера нашего кластера при подключении каждого узла:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

Подними Третий Узел:

Запустите + mysql:

sudo systemctl start mysql

Если все работает хорошо, размер кластера должен быть равен трем:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

На данный момент весь кластер должен быть в сети и общаться. При этом мы можем проверить репликацию между каждым из узлов кластера.

Шаг 7 - Тестирование репликации

До этого момента мы прошли все этапы, чтобы наш кластер мог выполнять репликацию с любого узла на любой другой узел, известный как активно-активная репликация. Давайте проверим, работает ли репликация должным образом.

Напишите первому узлу:

Начнем с внесения изменений в базу данных на нашем первом узле. Следующие команды создадут базу данных с именем + plays + + и таблицу внутри нее, называемую + 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");'

Теперь у нас есть одно значение в нашей таблице.

Читать и писать на втором узле:

Далее мы рассмотрим второй узел, чтобы убедиться, что репликация работает:

mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Если репликация работает, данные, которые мы ввели на первом узле, будут видны здесь на втором:

Output+----+-------+-------+-------+
| 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;'
Output  +----+-------+-------+--------+
 | 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;'
Output  +----+--------+-------+--------+
 | id | type   | quant | color  |
 +----+--------+-------+--------+
 |  1 | slide  |     2 | blue   |
 |  2 | swing  |    10 | yellow |
 |  3 | seesaw |     3 | green  |
 +----+--------+-------+--------+

Мы проверили, можем ли записывать все узлы, и что репликация выполняется правильно.

Заключение

На этом этапе у вас должен быть настроен работающий тестовый кластер Galera с тремя узлами. Если вы планируете использовать кластер Galera в производственной ситуации, рекомендуется начинать с не менее пяти узлов.

Перед производственным использованием вы, возможно, захотите взглянуть на некоторых из other агентов передачи снимка состояния (sst), таких как «xtrabackup», который позволяет вам настроить новые узлы очень быстро и без больших перерывов в ваших активных узлов. Это не влияет на фактическую репликацию, но является проблемой при инициализации узлов. Наконец, чтобы защитить ваши данные при их перемещении между серверами, вы также должны настроить SSL шифрование.

Related