MemSQL

MemSQL: in-memory база

Что это за зверь и как его едят? Я думаю что лучше всего об этом расскажут следующие цитаты:

Из Википедии:

MemSQL — NewSQL реляционная система управления базами данных в оперативной памяти, допускающая распределение баз данных по нескольким узлам. Поддерживает принципы ACID, язык SQL, примечательна тем, что для выполнения SQL-запросов осуществляет кодогенерацию в C++.

Из Национальной библиотеки им. Н. Э. Баумана:

MemSQL — распределенная, реляционная база данных реального времени для одновременных транзакций и аналитики. MemSQL совместима с MySQL. Приложения могут подключаться к MemSQL через стандарты ODBC / JDBC, а также через драйверы и пользователей MySQL. MemSQL предлагает улучшения в области производительности записи и чтения, а также в значительной степени облегчает процесс разработки и поддержки приложений. Предлагая очень знакомый и понятный интерфейс, MemSQL наделяет разработчиков технологией, которую можно применять в крупных веб-компаниях, чтобы избежать проблем, сопутствующих росту трафика и проекта. В 2016 году MemSQL получила $36M инвестиций раунда С.

От себя добавлю следующее:

  • это полностью in-memory база данных — это значит что все данные базы находятся только в оперативной памяти сервера, а следовательно любое обращение к ним будет очень высокоскоростным
  • при изменении данных в таблицах (insert/update/delete), MemSQL всегда пишет лог транзакций, на основании которых может восстановить данные — это что касается также вопроса безопасности данных от потерь
  • по заявлению разработчиков, база данных поддерживает горизонтальное масштабирование из «коробки» — для режима кластеризации — имеется внятный веб-интерфейс «MemSQL Ops», который позволяет в режиме реального-времени наблюдать за состоянием узлов (nodes) кластера
  • поддерживает репликацию master-slave, к сожалению (а может и к счаcтью) репликация master-master отсутствует
  • запросы в базу полностью совместимы с ANSI SQL синтаксисом — это значит, что проекты, в большинстве своём, работающие с такими СУБД как MySQL или с PostgreSQL или прочим SQL-подобными, буду обратно совместимы с MemSQL
  • встроенный механизм кодогенерации SQL-запросов и их кеширования — каждый SQL-запрос преобразуется в некий код, который, в последствии, не требует дополнительного анализа искомого однотипного запроса, а при его выполнении сразу подставляются в него параметры для выборки из базы

Минимальные системные требования:

  • 4-х ядерный процессор
  • 8 гигабайт оперативки
  • свободного место на диске — не меньше чем оперативки
  • всё остальное — не очень важное..

Установка MemSQL

Благодаря прошлому посту — Установка Docker и Docker Compose на Ubuntu, сразу настраиваем тестовый виртуальный сервер для игры с СУБД MemSQL.
Начнём с выкачивания официальной сборки docker-образа:

$ docker pull memsql/quickstart

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

$ docker run --rm memsql/quickstart check-system

Если напишет «Everything looks good», то значит, что наш сервер соответствует минимальным требованием для работы контейнера с MemSQL и можно запускать контейнер в работу.

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

$ docker run -d -p 3307:3306 -p 9000:9000 --name=memsql memsql/quickstart

Где:

  • порт 3306 мы переопределяем наружу как порт 3307 и в дальнейшем через него будем работать с базой
  • порт 9000 оставляем как есть — это веб-интерфейст для отслеживания состояние нашей ноды MemSQL
  • имя контейнера будет «memsql»

Заход во внутрь контейнера (не знаю зачем, но вдруг пригодится):

$ docker exec -it memsql /bin/bash

После запуска контейнера, memSQL расшаривает на порту 9000 веб-панель управления, которая доступа из браузера по адресу http://88.212.241.238:9000/

Поскольку memSQL использует тот же протокол для коммуникации с клиентами, что и всем привычная MySQL, то используя ваш любимый клиент, вы можете подключиться к нему.
Например через Navicat коннектимся к серверу на порт 3307 с пользователем root и пустым паролем.

На будущее, как наиграемся, то остановим и удалим контейнер так:

$ docker stop memsql && docker rm -v memsql

Итог

В целом результаты работы MemSQL по предварительным замерам — меня впечатлили. По ряду показателей — скорость его работы в разы опережали «тюнингованный» MySQL в продакшене. Но из-за особенности компиляции SQL-запросов и отсутствия кеширования их результатов, база была хуже чем тот же MySQL на небольшую разницу. Правда, проблему с кешированием SQL-запросов — можно решить с использованием того же redis на уровне кода проекта.

Я бы не стал использовать этот продукт как основную базу для любого более-менее крупного проекта по ряду причин:

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

Но я бы стал использовать этот продукт как front-end базу для более-менее крупного проекта по ряду причин:

  • она очень быстро работает, даже с join’ами в запросах
  • как front-end база, MemSQL хорошо совместима с любыми реляционными СУБД на уровне SQL-запросов
  • не требует, на первых порах, денормализацию структур данных, для ускорения запросов, а в ряде случаев денормализация даже и не пригодится

Ссылки

Оставить ответ