Cassandra CompositeType как средство проверки ключа строки

Я работаю над некоторыми POC.

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

CREATE COLUMN FAMILY logs with comparator='ReversedType(TimeUUIDType)' and key_validation_class='CompositeType(UTF8Type,IntegerType)' and default_validation_class=UTF8Type;

поэтому для каждого имени сервера у нас есть N строк, и мы записываем данные в каждую строку, используя алгоритм Very Simple Round Robin.

У меня нет проблем с записью данных в любую строку:

   Mutator<Composite> mutator = HFactory.createMutator(keySpace, CompositeSerializer.get());
    HColumn<UUID,String> col = 
    HFactory.createColumn( TimeUUIDUtils.getUniqueTimeUUIDinMillis(), log);
    Composite rowName = new Composite();
    rowName.addComponent(serverName, StringSerializer.get());
    rowName.addComponent(this.roundRobinDestributor.getRow(), IntegerSerializer.get());
    mutator.insert(rowName, columnFamilyName, col);
}

Пока все хорошо, но теперь у меня два вопроса:

1) Из-за того, что если я хочу получить все журналы для некоторого serverName, я буду сканировать ключи строк, должен ли я использовать ByteOrderedPartitioner?

2) Может ли кто-нибудь помочь мне или указать мне на какую-то помощь, как создать запрос Гектора, который выведет все строки для server1 ({server1:0}, {server1:1} {server1:2) и т. д...)? Я видел много примеров использования CompositeType в качестве компаратора, но ни одного примера для проверки ключа.

Любая помощь или комментарий высоко ценятся.


person danny.lesnik    schedule 08.12.2012    source источник


Ответы (1)


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

  1. ByteOrderedPartitioner не выглядит здесь хорошим вариантом, так как будет сложно добиться равномерного распределения строк по кластеру, что приведет к хотспотам.

  2. Невозможно запросить диапазон ключей при использовании RandomPartitioner. Однако, если максимальное значение N достаточно мало (до 256), MultigetSliceQuery можно использовать для запроса всего набора строк.

person Wildfire    schedule 08.12.2012
comment
спасибо за комментарий, но что, если моя строка станет больше, чем размер узла в кластере? Насколько я понимаю, нет другого способа разделить одну строку по кластеру. - person danny.lesnik; 08.12.2012
comment
@danny.lesnik: Конечно, в этой ситуации требуется разбиение, я не подумал об этих больших строках. В любом случае, остальная часть моего ответа остается в силе: не используйте ByteOrderedPartitioner, так как он будет размещать целые диапазоны на одном сервере, а MultigetSliceQuery с правильным диапазоном столбцов должен работать нормально. - person Wildfire; 09.12.2012