Кластеризация Cassandra с меткой времени не работает должным образом, если первичный ключ содержит (timeuuid и метку времени)

Я использую Кассандру 2.1.5.

Я создаю таблицу, используя:

create table dummy2(  
  id timeuuid,  
  time timestamp,  
  primary key (id, time) 
) with clustering order by (time desc);

Я вставил в таблицу четыре записи:

insert into dummy2 (id, time) values (now(), 1000000);  
insert into dummy2 (id, time) values (now(), 2000000);  
insert into dummy2 (id, time) values (now(), 3000000);  
insert into dummy2 (id, time) values (now(), 4000000);  

Я получаю результаты:

 id                                   | time  
--------------------------------------+--------------------------  
 e1fa7a80-1e64-11e5-8bf5-55cdf06f740f | 1970-01-01 08:33:20+0800  
 e3bbb280-1e64-11e5-8bf5-55cdf06f740f | 1970-01-01 08:50:00+0800  
 e5ceb400-1e64-11e5-8bf5-55cdf06f740f | 1970-01-01 09:06:40+0800  
 e0719090-1e64-11e5-8bf5-55cdf06f740f | 1970-01-01 08:16:40+0800  

который выглядит как порядок карт дерева или случайный...

Если я изменю тип идентификатора с «timeuuid» на «текст», то порядок будет работать нормально:

 id    | time
-------+--------------------------
 hello | 1970-01-01 09:06:40+0800
 hello | 1970-01-01 08:50:00+0800
 hello | 1970-01-01 08:33:20+0800
 hello | 1970-01-01 08:16:40+0800

Это дизайн или ошибка? Или я неправильно его использую?


person bbsmrdj    schedule 29.06.2015    source источник


Ответы (1)


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

Итак, в вашем первом примере каждая строка сортируется по time в каждом идентификаторе. Конечно, поскольку каждый ключ раздела (id) отличается, вы не сможете это увидеть. Но во втором примере ваши ключи разделов одинаковы, поэтому ваши результаты сгруппированы по времени.

"что выглядит как порядок карт дерева или случайный..."

Они упорядочены по значениям их хешированных токенов, вы можете увидеть это, используя функцию token:

aploetz@cqlsh:stackoverflow2> SELECT token(id),id,time FROM dummy3;

 token(id)            | id    | time
----------------------+-------+--------------------------
 -3758069500696749310 | hello | 1969-12-31 19:06:40-0600
 -3758069500696749310 | hello | 1969-12-31 18:50:00-0600
 -3758069500696749310 | hello | 1969-12-31 18:33:20-0600
 -3758069500696749310 | hello | 1969-12-31 18:16:40-0600

(4 rows)

Или, возможно, лучший пример:

aploetz@cqlsh:stackoverflow2> SELECT token(id),id,time FROM dummy2;

 token(id)            | id                                   | time
----------------------+--------------------------------------+--------------------------
 -5795426230130619993 | e1fa7a80-1e64-11e5-8bf5-55cdf06f740f | 1969-12-31 18:33:20-0600
 -2088884548269216731 | e3bbb280-1e64-11e5-8bf5-55cdf06f740f | 1969-12-31 18:50:00-0600
  8496311684589314797 | e5ceb400-1e64-11e5-8bf5-55cdf06f740f | 1969-12-31 19:06:40-0600
  8930307282139899213 | e0719090-1e64-11e5-8bf5-55cdf06f740f | 1969-12-31 18:16:40-0600

(4 rows)

Ранее в этом году я написал статью для PlanetCassandra на эту часто неправильно понимаемую тему: Мы должны Закажите! Прочтите его и посмотрите, поможет ли это вам выбрать правильное направление.

person Aaron    schedule 29.06.2015
comment
Спасибо за ответ на вопрос и дальнейшее разъяснение деталей. Действительно полезно. Я прочитаю вашу статью, чтобы увидеть, как это может относиться к моему дизайну. - person bbsmrdj; 29.06.2015
comment
@bbsmrdj Нет проблем, рад, что смог помочь! - person Aaron; 29.06.2015