Вступление
MySQL cluster - это программная технология, обеспечивающая высокую доступность и пропускную способность. Если вы уже знакомы с другими кластерными технологиями, вы найдете похожий на них кластер MySQL. Короче говоря, существует один или несколько узлов управления, которые контролируют узлы данных (где хранятся данные). После консультации с узлом управления клиенты (клиенты MySQL, серверы или собственные API) подключаются напрямую к узлам данных.
Вы можете задаться вопросом, как репликация MySQL связана с кластером MySQL. В кластере нет типичной репликации данных, но вместо этого происходит синхронизация узлов данных. Для этого необходимо использовать специальный механизм обработки данных - NDBCluster (NDB). Представьте кластер как единую логическую среду MySQL с избыточными компонентами. Таким образом, кластер MySQL может участвовать в репликации с другими кластерами MySQL.
MySQL кластер лучше всего работает в среде без общего доступа. В идеале, два компонента не должны использовать одно и то же оборудование. Для простоты и демонстрации мы ограничимся использованием только трех капель. Там будут две капли, выступающие в качестве узлов данных, которые синхронизируют данные между собой. Третья капля будет использоваться для менеджера кластера и в то же время для сервера / клиента MySQL. Если у вас есть больше Droplets, вы можете добавить больше узлов данных, отделить менеджер кластера от сервера / клиента MySQL и даже добавить больше Droplets в качестве менеджеров кластера и серверов / клиентов MySQL.
Предпосылки
Вам понадобится всего три капли - одна капля для менеджера кластера MySQL и сервер / клиент MySQL и две капли для избыточных узлов данных MySQL.
Вsame DigitalOcean data center создайте следующие капли сprivate networking enabled:
-
Три капли Ubuntu 16.04 с минимум 1 ГБ ОЗУ и включеннымиprivate networking
-
Пользователь без полномочий root с привилегиями sudo для каждой капли (Initial Server Setup with Ubuntu 16.04 объясняет, как это настроить).
MySQL кластер хранит много информации в оперативной памяти. Каждая капля должна иметь как минимум 1 ГБ оперативной памяти.
Как упоминалось вprivate networking tutorial, не забудьте настроить пользовательские записи для 3 капель. Для простоты и удобства мы будем использовать следующие пользовательские записи для каждой капли в файле/etc/hosts
:
10.XXX.XX.X node1.mysql.cluster
10.YYY.YY.Y node2.mysql.cluster
10.ZZZ.ZZ.Z manager.mysql.cluster
Пожалуйста, замените выделенные IP-адреса на частные IP-адреса ваших дроплетов соответственно.
Если не указано иное, все команды, которым требуются привилегии root в этом учебном пособии, должны запускаться как пользователь без полномочий root с привилегиями sudo.
[[шаг-1 -—- загрузка-и-установка-mysql-cluster]] == Шаг 1. Загрузка и установка MySQL Cluster
На момент написания этого руководства последняя версия кластера MySQL под GPL была 7.4.11. Продукт построен на основе MySQL 5.6 и включает в себя:
-
Программное обеспечение Cluster Manager
-
Программное обеспечение диспетчера узлов данных
-
MySQL 5.6 сервер и клиентские двоичные файлы
Вы можете скачать бесплатную общедоступную (GA) версию кластера MySQL изofficial MySQL cluster download page. На этой странице выберите пакет платформы Debian Linux, который также подходит для Ubuntu. Также обязательно выберите 32-битную или 64-битную версию в зависимости от архитектуры ваших дроплетов. Загрузите установочный пакет в каждую из ваших капель.
Инструкции по установке будут одинаковыми для всех капель, поэтому выполните эти шаги для всех 3 капель.
Перед тем, как начать установку, необходимо установить пакетlibaio1
, так как это зависимость:
sudo apt-get install libaio1
После этого установите кластерный пакет MySQL:
sudo dpkg -i mysql-cluster-gpl-7.4.11-debian7-x86_64.deb
Теперь вы можете найти установку кластера MySQL в каталоге/opt/mysql/server-5.6/
. В частности, мы будем работать с каталогом bin (/opt/mysql/server-5.6/bin/
), где находятся все двоичные файлы.
Те же самые шаги установки должны быть выполнены для всех трех Капель независимо от того, что каждая из них будет иметь разные функции - менеджер или узел данных.
Далее мы настроим диспетчер кластеров MySQL для каждой капли.
[[step-2 -—- configuring-and-start-the-cluster-manager]] == Шаг 2 - Настройка и запуск Cluster Manager
На этом этапе мы настроим диспетчер кластеров MySQL (manager.mysql.cluster
). Его правильная конфигурация обеспечит правильную синхронизацию и распределение нагрузки между узлами данных. Все команды должны выполняться на каплеmanager.mysql.cluster
.
Диспетчер кластеров - это первый компонент, который должен запускаться в любом кластере. Ему нужен файл конфигурации, который передается в качестве аргумента в его двоичный файл. Для удобства мы будем использовать файл/var/lib/mysql-cluster/config.ini
для его настройки.
В каплеmanager.mysql.cluster
сначала создайте каталог, в котором будет находиться этот файл (/var/lib/mysql-cluster
):
sudo mkdir /var/lib/mysql-cluster
Затем создайте файл и начните редактировать его с помощью nano:
sudo nano /var/lib/mysql-cluster/config.ini
Этот файл должен содержать следующий код:
/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
. Таким образом, вы не можете получить доступ к любой из вышеперечисленных услуг за пределами частной сети.
В приведенном выше файле вы можете добавить больше избыточных компонентов, таких как узлы данных (ndbd) или серверы MySQL (mysqld), просто определив дополнительные экземпляры точно таким же образом.
Теперь вы можете запустить менеджер в первый раз, выполнив двоичный файлndb_mgmd
и указав файл конфигурации с аргументом-f
следующим образом:
sudo /opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
Вы должны увидеть сообщение об успешном запуске, похожее на это:
Output of ndb_mgmdMySQL Cluster Management Server mysql-5.6.29 ndb-7.4.11
Вы, вероятно, хотели бы, чтобы служба управления запускалась автоматически с сервера. В выпуске кластера GA нет подходящего сценария запуска, но есть несколько доступных в Интернете. Для начала вы можете просто добавить команду запуска в файл/etc/rc.local
, и служба будет автоматически запущена во время загрузки. Однако сначала вам нужно убедиться, что/etc/rc.local
выполняется во время запуска сервера. В Ubuntu 16.04 для этого требуется выполнить дополнительную команду:
sudo systemctl enable rc-local.service
Затем откройте файл/etc/rc.local
для редактирования:
sudo nano /etc/rc.local
Добавьте команду запуска перед строкойexit
следующим образом:
/etc/rc.local
...
/opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
exit 0
Сохраните и выйдите из файла.
Диспетчер кластеров не должен работать все время. Его можно запускать, останавливать и перезапускать без простоев для кластера. Это требуется только во время начального запуска узлов кластера и сервера / клиента MySQL.
[[step-3 -—- configuring-and-start-the-data-nodes]] == Шаг 3 - Настройка и запуск узлов данных
Затем мы настроим узлы данных (node1.mysql.cluster
иnode2.mysql.cluster
) для хранения файлов данных и правильной поддержки механизма NDB. Все команды должны быть выполнены на обоих узлах. Вы можете начать сначала сnode1.mysql.cluster
, а затем повторить те же шаги дляnode2.mysql.cluster
.
Узлы данных считывают конфигурацию из стандартного файла конфигурации MySQL/etc/my.cnf
, а точнее части после строки[mysql_cluster]
. Создайте этот файл с помощью nano и начните редактировать его:
sudo nano /etc/my.cnf
Укажите имя хоста менеджера следующим образом:
/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
После успешного запуска вы должны увидеть похожий результат:
Output of ndbd2016-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 автоматически с сервером. В этом выпуске кластера GA также нет подходящего сценария запуска. Так же, как мы сделали для менеджера кластера, давайте добавим команду запуска в файл/etc/rc.local
. Опять же, вам нужно будет убедиться, что/etc/rc.local
выполняется во время запуска сервера с помощью команды:
sudo systemctl enable rc-local.service
Затем откройте файл/etc/rc.local
для редактирования:
sudo nano /etc/rc.local
Добавьте команду запуска перед строкойexit
следующим образом:
/etc/rc.local
...
/opt/mysql/server-5.6/bin/ndbd
exit 0
Сохраните и выйдите из файла.
Как только вы закончите с первым узлом, повторите точно такие же шаги на другом узле, которым в нашем примере являетсяnode2.mysql.cluster
.
[[step-4 -—- configuring-and-start-the-mysql-server-and-client]] == Шаг 4 - Настройка и запуск сервера и клиента MySQL
Стандартный сервер MySQL, такой как тот, который доступен в стандартном репозитории Ubuntu apt, не поддерживает кластерный механизм MySQL NDB. Вот почему вам нужна индивидуальная установка сервера MySQL. Кластерный пакет, который мы уже установили на трех каплях, поставляется с сервером MySQL и клиентом. Как уже упоминалось, мы будем использовать сервер и клиент MySQL на узле управления (manager.mysql.cluster
).
Конфигурация снова сохраняется как файл по умолчанию/etc/my.cnf
. Наmanager.mysql.cluster
откройте файл конфигурации:
sudo nano /etc/my.cnf
Затем добавьте следующее:
/etc/my.cnf
[mysqld]
ndbcluster # run NDB storage engine
...
Сохраните и выйдите из файла.
Согласно передовой практике, сервер MySQL должен работать под своим собственным пользователем (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
следующим образом:
mysql
Вы должны увидеть вывод, похожий на:
Output of ndb_mgmdWelcome 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
.
Выше - первая проверка, чтобы показать, что MySQL кластер, сервер и клиент работают. Далее мы пройдем более подробные тесты, чтобы убедиться, что кластер работает правильно.
Тестирование кластера
На этом этапе наш простой кластер MySQL с одним клиентом, одним сервером, одним менеджером и двумя узлами данных должен быть завершен. В диспетчере кластера Droplet (manager.mysql.cluster
) откройте консоль управления с помощью команды:
sudo /opt/mysql/server-5.6/bin/ndb_mgm
Теперь подсказка должна измениться на консоль управления кластером. Это выглядит так:
Inside the ndb_mgm console-- NDB Cluster -- Management Client --
ndb_mgm>
Оказавшись внутри консоли, выполните командуSHOW
следующим образом:
SHOW
Вы должны увидеть вывод, похожий на этот:
Output of ndb_mgmConnected 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:
Output of ndb_mgmNode 2: started (mysql-5.6.29 ndb-7.4.11)
Чтобы выйти из консоли управления, введитеquit
.
Консоль управления очень мощная и предоставляет множество других возможностей для управления кластером и его данными, включая создание оперативной резервной копии. Для получения дополнительной информации проверьтеofficial documentation.
Давайте сейчас попробуем с клиентом MySQL. Из той же капли запустите клиент с помощью командыmysql
для пользователя root MySQL. Пожалуйста, помните, что мы создали символическую ссылку на него ранее.
mysql -u root
\ Ваша консоль изменится на клиентскую консоль MySQL. Оказавшись внутри клиента MySQL, запустите команду:
SHOW ENGINE NDB STATUS \G
Теперь вы должны увидеть всю информацию о ядре кластера NDB, начиная с подробностей соединения:
Output of mysql
*************************** 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
...
Наиболее важной информацией сверху является количество готовых узлов - 2. Эта избыточность позволит вашему кластеру MySQL продолжать работать, даже если один из узлов данных не работает в то время. В то же время ваши SQL-запросы будут сбалансированы по нагрузке для двух узлов.
Вы можете попробовать отключить один из узлов данных, чтобы проверить стабильность кластера. Простейшей вещью было бы просто перезапустить всю Droplet, чтобы провести полную проверку процесса восстановления. Вы увидите, как значениеnumber_of_ready_data_nodes
изменится на1
и снова вернется к2
при перезапуске узла.
Работа с двигателем NDB
Чтобы увидеть, как на самом деле работает кластер, давайте создадим новую таблицу с механизмом NDB и вставим в нее некоторые данные. Обратите внимание, что для использования функциональности кластера механизм должен быть NDB. Если вы используете InnoDB (по умолчанию) или любой другой механизм, отличный от NDB, вы не будете использовать кластер.
Во-первых, давайте создадим базу данных под названием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 может быть простой и легкой. Конечно, есть много более сложных опций и функций, которые стоит освоить, прежде чем кластер перейдет в вашу производственную среду. Как всегда, убедитесь, что у вас есть адекватный процесс тестирования, потому что некоторые проблемы могут быть очень трудно решить позже. Для получения дополнительной информации и дальнейшего чтения перейдите к официальной документации дляMySQL cluster.