Apache Cassandra & Apache Ignite

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 19:02, 20 мая 2018.
Apache Cassandra
120px-Cassandra logo.svg.png
Создатели: Авинаш Лакшман и Прашант Малик
Разработчики: Apache Software Foundation
Выпущена: July 2008; 12 years ago (2008-07)
Постоянный выпуск: 3.11.2 / 19 February 2018 года; 2 years ago (2018-02-19)
Написана на: Java
Тип ПО: NoSQL
Лицензия: Apache License 2.0
Веб-сайт cassandra.apache.org
Apache Ignite
220px-Apache Ignite logo.svg.png
Создатели: GridGain Systems
Разработчики: Apache Software Foundation
Выпущена: 24 March 2015 года; 5 years ago (2015-03-24)
Постоянный выпуск: 2.4 / 12 March 2018 года; 2 years ago (2018-03-12)
Написана на: Java, C++, C#
Тип ПО: Database, computing platform
Лицензия: Apache License 2.0
Веб-сайт ignite.apache.org

Apache Cassandra

Apache Cassandra — распределённая система управления базами данных, относящаяся к классу NoSQL-систем и рассчитанная на создание высокомасштабируемых и надёжных хранилищ огромных массивов данных, представленных в виде хэша.

Изначально проект был разработан в недрах Facebook и в 2009 году передан под крыло фонда Apache Software Foundation, эта организация продолжает развитие проекта. Промышленные решения на базе Cassandra развёрнуты для обеспечения сервисов таких компаний, как Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Apple и Twitter. К 2011 году крупнейший кластер серверов, обслуживающий единую базу данных под управлением Cassandra, насчитывал более 400 машин и содержал данные размером более 300 ТБ.

Написана на языке Java, реализует распределённую hash-систему, сходную с DynamoDB, что обеспечивает практически линейную масштабируемость при увеличении объёма данных. Использует модель хранения данных на базе семейства столбцов (ColumnFamily[en]), чем отличается от систем, подобных MemcacheDB, которые хранят данные только в связке «ключ — значение», возможностью организовать хранение хэшей с несколькими уровнями вложенности. Относится к категории отказоустойчивых СУБД: помещённые в базу данные автоматически реплицируются на несколько узлов распредёленной сети или даже равномерно распределяются в нескольких дата-центрах, при сбое узла его функции на лету подхватываются другими узлами, добавление новых узлов в кластер и обновление версии Cassandra производится на лету, без дополнительного ручного вмешательства и переконфигурации других узлов. Тем не менее настоятельно рекомендуется заново сгенерировать ключи (токены) для каждого узла, включая существующие, чтобы сохранить качество распределения нагрузки. Генерации ключей для существующих узлов можно избежать в случае кратного увеличения количества узлов (в 2 раза, в 3 раза и так далее).

Apache Ignite

Apache Ignite — это распределенная база данных, кэширование и обработка данных с открытым исходным кодом, предназначенная для хранения и вычисления больших объемов данных в кластере узлов.

Ignite была открыта в GridGain Systems в конце 2014 года и принята в программе Apache Incubator в том же году. Проект Ignite окончен 18 сентября 2015 года. Ignite was open-sourced by GridGain Systems in late 2014 and accepted in the Apache Incubator program that same year. The Ignite project graduated on September 18, 2015.

База данных Apache Ignite использует ОЗУ в качестве уровня хранения и обработки по умолчанию, поэтому он относится к классу вычислительных платформ в памяти. Уровень диска является необязательным, но после его включения будет храниться полный набор данных, тогда как уровень памяти будет кэшировать полный или частичный набор данных в зависимости от его емкости.

Независимо от используемого API данные в Ignite хранятся в виде пар ключ-значение. Компонент базы данных масштабируется горизонтально, распределяя пары ключ-значение по всему кластеру таким образом, что каждому узлу принадлежит часть общего набора данных. Данные автоматически перебалансируются всякий раз, когда узел добавляется или удаляется из кластера.

В дополнение к распределенной основе Apache Ignite поддерживает множество API, включая API-интерфейсы с ключевыми значениями, совместимые с JCache, ANSI-99 SQL с объединениями, транзакции ACID, а также вычисления MapReduce.

Кластер Apache Ignite может быть развернут на месте на товарном оборудовании, в облаке (например, Microsoft Azure, AWS, Google Compute Engine) или в контейнерах и средах подготовки, таких как Kubernetes, Docker, Apache Mesos, VMWare.

Трудности использования Apache Cassandra

Apache Cassandra является классическим решением в своей области. Как и в случае с любым специализированным решением, её преимущества достигнуты благодаря ряду компромиссов, значительная часть которых вызвана ограничениями дисковых хранилищ данных. Cassandra оптимизирована под максимально быструю работу с ними в ущерб остальному. Примеры компромиссов: отсутствие ACID-транзакций и поддержки SQL, невозможность произвольных транзакционных и аналитических транзакций, если под них заранее не адаптированы данные. Эти компромиссы, в свою очередь, вызывают закономерные затруднения у пользователей, приводя к некорректному использованию продукта и негативному опыту, либо вынуждая разделять данные между различными видами хранилищ, фрагментируя инфраструктуру и усложняя логику сохранения данных в приложениях.

Возможное решение проблемы — использование Cassandra в связке с Apache Ignite. Это позволит сохранить ключевые преимущества Cassandra, при этом скомпенсировав ее недостатки за счет симбиоза двух систем.

Ограничения Cassandra

Краткий обзор основных ограничений Cassandra, с которыми можно столкнуться:

  1. Пропускная способность и время отклика ограничены характеристиками жесткого диска или твердотельного накопителя;
  2. Специфическая структура хранения данных, оптимизированная под последовательные запись и чтение, не адаптирована под оптимальное выполнение классических реляционных операций над данными. Это не позволяет нормализовать данные и эффективно сопоставлять при помощи JOIN-ов, а также накладывает значительные ограничения, например, на такие операции, как GROUP BY и ORDER;
  3. Как следствие из п. 2 — отсутствие поддержки SQL в пользу своей более ограниченной вариации — CQL;
  4. Отсутствие ACID-транзакций.

Как же можно обойти эти ограничения?

Классическим вариантом является фрагментация данных, когда часть лежит в Cassandra, а часть — в других системах, которые поддерживают необходимые гарантии.

Минусы этого подхода, которые видны навскидку: увеличение сложности (а значит, потенциально, и ухудшение скорости и качества) разработки и поддержки приложений. Намного проще стучаться в одни ворота, нежели на уровне приложения или слоя микросервисов совмещать разрозненную информацию из различных источников. Также деградация любой из двух систем может приводить к значительным негативным последствиям, вынуждая инфраструктрную команду гнаться сразу за двумя зайцами.

Apache Ignite

Ещё один способ — поставить другую систему поверх Cassandra, разделив ответственность между ними. Для этой цели Apache Ignite подходит лучше всего, поскольку:

  1. Исчезает накладываемое диском ограничение производительности: Apache Ignite работает с оперативной памятью, сейчас нет ничего быстрее. Кроме того, она дешевеет настолько стремительно, что поставить достаточное количество RAM на пул серверов (Apache Ignite — распределенная система, как и Cassandra) — посильная задача;
  2. Полная поддержка классического SQL99, включая JOIN-ы, GROUP BY, ORDER BY, а также INSERT, UPDATE, DELETE, MERGE и так далее, позволяет нормализовать данные, облегчает аналитику, а с учетом производительности при работе с RAM — открывает потенциал HTAP, аналитики в реальном времени по операционным данным;
  3. Поддержка стандартов JDBC и ODBC облегчает интеграцию с существующими инструментами, например, Tableau, и фреймворками вроде Hibernate или Spring Data;
  4. Поддержка ACID-транзакций, гибкие и глубокие настройки обеспечения отказоустойчивости и дублирования данных;
  5. Распределенные вычисления, потоковая обработка данных, машинное обучение — можно легко реализовать множество новых для бизнеса сценариев использования, приносящих дивиденды.

В такой схеме Apache Ignite встает поверх Apache Cassandra, которая играет роль слоя постоянного энергонезависимого хранения. Несмотря на то, что уже в ближайших версиях Apache Ignite появится свое собственное решение Persistence с поддержкой расширения памяти диском, lazy run и сквозным SQL, Cassandra всё равно может быть интересна в этой роли за счет своей "отполированности" за долгие годы развития, распространенности и возможности разделить ответственность, не складывая все яйца в одну корзину там, где это не нужно.

Кластер Apache Ignite вбирает в себя из Apache Cassandra все или часть данных (например, за исключением архивных), по которым нужно выполнять запросы, после чего работает в режиме write-through, самостоятельно обслуживая API- или SQL-запросы на чтение, и дублируя в синхронном или асинхронном режиме запросы на запись в Cassandra, надежно сохраняя их на диск.

Далее эти данные анализируются в реальном времени, могут использоваться средства визуализации наподобие Tableau, применяться распределенные алгоритмы машинного обучения, а также формироваться витрины.