Статьи

Кассандра: извлеченные уроки

Пару месяцев работы с Кассандрой я подумала о том, как записать свой опыт в Кассандре, включая то, что мы делали, что мне нравилось, а что нет. Но мне нужно поставить небольшой отказ от ответственности. Мы в настоящее время используем Cassandra 0.7 ( «Что! # $ * ?? Вы живете под роком? Получите ваш самостоятельную жизнь и обновить установку штопать» вы могли бы сказать. Я знаю. Я знаю .. :). Мы работаем над Это.). Поэтому некоторые из упомянутых здесь вещей не будут относиться к более поздним версиям, хотя используемые нами концепции по-прежнему в основном применимы. (Я думаю, что похвалу следует отдать людям Кассандры за то, что они выпустили несколько быстрых релизов с некоторыми интересными новыми функциями.)

При этом позвольте мне рассказать о том, что мы делали с Кассандрой. Наш вариант использования примерно следующий. Мы используем Cassandra в качестве постоянного слоя нашего решения для мониторинга бизнес-активности на WSO2, которое переписано для лучшего масштабирования (о котором я надеюсь в некоторых случаях написать в блоге о решении BAM-решения с возможностью масштабирования больших данных —  WSO2 BAM) скоро.). Данные закачиваются с серверов, которые отслеживаются как события, состоящие из пар ключ-значение, и записываются в хранилище Cassandra после некоторой минимальной необходимой обработки на приемнике.

Рисунок 1: Формат события

Эти данные затем индексируются для облегчения анализа данных . Здесь наш вариант использования отличается от обычных случаев использования Cassandra, когда запросы известны заранее, и мы начинаем с запроса и строим нашу модель данных Cassandra. Поскольку то, что мы создаем, является общей аналитической структурой данных, мы не знаем, какие запросы пользователи хотят выполнить для своих хранимых данных в Cassandra. Но потом мы подумали, что если мы сможем заранее создать набор индексов в соответствии с выполняемыми запросами, это решит нашу дилемму. Поэтому мы решили дать пользователям возможность определять, какие индексы будут построены, используя конфигурацию XML, которая примерно выглядит следующим образом.

<index name="serverByTime">
   <part name="server"/>
   <part name="time"/>
</index>

Здесь мы создаем составной индекс, который может обслуживать запросы, такие как «Дайте мне события, пришедшие с сервера« esb12 »за период с« 08: 00 »по« 09: 00 »». Индексация происходит, как описано ниже.

Рисунок 2: Модель индексации


1.
Прочитайте событие из первичного семейства столбцов. (В основном строка из семейства первичных столбцов)

2 . Если событие содержит ключи сервера и времени, получают соответствующие значения этих ключей и объединяют их для создания ключа строки семейства столбцов индекса (в данном случае serverByTime).

3. Создайте семейство столбцов индекса, если оно отсутствует. Добавьте новую строку с созданным ключом строки, если он еще не существует в семействе столбцов индекса, и добавьте в него столбец, содержащий идентификатор события.

4. Добавьте вновь созданный ключ строки в качестве столбца в строке индекса семейства столбцов индекса.

Как видно, мы используем семейство столбцов для каждого индекса. Cassandra не сортирует строки по ключам строк, если вы используете RandomPartitioner, который является рекомендуемым разделителем для повышения производительности. Но столбцы внутри строк всегда сортируются с использованием ключа столбца. Мы используем это свойство для хранения индекса, чтобы его можно было запрашивать с помощью запросов диапазона. Каждое семейство столбцов имеет специальную строку, называемую « индексная строка », в которой хранятся все ключи строк семейства столбцов. Когда требуется запросить индекс, сначала выполняется запрос диапазона в этой строке, чтобы получить требуемые ключи строки. Допустим, мы хотели сделать запрос, чтобы получить «все события с серверов esb12 на esb15 за периоды с 08:00 до 09:00». Давайте посмотрим, как это сделать, используя нашу модель индексации.

1. Получите значения диапазона для необходимых субиндексов. В этом случае от «esb12 ″ до« esb15 »для сервера и от« 08:00 »до« 09:00 »для времени.

2. Создайте диапазон первого и последнего значений путем объединения значений подиндексов. Первым значением диапазона будет «esb12—08: 00», а последним диапазоном будет «esb15—09: 00». Здесь ‘-‘ — это постоянный разделитель, который мы используем при объединении частей ключа строки.

3. Сделайте запрос диапазона в строке индекса и получите ключи строки в диапазоне.

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

Здесь, используя эту модель, мы можем выполнять запросы диапазона по нескольким индексам, используя этот метод. Одно из преимуществ этого по сравнению с собственным вторичным индексным средством, присутствующим начиная с версии 0.8, заключается в том, что первый запрос индекса не ограничен операцией равенства (например, сервер равен «esb12» и т. Д.). Но порядок подиндексов, составляющих составной индекс (например, порядок частей ключа строки. В данном случае сервер-время ) определяет типы запросов, которые могут быть выполнены. Например, мы не можем запросить только используя время. Для этого нам нужно создать еще один составной индекс, начиная со времени в качестве первого подиндекса.

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

В целом, это довольно сложная схема, чтобы получить то, что мы хотели от Кассандры. Я бы сказал, что это не слишком выгодно. Также объединение и создание ключей строк показалось мне немного хакерским. Также нам пришлось придумать несколько приемов, чтобы заставить пакетную работу работать с запросами диапазона. Может быть, это не так, что странная Кассандра также наивно известна как «Хакендра» среди некоторых из нас (я чувствую, что :)это звучит довольно мило ), так как иногда трудно не испытать это досадное чувство: «Я что-то делаю здесь? ?» в глубине души, работая с Кассандрой. Но это вовсе не значит, что Кассандра — это зло. Нам нравится Cassandra за быструю запись и масштабируемую архитектуру. Но в реальной жизни, когда дело доходит до отношений, не все идеально. Но это не значит, что нам все равно. Наши отношения с Кассандрой ничем не отличаются. :),

Источник: http://chamibuddhika.wordpress.com/2011/11/27/cassandra-lessons-learnt/