Что это за зверь и как его едят? Я думаю что лучше всего об этом расскажут следующие цитаты:
Из Википедии:
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-запросов
- не требует, на первых порах, денормализацию структур данных, для ускорения запросов, а в ряде случаев денормализация даже и не пригодится
Ссылки
- https://hub.docker.com/r/memsql/quickstart/ — «The official docker image for testing MemSQL + MemSQL Ops (cluster-in-a-box)» — официальный docker-контейнер для «развлечений» с MemSQL
- http://docs.memsql.com/docs/quick-start-with-docker/ — Quick Start with Docker — официальный документация по docker-контейнеру с MemSQL
- http://www.memsql.com/ — официальный сайт проекта MemSQL
- https://ru.wikipedia.org/wiki/MemSQL — про MemSQL из Википедии
- http://ru.bmstu.wiki/MemSQL — про MemSQL из Национальной библиотеки им. Н. Э. Баумана