2016-02-19 3 views
1

Я новичок в Cassandra, и я прочитал, что первичный ключ - это то же самое, что и ключ раздела.Как работают ключи разделов?

Мой вопрос прост, в этом случае:

CREATE TABLE users (
    user_name varchar PRIMARY KEY, 
    password varchar, 
    gender varchar, 
    session_token varchar, 
    state varchar, 
    birth_year bigint 
); 

В качестве ключа секционирования является отвечает за распределение данных accross ваших узлов, как данные будут распределены по username в этом случае?

+0

Вы можете прочитать о различии между основным ключом и ключом раздела здесь: http://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clustering-key-in-cassandra – grzesiekw

+0

Пожалуйста, снова прочитайте мой вопрос – farhawa

ответ

2

На самом деле, PRIMARY KEY не так же, как и ключ раздела. Ключ раздела является частью ПЕРВИЧНОГО КЛЮЧА. И да, именно эта часть определяет, как строка распределяется по кластеру.

Каким образом данные будут распределены по имени пользователя в этом случае?

Если я создам таблицу, вставить некоторые значения и запросить его я могу получить немного окна в процесс распределения с помощью функции token в моем SELECT:

> SELECT token(user_name), user_name FROM user2; 

system.token(user_name) | user_name 
-------------------------+----------- 
    -5077180869401877077 | Patdard 
    -4874582970682694928 |  Robo 
    4639906948852899531 |  Bill 
    4645660266327417866 |  Bob 
    4877648712764681009 | Valentina 
    5726383012007749221 | Helcine 
    7724711996172375448 | Jebediah 

(7 rows) 

Давайте предположим, что я имеют 5 узлов. В Кассандре каждый узел отвечает за диапазон первичных маркеров. Давайте предположим следующее:

1) 5534023222112865485 to -9223372036854775808 
2) -9223372036854775807 to -5534023222112865485 
3) -5534023222112865484 to -1844674407370955162 
4) -1844674407370955161 to 1844674407370955161 
5) 1844674407370955161 to 5534023222112865484 

Примечание: Диапазоны рассчитываемые работы:

python -c 'print [str(((2**64/5) * i) - 2**63) for i in range(5)]' 

также описал этот путь в MVP Робби Стриклэнда Cassandra High Availability.

В этом случае Cassandra берет значение хэшированного ключа ключа (user_name) и использует это, чтобы определить, к какому узлу будет отображаться строка. Учитывая хэшированные лексемы значения выше, и диапазоны, которые я перечислил, это те узлы, которые каждое имя пользователя должно пойти в:

Node 1: Helcine, Jebediah 
Node 3: Patdard, Robo 
Node 5: Bill, Bob, Valentina 

В зависимости от вашего фактора репликации (РФ), Cassandra может также разместить дополнительные копии каждой строки на других узлах.

1

Вы можете узнать, где будут размещаться ваши данные, с помощью nodetool getendpoints.

Ниже приведен простой пример.

Я использую здесь ccm для создания своего кластера - https://github.com/pcmanus/ccm.

Я буду использовать ваши пользователь таблицы со следующим configration ключевого пространства:

CREATE KEYSPACE test_user WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}; 

Так будет 3 реплики.

Сначала я создать кластер с 5 узлов:

> ccm create -v 3.2 -n 5 test 

начать их:

> ccm start 

и проверить, если мой кластер и работает:

> ccm status         

Cluster: 'test' 
--------------- 
node1: UP 
node3: UP 
node2: UP 
node5: UP 
node4: UP 

Теперь я могу проверить где данные будут размещены с nodetool getendpoints:

> ccm node1 nodetool getendpoints test_user users john;  

127.0.0.1 
127.0.0.2 
127.0.0.3 

«john» будет на 127.0.0.1, 127.0.0.2, 127.0.0.3.

> ccm node1 nodetool getendpoints test_user users tom; 

127.0.0.3 
127.0.0.4 
127.0.0.5 

'tom' будет на 127.0.0.3, 127.0.0.4, 127.0.0.5.

Смежные вопросы