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

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

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

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

Требования

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

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

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

  • Настроенная система Ubuntu 16.04, 1 GB RAM.
  • Не-root пользователь с доступом к команде sudo (все команды в руководстве нужно выполнять в сессии этого пользователя).
  • Настроенная частная сеть; не забудьте создать пользовательские записи. Поместите в /etc/hosts записи для серверов: 10.XXX.XX.X node1.mysql.cluster, 10.YYY.YY.Y node2.mysql.cluster, 10.ZZZ.ZZ.Z manager.mysql.cluster. Замените условные IP-адреса адресами своих серверов.

Примечание: MySQL Cluster хранит множество данных в RAM, потому серверы должны иметь минимум 1 Гб памяти.

1: Загрузка и установка MySQL Cluster

На момент написания статьи последней версией пакета MySQL Cluster является 7.4.11. Программа основана на MySQL 5.6 и включает:

  • Программное обеспечение для ведущего сервера (cluster manager).
  • Программное обеспечение для ведомого сервера (data node manager).
  • Бинарные файлы сервера и клиента MySQL 5.6

Вы можете загрузить бесплатный общедоступный релиз MySQL Cluster с официальной страницы проекта. Откройте эту страницу, выберите пакет для Debian Linux. Также при выборе пакета следует учитывать архитектуру системы; выберите пакет согласно используемой архитектуре (для 32-битной или 64-битной). Загрузите установочный пакет на каждый сервер кластера.

Примечание: Инструкции по установке программы одинаковы для всех кластеров вне зависимости от их роли. Выполните данный раздел на всех серверах кластера.

Прежде чем приступить к установке, нужно установить пакет libaio1.

sudo apt-get install libaio1

Затем установите пакет MySQL Cluster:

sudo dpkg -i mysql-cluster-gpl-7.4.11-debian7-x86_64.deb

Пакет MySQL Cluster будет помещён в каталог /opt/mysql/server-5.6/. Все бинарные файлы хранятся в каталоге /opt/mysql/server-5.6/bin/.

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

2: Настройка и запуск ведущего сервера

Теперь нужно настроить ведущий сервер, manager.mysql.cluster. Это обеспечит синхронизацию данных и распределение нагрузки между ведомыми серверами.

Перейдите на сервер, который будет ведущим в кластере.

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

Итак, создайте на сервере manager.mysql.cluster каталог для хранения этого файла:

sudo mkdir /var/lib/mysql-cluster

Затем создайте сам файл:

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

Поместите в файл следующий код:

[ndb_mgmd] # Management process options:
hostname=manager.mysql.cluster  # Hostname of the manager
datadir=/var/lib/mysql-cluster  # Directory for the log files
[ndbd] hostname=node1.mysql.cluster    # Hostname of the first data node
datadir=/usr/local/mysql/data   # Remote directory for the data files
[ndbd] hostname=node2.mysql.cluster    # Hostname of the second data node
datadir=/usr/local/mysql/data   # Remote directory for the data files
[mysqld] # SQL node options:
hostname=manager.mysql.cluster  # In our case the MySQL server/client is on the same Droplet as the cluster manager

Для каждого компонента нужно определить параметр hostname. Это важная мера безопасности, которая блокирует доступ к менеджеру всем хостам, кроме указанных. Таким образом, только указанные хосты будут подключаться к кластеру и выполнять отведённую роль.

Более того, параметр hostname указывает, какой интерфейс будет использовать сервис. Это имеет очень важное значение для безопасности кластера, поскольку в данном случае вышеуказанные доменные имена указывают на приватные IP-адреса, которые указаны в файле /etc/hosts. Таким образом, любой посторонний доступ к сервисам будет заблокирован.

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

Теперь можно запустить ведущий сервер. Дял этого нужно выполнить файл ndb_mgmd, указав конфигурационный файл с помощью аргумента –f.

sudo /opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

На экране должно появиться такое сообщение:

MySQL Cluster Management Server mysql-5.6.29 ndb-7.4.11

Теперь рекомендуется настроить автозапуск ведущего сервера кластера. К сожалению, общедоступный релиз MySQL Cluster не предоставляет сценария запуска, но вы можете самостоятельно скачать такой сценарий. В целом достаточно просто добавить команду start в файл /etc/rc.local. это обеспечит автозапуск сервиса во время запуска системы. Однако для начала нужно убедиться, что система читает файл /etc/rc.local во время загрузки. В Ubuntu 16.04 нужно запустить такую команду:

sudo systemctl enable rc-local.service

Теперь отредактируйте /etc/rc.local:

sudo nano /etc/rc.local

Добавьте необходимую команду перед exit:

...
/opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
exit 0

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

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

3: Настройка и запуск ведомых серверов

Теперь нужно настроить ноды node1.mysql.cluster и node2.mysql.cluster. Они обеспечивают хранение данных и поддержку NDB.

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

Ведомые ноды читают конфигурации из стандартного конфигурационного файла MySQL, /etc/my.cnf, а именно раздел конфигураций, который начинается с [mysql_cluster]. Создайте файл и отредактируйте его:

sudo nano /etc/my.cnf

Укажите имя ведущего кластера:

[mysql_cluster] ndb-connectstring=manager.mysql.cluster

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

Это всё, что нужно для запуска ведомых серверов. Остальные параметры конфигураций будут считаны с ведущего сервера. В данном случае ведомая нода узнает из настроек ведущего сервера, что каталогом данных является /usr/local/mysql/data. Создайте такой каталог на ведомой ноде:

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

После этого можно запустить ведомую ноду:

sudo /opt/mysql/server-5.6/bin/ndbd

Если запуск ноды прошёл успешно, на экране появится сообщение:

2016-05-11 16:12:23 [ndbd] INFO     -- Angel connected to 'manager.mysql.cluster:1186'
2016-05-11 16:12:23 [ndbd] INFO     -- Angel allocated nodeid: 2

Сервис ndbd запущен. Общедоступный релиз пакета не предоставляет сценария запуска и для ведомых серверов. Поэтому нужно снова добавить команду запуска в файл /etc/rc.local. Убедитесь, что /etc/rc.local выполняется во время запуска системы:

sudo nano /etc/rc.local

Затем добавьте команду перед exit:

...
/opt/mysql/server-5.6/bin/ndbd
exit 0

Выполнив настройку первой ноды, перейдите на следующую ноду и повторите всё приведённые выше инструкции.

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

Стандартный сервер MySQL (такой доступен в официальном репозитории Ubuntu) не поддерживает систему NDB. Потому нужно выполнить пользовательскую установку сервера MySQL. Пакет, установленный на серверы кластера, уже предоставляет всё необходимое для запуска сервера и клиента. Как уже говорилось, в руководстве сервер и клиент MySQL будут установлены на ведущий сервер (manager.mysql.cluster).

Конфигурации также хранятся в /etc/my.cnf. Перейдите на сервер manager.mysql.cluster и откройте конфигурационный файл:

sudo nano /etc/my.cnf

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

[mysqld] ndbcluster # run NDB storage engine
...

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

Сервер MySQL рекомендуется запускать с помощью отдельного пользователя (mysql), который будет входить в отдельную одноимённую группу. Создайте такую группу:

sudo groupadd mysql

Затем создайте пользователя mysql, который будет входить в эту группу. Чтобы этот пользователь не имел доступа к оболочке, установите /bin/false в качестве пути к оболочке:

sudo useradd -r -g mysql -s /bin/false mysql

Последнее, что нужно сделать для пользовательской установки MySQL – создать БД по умолчанию.

sudo /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql

Чтобы запустить сервер MySQL, используйте сценарий /opt/mysql/server-5.6/support-files/mysql.server. Скопируйте его под именем mysqld в каталог сценариев:

sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysqld

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

sudo systemctl enable mysqld.service

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

sudo systemctl start mysqld

В качестве клиента MySQL используйте пользовательский бинарный файл, который поставляется в пакете кластера. Его путь: /opt/mysql/server-5.6/bin/mysql. Для удобства можно создать символьную ссылку в /usr/bin:

sudo ln -s /opt/mysql/server-5.6/bin/mysql /usr/bin/

Запустите клиент в командной строке:

mysql

Команда вернёт:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.29-ndb-7.4.11-cluster-gpl MySQL Cluster Community Server (GPL)

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

5: Тестирование кластера

На данный момент кластер, состоящий из одного сервера, одного клиента, одного ведущего сервера и двух ведомых нод MySQL, готов. Перейдите на ведущий сервер (manager.mysql.cluster) и откройте консоль управления:

sudo /opt/mysql/server-5.6/bin/ndb_mgm

Командная строка должна измениться:

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

Выполните команду:

SHOW

Команда вернёт:

Connected to Management Server at: manager.mysql.cluster:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.135.27.42  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *)
id=3    @10.135.27.43  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.135.27.51  (mysql-5.6.29 ndb-7.4.11)
[mysqld(API)]   1 node(s)
id=4    @10.135.27.51  (mysql-5.6.29 ndb-7.4.11)

Это значит, что в кластере есть две ноды с порядковыми номерами 2 и 3. Они активны и подключены. Также в кластере работает один ведущий сервер (номер 1) и один сервер MySQL (номер 4). Чтобы получить подробную информацию о каком-либо компоненте, введите его номер и запустите команду STATUS:

2 STATUS

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

Node 2: started (mysql-5.6.29 ndb-7.4.11)

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

quit

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

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

mysql -u root

Консоль должна измениться. В консоли клиента MySQL запустите команду:

SHOW ENGINE NDB STATUS \G

Вы увидите информацию о системе NDB:

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

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

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

Система NDB

Создайте новую таблицу NDB и вставьте в неё какие-нибудь данные.

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

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

CREATE DATABASE cluster;

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

USE cluster;

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

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

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

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

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

SELECT * FROM cluster_test;

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

Заключение

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

Tags: , , ,

Добавить комментарий