Обзор YugaByte: Кассандра и Redis планетарного масштаба

В течение десятилетий, когда я работал разработчиком приложений для баз данных, я даже не представлял себе в самых смелых мечтах, что когда-либо получу доступ к транзакционной распределенной базе данных планетарного масштаба, не говоря уже о том, чтобы сравнивать многие из них. Но с появлением в производственной среде Google Cloud Spanner, CockroachDB, Azure Cosmos DB, Neo4j Enterprise и совсем недавно YugaByte DB эта одноразовая несбыточная мечта теперь вполне реальна.

В общих чертах, Google Cloud Spanner предлагает масштабируемую, распределенную, строго согласованную базу данных SQL в качестве службы, которая может обрабатывать около 2000 операций записи в секунду и 10 000 операций чтения в секунду для каждого узла со средней задержкой около пяти миллисекунд. Чтобы ускорить чтение, для которого не требуются абсолютно свежие данные, вы можете запросить у Spanner устаревшие чтения, поскольку он поддерживает запросы о путешествиях во времени. Spanner использует диалект SQL от Google и работает только на Google Cloud Platform.

CockroachDB - это база данных SQL с открытым исходным кодом, похожая на Spanner, которая поддерживает проводной протокол PostgreSQL и диалект PostgreSQL SQL. CockroachDB построен на основе RocksDB, транзакционного и согласованного хранилища ключей с открытым исходным кодом. Как и Spanner, он поддерживает запросы о путешествиях во времени. CockroachDB может работать в любом облаке, в контейнерах Docker с оркестровкой или без нее, а также на серверах Linux или виртуальных машинах. Корпоративная версия CockroachDB добавляет георазделение, контроль доступа на основе ролей и поддержку.

Azure Cosmos DB - это глобально распределенная многомодельная база данных с горизонтальными секциями как услуга. Он предлагает четыре модели данных ("ключ-значение", семейство столбцов, документ и график) и пять настраиваемых уровней согласованности (строгий, ограниченный устаревший, сеанс, согласованный префикс и возможный). Он предлагает пять наборов API: SQL (диалект), совместимость с MongoDB, совместимость с таблицами Azure, граф (Gremlin) и совместимость с Apache Cassandra. Он работает только в облаке Microsoft Azure.

Neo4j - это масштабируемая и жизнеспособная база данных графов, использующая язык запросов Cypher. Вы можете установить его некластеризованную версию с открытым исходным кодом в Windows, MacOS и Linux, в контейнерах Docker и на виртуальных машинах. Neo4j Enterprise поддерживает высокую доступность и причинные кластеры; Причинные кластеры позволяют асинхронно обновлять кластеры реплик чтения, чтобы обеспечить высокую производительность для географически распределенных развертываний.

Введите Югабайт БД

YugaByte DB, являющаяся предметом этого обзора, представляет собой транзакционную высокопроизводительную базу данных с открытым исходным кодом для приложений планетарного масштаба, которая поддерживает три набора API: YCQL, совместимый с Apache Cassandra Query Language (CQL); YEDIS, совместимый с Redis; и PostgreSQL (в настоящее время неполная и находится в стадии бета-тестирования). YugaWare - это уровень оркестровки для YugaByte DB Enterprise Edition. YugaWare быстро запускает и отключает распределенные кластеры в Amazon Web Services, Google Cloud Platform и (с четвертого квартала 2018 года) в Microsoft Azure. YugaByte DB реализует управление многоверсионным параллелизмом (MVCC), но еще не поддерживает запросы о путешествиях во времени.

База данных YugaByte построена на основе расширенного форка хранилища ключей и значений RocksDB. YugaByte DB 1.0 выпущен в мае 2018 года.

Двумя ключевыми технологиями, используемыми для обеспечения согласованности и скорости распределенных транзакционных баз данных, являются алгоритмы консенсуса кластера и синхронизация часов узлов. Google Cloud Spanner и Azure Cosmos DB используют алгоритм консенсуса Paxos, предложенный Лесли Лэмпортом. CockroachDB и YugaByte DB используют алгоритм консенсуса Raft, предложенный Диего Онгаро и Джоном Остерхаутом.

Google Cloud Spanner использует собственный API TrueTime от Google, основанный на GPS и атомных часах. Azure Cosmos DB, CockroachDB и YugaByte DB используют временные метки гибридных логических часов (HLC) и синхронизацию часов по протоколу сетевого времени (NTP).

Цели дизайна YugaByte

Основатели YugaByte - Каннан Мутуккаруппан, Картик Ранганатан и Михаил Баутин - были коммиттерами Apache HBase, первыми инженерами Apache Cassandra и создателями платформы NoSQL Facebook (работающей на Apache HBase). Их целью для YugaByte DB был сервер распределенной базы данных, с философской точки зрения промежуточный между Azure Cosmos DB и Google Cloud Spanner; то есть они хотели объединить многомодельные и высокопроизводительные атрибуты Cosmos DB с транзакциями ACID и глобальной согласованностью Spanner. Другой способ описать их цель состоит в том, что они хотели, чтобы YugaByte DB одновременно была транзакционной, высокопроизводительной и масштабной.

Они разбили процесс на пять этапов, на создание каждого из которых уходило около шести месяцев. Первым шагом было создание строго согласованной версии RocksDB, высокопроизводительного хранилища ключей и значений, написанного на C ++, путем добавления протокола консенсуса Raft, сегментирования и балансировки нагрузки, а также удаления журнала транзакций, резервных копий на определенный момент времени, и восстановление, которое необходимо было реализовать на более высоком уровне.

Следующим шагом было создание механизма хранения ключей для документов с журнальной структурой, добавление непримитивных и вложенных типов, таких как строки, карты, коллекции и JSON. Затем они добавили подключаемый уровень API, такой как Azure Cosmos DB, реализуя Cassandra-совместимые и Redis-совместимые API-интерфейсы, и отложив PostgreSQL-совместимый SQL API на более поздний этап. Затем появились расширенные языки запросов.

YugaByte Cloud Query Language (YCQL) расширяет API Cassandra за счет поддержки распределенных транзакций, строго согласованных вторичных индексов и JSON. YugaByte Dictionary Service (YEDIS) - это API-интерфейс, совместимый с Redis, с добавлением встроенных функций сохранения, автоматического сегментирования и линейной масштабируемости. YEDIS дополнительно обеспечивает согласованное по времени чтение с малой задержкой из ближайшего центра обработки данных, в то время как сильные операции записи поддерживают глобальную согласованность. YEDIS также включает новый тип данных временных рядов.

Наконец, с версией 1.0 YugaByte DB Enterprise добавляет уровень для оркестровки, защиты и мониторинга развертываний производственного уровня в нескольких регионах и нескольких облаках, а также хранит распределенные резервные копии в настраиваемой конечной точке, такой как Amazon S3. Поддержка PostgreSQL остается неполной и находится на уровне бета-тестирования.

Распределенные транзакции ACID 

Рискуя полностью упростить этот процесс, позвольте мне попытаться резюмировать способ, которым YugaByte выполняет распределенные транзакции ACID. ACID (который означает атомарность, согласованность, изоляцию и долговечность) раньше считался свойством, ограниченным базами данных SQL.

Предположим, вы отправляете YCQL-запрос, содержащий обновления внутри транзакции, например, парный дебет и кредит, которые оба должны быть отменены в случае сбоя одного из них, чтобы сохранить согласованность финансовой базы данных. YugaByte DB принимает транзакцию в диспетчере транзакций без сохранения состояния, один из которых выполняется на каждом узле кластера. Затем диспетчер транзакций пытается запланировать транзакцию на сервере планшета, который владеет большей частью данных, к которым осуществляется доступ транзакцией, в целях повышения производительности.

Диспетчер транзакций добавляет запись транзакции с уникальным идентификатором в таблицу статуса транзакции. Затем он записывает предварительные записи на все планшеты, отвечающие за ключи, которые транзакция пытается изменить. Если есть конфликты, одна из конфликтующих транзакций откатывается.

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

Чтобы повысить производительность, YugaByte агрессивно кэширует информацию о выполняемых транзакциях, реализует детальные блокировки и использует гибридную аренду лидера времени, чтобы клиенты не читали устаревшие значения от старых лидеров. Транзакции ACID с одной строкой оптимизированы для обеспечения низких задержек при отсутствии конфликтующих операций. Распределенные транзакции ACID сохраняют правильность за счет более высоких задержек.

YCQL, YEDIS и PostgreSQL

YugaByte включает почти полную реализацию CQL, а также некоторые расширения. Одним из огромных улучшений по сравнению с Cassandra является то, что YugaByte очень последовательна, а Cassandra в конечном итоге последовательна. Другие улучшения предназначены для распределенных транзакций, строго согласованных вторичных индексов и JSON. YugaByte превосходит Cassandra по всем операциям, за исключением сканирования на короткие расстояния, по крайней мере, частично из-за его сильной согласованности, которая позволяет выполнять одно чтение вместо чтения кворума, необходимого в Cassandra.

Cassandra поддерживает четыре примитивных типа данных, которые еще не поддерживаются в YugaByte: дата, время, кортеж и варинт. YugaByte также имеет некоторые ограничения на выражения. 

В реализации Redis в YugaByte отсутствует тип данных списка, но добавлен тип данных временного ряда. Он добавляет встроенную устойчивость, автоматическое сегментирование и линейную масштабируемость, а также возможность чтения из ближайшего центра обработки данных для уменьшения задержки.

Реализация PostgreSQL от YugaByte пока не продвинулась далеко вперед. Прямо сейчас в нем отсутствуют операторы UPDATE и DELETE, выражения, а в операторе SELECT отсутствует предложение соединения.

Установка и тестирование YugaByte

Вы можете установить YugaByte DB с открытым исходным кодом из исходного кода, из архивов на MacOS, Centos 7 и Ubuntu 16.04 или новее, а также из образов Docker в Docker или Kubernetes. Затем вы можете создать кластеры и протестировать три API запросов и некоторые образцы генераторов рабочей нагрузки.

Я решил установить YugaByte DB Enterprise на облачную платформу Google. Хотя нужно было выполнить больше действий вручную, чем мне хотелось бы, я смог выполнить установку и тесты за один день после того, как получил лицензионный ключ Enterprise Edition.

Когда экземпляр YugaWare работал на экземпляре с четырьмя процессорами в Google Cloud, я настроил Google Cloud Platform в качестве облачного провайдера для моего кластера базы данных.

Затем я создал трехузловой кластер из восьми процессоров в регионе Восток США.

Я запускал нагрузочные тесты с использованием API CQL и Redis.

Мне удалось запросить данные CQL и Redis из командной строки.

Я также создал кластер из трех узлов в разных регионах мира (ниже). Это заняло больше времени (около 45 минут), и, как и ожидалось, задержка записи была намного выше. К сожалению, скорость света не обойтись.

ЮгаБайт стоит

Цена лицензии YugaByte DB Enterprise Edition на три узла начинается с 40 тысяч долларов в год. В дополнение к этому, вам необходимо учитывать стоимость серверов. Для трехузлового кластера на платформе Google Cloud Platform, использующего экземпляры виртуальных машин с восемью ЦП, эта стоимость составляет от 800 до 900 долларов в месяц плюс сетевой трафик, возможно, 11 тысяч долларов в год.

Мои собственные затраты на тестирование во второй половине дня составили 0,38 доллара на экземпляры и 0,01 доллара на межзонный выход. Удаление кластеров баз данных из интерфейса YugaByte DB Enterprise оказалось простым делом, и как только я остановил экземпляр виртуальной машины, на котором был запущен интерфейс администрирования и оркестрации, он больше не требовал значительных затрат.

Быстрее, лучше, распределяется

В целом, YugaByte DB работала так, как было заявлено. На данный момент он полезен как более быстрый, лучший распределенный Redis и Cassandra. В конечном итоге он также должен стать лучше PostgreSQL, хотя, по моему опыту, это занимает много времени (годы, а не месяцы), особенно когда вы доходите до попытки настроить реляционные соединения.

YugaByte DB еще не конкурирует с Google Cloud Spanner, CockroachDB или интерфейсом SQL для Azure Cosmos DB из-за отсутствия усовершенствованного интерфейса SQL. Он еще не конкурирует с Neo4j или графическим интерфейсом для Cosmos DB из-за отсутствия поддержки графической базы данных. Он действительно конкурирует с Redis, Cassandra и Cassandra-совместимым интерфейсом для Cosmos DB.

Стоит ли самому попробовать YugaByte DB? Если вам нужна распределенная версия Redis или Cassandra или вам нужно заменить MongoDB для глобально распределенного сценария, тогда да. YugaByte DB также может использоваться для стандартизации одной базы данных для нескольких целей, таких как объединение базы данных Cassandra с кэшированием Redis, как это сделал Нарвар, клиент YugaByte. YugaByte DB также добавляет высокопроизводительные вторичные индексы и тип JSON в Cassandra, повышая его полезность в качестве транзакционной базы данных.

Хотите ли вы версию YugaByte DB с открытым исходным кодом или корпоративную версию, зависит от вашего бюджета. По большому счету, если вы стартап, вам, вероятно, понадобится версия с открытым исходным кодом. Если вы - солидная глобальная компания со множеством приложений для транзакционных баз данных, особенно если вам нужно часто масштабировать кластеры вверх и вниз, вы можете воспользоваться дополнительными функциями в корпоративной версии.