Сравнение производительности MongoDB vs ClickHouse

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 12:20, 11 июня 2018.

OLAP (интерактивная аналитическая обработка) — технология обработки данных, заключающаяся в подготовке суммарной (агрегированной) информации на основе больших массивов данных, структурированных по многомерному принципу. Реализации технологии OLAP являются компонентами программных решений класса Business Intelligence Причина использования OLAP для обработки запросов — скорость. Реляционные БД хранят сущности в отдельных таблицах, которые обычно хорошо нормализованы. Эта структура удобна для операционных БД, но сложные многотабличные запросы в ней выполняются относительно медленно.

В этой же статье мы сравним производительность двух популярных баз данных для online обработки аналитических запросов.

MongoDB

MongoDB: кросс-платформенная, документно-ориентированная база данных. Из особенностей можно отметить простой язык запросов, хорошая документация, огромное сообщество и т.д

MongoDB использует: Google, UPS, Facebook, Cisco, eBay, BOSH, Adobe, SAP, Forbes и множество других компаний.[Источник 1]

ClickHouse

ClickHouse: кросс-платформенная, колоночная СУБД для OLAP (online обработки аналитических запросов).

Особенности: Нет поддержки транзакций и нет полноценной поддержки операций UPDATE и DELETE ClickHouse применяется, например, для анализа метаданных о событиях в LHCb эксперименте в CERN (порядка миллиарда событий и 1000 параметров для каждого события) и как хранилище в проекте Тинькофф Банка. [Источник 2]

Основные характеристики баз данных

Сравнение ClickHouse и MongoDB
Параметры СlickHouse MongoDB
Краткое описание Колоночная СУБД для online обработки аналитических запросов Одно из наиболее популярных документных хранилищ
Основная модель хранения данных Колонко-ориетированная Документно-ориентированная NoSQL база данных
Дополнительная модель хранения данных - База данных типа Key/Value
Вебсайт clickhouse.yandex www.mongodb.com
Документация clickhouse.yandex/docs/en docs.mongodb.com/­manual
Разработчик Yandex LLC MongoDB, Inc
Дата релиза 2016 2009
Текущая версия 1.1.5, Май 2018 3.6.4, Апрель 2018
Лицензия Открытое программное обеспечение Открытое программное обеспечение
Облачное Нет Нет
Язык реализации С++ С++
Поддерживаемые операционные системы сервера BSD, Linux, OS X, Windows Linux, OS X, Solaris, Windows
Схема данных column-oriented schema-free
Типизация Да Да
Поддержка XML Нет Да
Поддержка вторичных индексов Да Да
SQL SQL Нет
API и другие методы доступа HTTP клиент и нативный бинарный протокол Проприетарный протокол с использованием JSON
Поддерживаемые языки программирования C#, С++, Clojure, Erlang, Go, Haskell, Java, JavaScript, Lisp, Perl, PHP, Python, Ruby, Scala Actionscript, C, C#, С++, Clojure, ColdFusion, D, Dart, Delphi, Erlang, Go, Groovy, Haskell, Java, JavaScript, Lisp, Lua, MatLab, Perl, PHP, PowerShell, Prolog, Python, R , Ruby, Scala, Smalltalk
Язык написания скриптов на стороне сервера Нет JavaScript
Триггеры Нет Нет
Методы разбиения Key Sharding Sharding
MapReduce Да Да
Концепции согласования Согласование по событию; Немедленное согласование Согласование по событию; Немедленное согласование
Параллелизм Да Да
Возможность хранения только в памяти Нет Да
Контроль доступа пользователей Назначение прав для отдельных пользователей и ролей Назначение прав для отдельных пользователей и ролей

Критерии сравнения

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

Структура данных

{ 
    event_date: '2017-01-29',
    event_time: '2017-01-29 16:00:40',
    number: 3,
    text: 'sequi voluptatibus labore',
    month: 'December' 
}

Тесты:

  1. Вставка данных
  2. SELECT с группировкой
  3. SELECT с лимитом

Число данных:

  1. 100тыс
  2. 500тыс
  3. 1млн
  4. 2.5млн

ПО, автоматизирующее сравнение

Для автоматизации сравнения мы будем использовать клиент MongoDB и ClickHouse для NodeJS.

Установка NodeJS [Источник 3]

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

Сами тесты: https://github.com/lvovgeka/ClickHouseVsMongoDB

Загрузка тестов и установка зависимостей:

git clone https://github.com/lvovgeka/ClickHouseVsMongoDB.git
cd ClickHouseVsMongoDB
npm install

Тестирование MongoDB

Перед тестированием необходимо добавить индексы в MongoDB

mongo test --eval "db.testCollection.createIndex( { month: -1 } )"

Запуск тестов MongoDB

npm run insert-mongodb
npm run select-group-mongodb
npm run select-limit-mongodb

Для тестов с другим числом данных необходимо изменить значение в mongodb/insert.js

Тестирование ClickHouse

Для запуска Сервера и клиента ClickHouse я буду использовать Docker

docker run -d --name some-clickhouse-server -p 8123:8123 --ulimit nofile=262144:262144 yandex/clickhouse-server
docker run -it --rm --link some-clickhouse-server:clickhouse-server yandex/clickhouse-client --host clickhouse-server

Далее необходимо создать таблицу для тестовых данных при помощи клиента ClickHouse

create table test (event_date Date DEFAULT toDate(event_time), event_time DateTime DEFAULT now(), number UInt64, text String, month String) engine = MergeTree(event_date, (event_time, number, text, month), 8192);

Запуск тестов для ClickHouse

npm run insert-clickhouse
npm run select-group-clickhouse
npm run select-limit-clickhouse

Для тестов с другим числом данных необходимо изменить значение в clickhouse/insert.js

Результаты тестирования

Insert.png

На графиках видно что вставка данных в mongodb и clickhouse происходит примерно с одинаковой скоростью.

Select group.png

Select с группировкой в clickhouse-е происходит на порядок быстрее. Это и логично, ведь clickhouse был создан для таких задач

Select limit.png

А вот Select с ограничением быстрее обрабатывается уже в MongoDB.

Демонстрация работы

Установка баз данных

Подробный процесс установки этих баз данных можно увидеть в соответствующих статьях:

Заключение

ClickHouse отлично подходит для проектов с BigData. Высока скорость чтения и колонкоориентированность позволяют выполнять сложные аналитические запросы намного быстрее чем у NoSQL аналогов.

У MongoDB же если данные (а точнее, то, что называют working set — набор актуальных данных, к которым постоянно идет обращение) не помещаются в память, она сильно замедляется. Также нужно помнить, что у MongoDB существует глобальная блокировка на чтение/запись.

Источники

  1. MongoDB Wikipedia // https://ru.wikipedia.org/wiki/MongoDB (дата обращения: 11.06.2018).
  2. ClickHouse Wikipedia // https://ru.wikipedia.org/wiki/ClickHouse (дата обращения: 11.06.2018).
  3. Installing Node.js via package manager // https://nodejs.org/en/download/package-manager/ (дата обращения: 11.06.2018).