Установка MemSQL в Ubuntu 14.04

MemSQL – это система управления базами данных. От традиционных СУБД она отличается высокой скоростью записи и чтения. Эта технология основана на протоколе MySQL, потому работать с ней просто и удобно, несмотря на все новшества.

MemSQL предоставляет новые возможности и функции, среди которых поддержка JSON, вставка и обновление данных и многое другое. Одним из наиболее выгодных отличий MemSQL от традиционных СУБД является возможность делить один запрос на несколько узлов (нод); эта функция известна как массовый параллелизм обработки и позволяет гораздо быстрее читать запросы.

Данное руководство поможет установить MemSQL на сервер Ubuntu 14.04, протестировать производительность и добавить данные JSON из командной строки клиента MySQL.

Требования

  • Сервер Ubuntu 14.04 x64;
  • Минимум 8 GB RAM;
  • Не-root пользователь с доступом к sudo.

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

1: Установка MemSQL

Последнюю версию MemSQL можно найти на странице загрузки.

Также нужно установить программу MemSQL Ops, предназначенную для управления загрузками и подготовки сервера к корректному запуску MemSQL.

Для начала загрузите пакет MemSQL:

wget http://download.memsql.com/memsql-ops-4.0.35/memsql-ops-4.0.35.tar.gz

Затем распакуйте его:

tar -xzf memsql-ops-4.0.35.tar.gz

После этого на сервере появится каталог memsql-ops-4.0.35; имя каталога указывает номер версии.

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

Откройте этот каталог:

cd memsql-ops-4.0.35

Запустите установочный скрипт, который входит в распакованный архив.

sudo ./install.sh

На экране появится вывод скрипта. Скрипт спросит, нужно ли установить MemSQL только на текущий хост; выберите yes.

Примечание: Установка MemSQL на несколько серверов не рассматривается в данном руководстве.

. . .
Do you want to install MemSQL on this host only? [y/N] y
2015-09-04 14:30:38: Jd0af3b [INFO] Deploying MemSQL to 45.55.146.81:3306
2015-09-04 14:30:38: J4e047f [INFO] Deploying MemSQL to 45.55.146.81:3307
2015-09-04 14:30:48: J4e047f [INFO] Downloading MemSQL: 100.00%
2015-09-04 14:30:48: J4e047f [INFO] Installing MemSQL
2015-09-04 14:30:49: Jd0af3b [INFO] Downloading MemSQL: 100.00%
2015-09-04 14:30:49: Jd0af3b [INFO] Installing MemSQL
2015-09-04 14:31:01: J4e047f [INFO] Finishing MemSQL Install
2015-09-04 14:31:03: Jd0af3b [INFO] Finishing MemSQL In
stall
Waiting for MemSQL to start...

Теперь на сервере Ubuntu развёрнут кластер MemSQL. Однако согласно логам (см. предыдущий вывод) СУБД MemSQL была установлена дважды.

Дело в том, что MemSQL имеет две разные роли: узел-агрегатор (aggregator node) и листовой или терминальный узел (leaf node). Для корректной работы MemSQL необходим один узел-агрегатор и один листовой узел как минимум. Именно поэтому СУБД была установлена дважды.

  • Агрегатор – это интерфейс MemSQL. Внешне он очень похож на MySQL: прослушивает тот же порт, может использовать те же инструменты, может взаимодействовать с системой MySQL и её стандартными библиотеками. Агрегатор знает обо всех листовых узлах MemSQL, управляет клиентами MySQL и преобразовывает их запросы в понятный MemSQL формат.
  • Листовой узел хранит данные. Получая запрос от агрегатора на чтение или запись данных, листовой узел выполняет запрос и возвращает агрегатору результат. MemSQL позволяет распределять данные на несколько хостов. Каждый листовой узел хранит часть таких данных. Даже если существует всего один листовой узел, данные делятся внутри него.

В установке MemSQL в рамках одного хоста агрегатор и листовой узел находятся на одной машине; в случае установки MemSQL на несколько хостов можно распределить листовые узлы между машинами.

2: Тестирование

Теперь можно проверить скорость MemSQL при помощи инструмента MemSQL Ops, который является частью установки. Откройте в браузере ссылку:

http://your_server_ip:9000

Инструмент MemSQL Ops даёт обзор кластера. На данный момент в нём находится 2 узла MemSQL: мастер-агрегатор и листовой узел.

Выполните тестирование скорости узла MemSQL. Выберите в меню слева Speed Test и нажмите START TEST.

3: Взаимодействие с MemSQL через mysql-client

Клиенты видят MemSQL и MySQL абсолютно одинаково, поскольку эти СУБД используют одинаковые протоколы. Потому для взаимодействия с кластером MemSQL можно использовать mysql-client.

Для начала обновите список пакетов системы:

sudo apt-get update

После этого установите клиент MySQL, который позволит использовать команду mysql:

sudo apt-get install mysql-client-core-5.6

Теперь можно подключиться к MemSQL при помощи клиента MySQL. Подключитесь как root-пользователь к хосту 127.0.0.1 (IP локального хоста) через порт 3306. Также нужно отредактировать командную строку; она должна показывать memsql>.

mysql -u root -h 127.0.0.1 -P 3306 --prompt="memsql> "

После этого строка будет начинаться с memsql>.

Просмотрите базы данных:

show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| memsql             |
| sharding           |
+--------------------+
3 rows in set (0.01 sec)

Попробуйте создать новую БД. Для примера назовём её tutorial:

create database tutorial;

Откройте эту БД:

use tutorial;

Создайте в ней таблицу users с полями id и email. Также нужно задать тип этих полей. Для примера поле id будет содержать данные bigint, а email – данные varchar с длиной 255. Кроме того, id –  первичный ключ, а email не может быть нулём.

create table users (id bigint auto_increment primary key, email varchar(255) not null);

Обратите внимание: на выполнение данной команды ушло 15-20 секунд. Одной из причин медленного создания таблиц в MemSQL является генерация кода.

MemSQL использует генерацию кода для выполнения запросов. Это означает, что каждый раз, когда MemSQL встречает новый тип запроса, СУБД генерирует и компилирует код для представления запроса. Затем этот код отправляется в кластер для выполнения. Это ускоряет обработку фактических данных, но требует времени на подготовку. MemSQL может повторно использовать сгенерированные ранее запросы, но в случае появления нового запроса с неизвестной структурой работа будет замедляться.

Вернёмся к таблице users. Взгляните на определение таблицы.

describe users;
+-------+--------------+------+------+---------+----------------+
| Field | Type         | Null | Key  | Default | Extra          |
+-------+--------------+------+------+---------+----------------+
| id    | bigint(20)   | NO   | PRI  | NULL    | auto_increment |
| email | varchar(255) | NO   |      | NULL    |                |
+-------+--------------+------+------+---------+----------------+
2 rows in set (0.00 sec)

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

insert into users (email) values ('one@example.com'), ('two@example.com'), ('three@example.com');
Query OK, 3 rows affected (1.57 sec)
Records: 3  Duplicates: 0  Warnings: 0

Отправьте запрос к таблице users:

select * from users;

На экране появятся только что добавленные данные:

+----+-------------------+
| id | email             |
+----+-------------------+
|  2 | two@example.com   |
|  1 | one@example.com   |
|  3 | three@example.com |
+----+-------------------+
3 rows in set (0.07 sec)

4: Использование JSON

Как говорилось ранее, MemSQL поддерживает JSON.

Для демонстрации можно создать таблицу events; она будет состоять из двух полей: id (точно такое же, как в таблице users) и event (тип JSON).

create table events (id bigint auto_increment primary key, event json not null);

Добавьте данные в поле events. JSON позволяет сослаться на поле email , что в свою очередь ссылается на ID пользователей (в предыдущей таблице).

insert into events (event) values ('{"name": "sent email", "email": "one@example.com"}'), ('{"name": "received email", "email": "two@example.com"}');

Просмотрите таблицу events:

select * from events;
+----+-----------------------------------------------------+
| id | event                                               |
+----+-----------------------------------------------------+
|  2 | {"email":"two@example.com","name":"received email"} |
|  1 | {"email":"one@example.com","name":"sent email"}     |
+----+-----------------------------------------------------+
2 rows in set (3.46 sec)

Теперь попробуйте запросить все события, свойство name которых содержит «received email».

select * from events where event::$name = 'received email';
+----+-----------------------------------------------------+
| id | event                                               |
+----+-----------------------------------------------------+
|  2 | {"email":"two@example.com","name":"received email"} |
+----+-----------------------------------------------------+

Теперь запросите события со свойством «sent email»:

select * from events where event::$name = 'sent email';
+----+-------------------------------------------------+
| id | event                                           |
+----+-------------------------------------------------+
|  1 | {"email":"one@example.com","name":"sent email"} |
+----+-------------------------------------------------+
1 row in set (0.00 sec)

Обратите внимание: последний запрос был выполнен быстрее, чем предыдущий. Это произошло потому, что MemSQL не нужно было генерировать код для этого запроса, поскольку можно было использовать сгенерированный канне код.

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

Все поля таблицы users можно соединить с таблицей events через email со свойством «received email».

select * from users left join events on users.email = events.event::$email where events.event::$name = 'received email';
+----+-----------------+------+-----------------------------------------------------+
| id | email           | id   | event                                               |
+----+-----------------+------+-----------------------------------------------------+
|  2 | two@example.com |    2 | {"email":"two@example.com","name":"received email"} |
+----+-----------------+------+-----------------------------------------------------+
1 row in set (14.19 sec)

После этого попробуйте отправить тот же запрос, отфильтровывая события со свойством «sent email».

select * from users left join events on users.email = events.event::$email where events.event::$name = 'sent email';
+----+-----------------+------+-------------------------------------------------+
| id | email           | id   | event                                           |
+----+-----------------+------+-------------------------------------------------+
|  1 | one@example.com |    1 | {"email":"one@example.com","name":"sent email"} |
+----+-----------------+------+-------------------------------------------------+
1 row in set (0.01 sec)

Как и прежде, запрос был выполнен быстрее первого. Генерация кода полезна при выполнении запросов на большое количество строк.

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

Заключение

Итак, теперь СУБД MemSQL установлена на сервер и протестирована. Кроме того, с ней можно взаимодействовать при помощи клиента MySQL.

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

Tags: , , ,

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