Создание многоузлового кластера MySQL в Ubuntu 18.04

MySQL Cluster – это технология кластеризации, которая обеспечивает высокую доступность и пропускную способность. Если вы уже знакомы с другими кластерными технологиями, вы увидите, что кластеры MySQL имеют много общего с ними. В кластере находится одна или несколько ведущих нод, которые управляют остальными нодами, на которых хранятся данные. Ведущие ноды сообщают клиентам (серверам MySQL или встроенным API), к какой ноде им подключиться.

Часто в кластерах вместо репликации используется синхронизация данных. Для этого необходима специальная система управления данными NDB Cluster (NDB). Кластер следует рассматривать как единое окружение MySQL с резервными компонентами. Таким образом, один кластер MySQL может участвовать в репликации с другими кластерами MySQL.

MySQL cluster лучше всего работает в неразделяемом окружении (то есть, в идеале два компонента не должны совместно использовать одни и те же аппаратные средства).

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

Требования

Для работы вам понадобится 3 сервера: два будут нодами MySQL (ndbd), а оставшийся будет менеджером кластера (ndb_mgmd) и сервером/клиентом MySQL (mysqld and mysql).

Примечание: Серверы должны находиться в одном датацентре и иметь доступ к частной сети.

Требования к серверам:

  • Система Ubuntu 18.04.
  • Пользователь с доступом к sudo.

Настроить серверы вам поможет этот мануал.

Не забудьте записать внутренние IP-адреса серверов. В данном мануале мы используем такие адреса:

  • 198.51.100.0 – первая нода MySQL Cluster.
  • 198.51.100.1 – вторая нода.
  • 198.51.100.2 – менеджер кластера и серверная нода MySQL.

Замените условные IP-адреса адресами своих серверов.

1: Установка и настройка менеджера MySQL Cluster

Для начала загрузите и установите ndb_mgmd, менеджер MySQL Cluster.

Для этого нужно получить соответствующий инсталлятор .deb с официального сайта MySQL Cluster.

Откройте страницу загрузок и в Select Operating System выберите Ubuntu Linux. Затем в Select OS Version выберите Ubuntu Linux 18.04 (x86, 64-bit).

Прокрутите вниз до «DEB Package, NDB Management Server» и нажмите Download для пакета без dbgsym (если только вам не нужны символы отладки). Вы попадете на страницу Begin Your Download. Здесь кликните правой кнопкой на No thanks, just start my download. Скопируйте ссылку на файл .deb.

Войдите на сервер Cluster Manager (198.51.100.2), загрузите файл:

cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-community-management-server_7.6.6-1ubuntu18.04_amd64.deb

Установите ndb_mgmd с помощью dpkg:

sudo dpkg -i mysql-cluster-community-management-server_7.6.6-1ubuntu18.04_amd64.deb

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

Менеджер кластера должен быть первым компонентом, запускаемым в любом кластере MySQL. Для этого требуется передать файл конфигурации в качестве аргумента его исполняемому файлу. Создайте файл конфигурации /var/lib/mysql-cluster/config.ini и используйте его для этой цели.

На менеджере создайте каталог /var/lib/mysql-cluster, в котором будет находиться этот файл:

sudo mkdir /var/lib/mysql-cluster

Затем создайте и отредактируйте конфигурационный файл с помощью любого удобного текстового редактора:

sudo nano /var/lib/mysql-cluster/config.ini

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

[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2  # Number of replicas
[ndb_mgmd]
# Management process options:
hostname=198.51.100.2 # Hostname of the manager
datadir=/var/lib/mysql-cluster  # Directory for the log files
[ndbd]
hostname=198.51.100.0 # Hostname/IP of the first data node
NodeId=2            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files
[ndbd]
hostname=198.51.100.1 # Hostname/IP of the second data node
NodeId=3            # Node ID for this data node
datadir=/usr/local/mysql/data   # Remote directory for the data files
[mysqld]
# SQL node options:
hostname=198.51.100.2 # In our case the MySQL Server/client is on the same Server as the cluster manager

После этого не забудьте заменить указанные выше условные значения правильными IP-адресами серверов. Установка параметра hostname является важной мерой безопасности – это препятствует подключению других серверов к Cluster Manager.

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

Это сокращенный файл конфигурации для кластера MySQL с минимальными настройками. Вы должны настроить параметры в этом файле в зависимости от потребностей вашей среды производства. Образец полностью сконфигурированного файла ndb_mgmd можно найти в документации MySQL Cluster.

В вышеприведенном файле вы можете указать дополнительные компоненты, такие как ноды данных (ndbd) или ноды сервера MySQL (mysqld). Для этого просто добавьте экземпляры в соответствующий раздел.

Теперь можно запустить менеджер, выполнив бинарный файл ndb_mgmd и указав его конфигурационный файл с помощью флага -f:

sudo ndb_mgmd -f /var/lib/mysql-cluster/config.ini
MySQL Cluster Management Server mysql-5.7.22 ndb-7.6.6
2018-07-25 21:48:39 [MgmtSrvr] INFO     -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it...
2018-07-25 21:48:39 [MgmtSrvr] INFO     -- Successfully created config directory

Это означает, что сервер-менеджер кластера MySQL успешно установлен и теперь запущен на вашем сервере.

В идеале менеджер кластера должен запускаться автоматически при загрузке сервера. Для этого создайте сервис systemd и добавьте его в автозагрузку.

Но сначала нужно остановить работающий сервер:

sudo pkill -f ndb_mgmd

Теперь откройте и отредактируйте следующий юнит-файл systemd:

sudo nano /etc/systemd/system/ndb_mgmd.service

Вставьте в него:

[Unit]
Description=MySQL NDB Cluster Management Server
After=network.target auditd.service
[Service]
Type=forking
ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

Файл содержит минимальный набор параметров, которые сообщают systemd о том, как запустить, остановить и перезапустить процесс ndb_mgmd. Чтобы узнать больше о параметрах, используемых в такой конфигурации, обратитесь к руководству по systemd.

Сохраните и закройте файл.

Теперь перезагрузите конфигурацию systemd менеджера с помощью daemon-reload:

sudo systemctl daemon-reload

Включите сервис, который вы только что создали, чтобы добавить его в автозагрузку:

sudo systemctl enable ndb_mgmd

Теперь запустите сервис:

sudo systemctl start ndb_mgmd

Убедитесь, что сервис NDB Cluster Management запущен успешно:

sudo systemctl status ndb_mgmd
ndb_mgmd.service - MySQL NDB Cluster Management Server
Loaded: loaded (/etc/systemd/system/ndb_mgmd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-07-26 21:23:37 UTC; 3s ago
Process: 11184 ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini (code=exited, status=0/SUCCESS)
Main PID: 11193 (ndb_mgmd)
Tasks: 11 (limit: 4915)
CGroup: /system.slice/ndb_mgmd.service
└─11193 /usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Такой вывод указывает, что менеджер кластера MySQL ndb_mgmd теперь работает как сервис systemd.

Последним шагом в настройке менеджера будет поддержка входящих соединений от других нод MySQL Cluster в этой частной сети.

Примечание: Если при настройке этого сервера вы не настроили брандмауэр ufw, вы можете просто перейти к следующему разделу.

Добавьте правила, пропускающие локальные входящие соединения с обоих нод данных:

sudo ufw allow from 198.51.100.0
sudo ufw allow from 198.51.100.1

Вы получите такой вывод:

Rule added

Менеджер кластера настроен и запущен, а также поддерживает соединения с нодами по частной сети.

2: Установка и настойка нод данных

Примечание: Все команды этого раздела нужно выполнить на обеих нодах данных.

Теперь пора установить демон нод данных ndbd и настроить ноды для взаимодействия с менеджером.

Для этого нужно получить соответствующий инсталлятор .deb с официального сайта MySQL Cluster.

Откройте страницу загрузок и в Select Operating System выберите Ubuntu Linux. Затем в Select OS Version выберите Ubuntu Linux 18.04 (x86, 64-bit).

Прокрутите вниз до «DEB Package, NDB Data Node Binaries» и нажмите Download для пакета без dbgsym (если только вам не нужны символы отладки). Вы попадете на страницу Begin Your Download. Здесь кликните правой кнопкой на No thanks, just start my download. Скопируйте ссылку на файл .deb.

Войдите на сервер первой ноды (198.51.100.0), загрузите файл:

cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster-community-data-node_7.6.6-1ubuntu18.04_amd64.deb

Затем нужно установить зависимость:

sudo apt update
sudo apt install libclass-methodmaker-perl

Теперь можно установить пакет:

sudo dpkg -i mysql-cluster-community-data-node_7.6.6-1ubuntu18.04_amd64.deb

Ноды данных берут свои конфигурации из стандартного файла MySQL /etc/my.cnf. Создайте его и откройте в редакторе:

sudo nano /etc/my.cnf

Добавьте в файл такой параметр:

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=198.51.100.2  # location of cluster manager

Расположение менеджера кластера является единственной конфигурацией, необходимой для запуска ndbd. Остальная конфигурация будет загружена непосредственно с менеджера.

Сохраните и закройте файл.

В данном примере нода данных узнает, что ее каталог данных находится в /usr/local/mysql/data, в конфигурации менеджера. Перед запуском демона создайте этот каталогг:

sudo mkdir -p /usr/local/mysql/data

Запустите ноду данных:

sudo ndbd
2018-07-18 19:48:21 [ndbd] INFO     -- Angel connected to '198.51.100.2:1186'
2018-07-18 19:48:21 [ndbd] INFO     -- Angel allocated nodeid: 2

Демон ноды данных NDB был успешно установлен и теперь запущен на вашем сервере.

Также необходимо разрешить входящие соединения от других нод MySQL Cluster в частной сети.

Примечание: Если при настройке этого сервера вы не включили брандмауэр ufw, вы можете просто перейти к следующему разделу.

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

sudo ufw allow from 198.51.100.0
sudo ufw allow from 198.51.100.2

После ввода команд вы увидите:

added

Теперь нода данных MySQL может взаимодействовать с менеджером и второй нодой данных по частной сети.

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

Сначала остановите процесс ndbd:

sudo pkill -f ndbd

Откройте и отредактируйте юнит-файл:

sudo nano /etc/systemd/system/ndbd.service

Вставьте такой код:

[Unit]
Description=MySQL NDB Data Node Daemon
After=network.target auditd.service
[Service]
Type=forking
ExecStart=/usr/sbin/ndbd
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

Файл содержит минимальный набор параметров, которые сообщают systemd о том, как запустить, остановить и перезапустить процесс ndbd. Чтобы узнать больше о параметрах, используемых в такой конфигурации, обратитесь к руководству по systemd.

Сохраните и закройте файл.

Теперь перезагрузите конфигурацию systemd менеджера с помощью daemon-reload:

sudo systemctl daemon-reload

Включите сервис, который вы только что создали, чтобы добавить его в автозагрузку:

sudo systemctl enable ndbd

Теперь запустите сервис:

sudo systemctl start ndbd

Убедитесь, что сервис ndbd запущен успешно:

sudo systemctl status ndbd
ndbd.service - MySQL NDB Data Node Daemon
Loaded: loaded (/etc/systemd/system/ndbd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-07-26 20:56:29 UTC; 8s ago
Process: 11972 ExecStart=/usr/sbin/ndbd (code=exited, status=0/SUCCESS)
Main PID: 11984 (ndbd)
Tasks: 46 (limit: 4915)
CGroup: /system.slice/ndbd.service
├─11984 /usr/sbin/ndbd
└─11987 /usr/sbin/ndbd

Такой вывод указывает, что демон ноды данных MySQL теперь работает как сервис systemd.

Закончив настройку первой ноды, повторите шаги этого раздела на второй ноде данных (198.51.100.1).

3: Настройка и запуск сервера и клиента MySQL

Стандартный сервер MySQL, который доступен в репозитории APT Ubuntu, не поддерживает механизм NDB MySQL Cluster. Это означает, что вам нужно установить SQL-сервер, упакованный вместе с другим программным обеспечением MySQL Cluster, которое вы установили ранее.

Загрузите двоичный код MySQL Cluster Server с официальной страницы MySQL Cluster.

Откройте страницу загрузок и в Select Operating System выберите Ubuntu Linux. Затем в Select OS Version выберите Ubuntu Linux 18.04 (x86, 64-bit).

Прокрутите вниз до DEB Bundle и нажмите Download (пакет будет первым в списке). Вы попадете на страницу Begin Your Download. Здесь кликните правой кнопкой на No thanks, just start my download. Скопируйте ссылку на tar архив.

Войдите на сервер менеджера кластера(198.51.100.2), загрузите этот архив (напоминаем, что в среде производства совмещать сервер MySQL и менеджер кластера на одной ноде не рекомендуется, лучше использовать для этого отдельные машины).

cd ~
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.6/mysql-cluster_7.6.6-1ubuntu18.04_amd64.deb-bundle.tar

Теперь распакуйте архив в каталог install. Создайте его:

mkdir install

Извлеките архив в этот каталог:

tar -xvf mysql-cluster_7.6.6-1ubuntu18.04_amd64.deb-bundle.tar -C install/

Перейдите в него:

cd install

Прежде чем установить сервер MySQL, установите его зависимости:

sudo apt update

sudo apt install libaio1 libmecab2

Теперь установите зависимости MySQL Cluster, которые поставляются вместе с распакованным только что архивом.

sudo dpkg -i mysql-common_7.6.6-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql-cluster-community-client_7.6.6-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql-client_7.6.6-1ubuntu18.04_amd64.deb
sudo dpkg -i mysql-cluster-community-server_7.6.6-1ubuntu18.04_amd64.deb

При установке mysql-cluster-community-server должно появиться сообщение о конфигурации, в котором будет предложено указать пароль root вашей базы данных MySQL. Выберите надежный пароль и нажмите <Ok>. Повторно введите этот root пароль при появлении запроса и нажмите <Ok> еще раз, чтобы завершить установку.

Теперь можно установить сервер MySQL с помощью dpkg:

mysql-server_7.6.6-1ubuntu18.04_amd64.deb

После этого нужно настроить установку сервера.

Конфигурационный файл MySQL Server хранится в /etc/mysql/my.cnf.

Откройте его в редакторе:

sudo nano /etc/mysql/my.cnf

Вы увидите:

# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
#
# The MySQL Cluster Community Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

Вставьте в файл такие строки:

. . .
[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine
[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=198.51.100.2  # location of management server

Сохраните и закройте файл.

Перезапустите сервер MySQL:

sudo systemctl restart mysql

MySQL по умолчанию запускается автоматически после перезагрузки сервера. Если этого не случилось, введите:

sudo systemctl enable mysql

Теперь сервер SQL запущен на сервере Cluster Manager / MySQL Server.

Пора убедиться, что установка MySQL Cluster работает должным образом.

4: Тестирование установки MySQL Cluster

Чтобы протестировать работу установки, войдите на сервер Cluster Manager / SQL Server.

Откройте клиент в командной строке и подключитесь к аккаунту root:

mysql -u root -p

По запросу введите свой пароль и нажмите Enter. Появится такой вывод:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.22-ndb-7.6.6 MySQL Cluster Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

В оболочке клиента MySQL введите команду:

SHOW ENGINE NDB STATUS \G

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

*************************** 1. row ***************************
Type: ndbcluster
Name: connection
Status: cluster_node_id=4, connected_host=198.51.100.2, connected_port=1186, number_of_data_nodes=2, number_of_ready_data_nodes=2, connect_count=0
. . .

Это означает, что вы успешно подключились к вашему кластеру MySQL.

Наиболее важной строкой является number_of_ready_data_nodes. Как видите, в кластере запущено две ноды. Такая избыточность обеспечивает работу кластера MySQL даже в случае сбоя одной из нод. Кроме того, запросы SQL будут распределяться между двумя нодами.

Попробуйте отключить одну ноду, чтобы протестировать надёжность кластера. Проще всего перезапустить сервер, чтобы выполнить полную проверку процесса восстановления. Вы увидите, что значение number_of_ready_data_nodes изменится:  сначала появится 1, а после перезагрузки ноды снова станет 2.

Чтобы выйти из командной строки MySQL, просто введите quit или нажмите CTRL-D.

Это первый тест, который показывает, что кластер MySQL, сервер и клиент работают. Теперь нужно провести дополнительный тест, чтобы убедиться, что кластер работает правильно.

Откройте консоль управления кластером, ndb_mgm:

ndb_mgm

Вы увидите:

-- NDB Cluster -- Management Client --
ndb_mgm>

Введите команду:

SHOW

Нажмите Enter. Вы должны получить такой вывод:

Connected to Management Server at: 198.51.100.2:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2    @198.51.100.0  (mysql-5.7.22 ndb-7.6.6, Nodegroup: 0, *)
id=3    @198.51.100.1  (mysql-5.7.22 ndb-7.6.6, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @198.51.100.2  (mysql-5.7.22 ndb-7.6.6)
[mysqld(API)]   1 node(s)
id=4    @198.51.100.2  (mysql-5.7.22 ndb-7.6.6)

Этот вывод показывает, что в кластере есть две ноды данных, связанные с node-ids 2 и 3. Существует также одна нода-менеджер с id 1 и один сервер MySQL с node-id 4. Вы можете получить больше информации о каждом id, введя его номер вместе с командой STATUS:

2 STATUS

Эта команда выведет состояние ноды 2, версию MySQL и NDB:

Node 2: started (mysql-5.7.22 ndb-7.6.6)

Чтобы выйти из консоли управления, введите quit и нажмите Enter.

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

5: Добавление данных в кластер

Чтобы продемонстрировать работу кластера. Попробуйте создать новую таблицу NDB и вставить в неё какие-нибудь данные.

Примечание: В кластере необходимо использовать именно NDB (не InnoDB и другие предлагаемые варианты). В противном случае кластер не будет работать должным образом.

Создайте БД clustertest:

CREATE DATABASE clustertest;

Откройте новую БД:

USE clustertest;

Создайте простую таблицу test_table:

CREATE TABLE test_table (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster;

Чтобы использовать кластер, нужно явно указать ndbcluster. Вставьте данные в таблицу:

INSERT INTO test_table (name,value) VALUES('some_name','some_value');

Чтобы убедиться, что данные были помещены в БД, запросите их:

SELECT * FROM test_table;

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

Вы также можете сделать ndbcluster механизмом хранения по умолчанию – это делается в файле my.cnf, который вы редактировали ранее. Если вы это сделаете, вам не нужно будет указывать параметр ENGINE при создании таблиц. Чтобы узнать больше, обратитесь к руководству по MySQL.

Заключение

Как видите, установка и настройка MySQL cluster на серверах Ubuntu 18.04 – довольно простой процесс. Конечно, в мануале представлена только базовая установка. Существует множество более продвинутых опций и возможностей. Для получения дополнительной информации, пожалуйста, перейдите к официальной документации кластера MySQL.

Tags: , , ,