2016-02-19 2 views
1

Je suis nouveau à Cassandra et j'ai lu que la clé primaire est la même chose que la clé de partition.Comment fonctionnent les clés de partition?

Ma question est simple, dans ce cas:

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

Comme la clé de partition est responsable de la distribution de données accross vos noeuds, comment les données seront distribués par username dans ce cas?

+0

Vous pouvez lire à propos de la différence entre la clé primaire et la clé de partition ici: http://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clustering-key-in-cassandra – grzesiekw

+0

S'il vous plaît lire ma question à nouveau – farhawa

Répondre

2

En fait, la PRIMARY KEY est pas identique à la clé de partition. La clé de partition fait partie de la clé PRIMARY. Et oui, c'est la partie qui détermine comment une ligne est distribuée à travers le cluster.

Comment les données seront-elles distribuées par nom d'utilisateur dans ce cas?

Si je crée votre table, insérez des valeurs et d'interroger ce que je peux obtenir un peu d'une fenêtre dans le processus de distribution en utilisant la fonction token dans mon 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) 

Supposons que je avoir 5 nœuds. Dans Cassandra, chaque noeud est responsable d'une plage de jetons primaire. Supposons que les éléments suivants:

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

Note: Plages calculées en exécutant:

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

dépeignit aussi cette façon MVP Robbie Strickland de Cassandra High Availability.

Cassandra prend la valeur du jeton haché de la clé de partition (user_name dans ce cas) et l'utilise pour déterminer le nœud sur lequel l'affichage de ligne doit être distribué. Compte tenu des valeurs symboliques hachurées ci-dessus, et les plages que je viens d'énumérer dehors, ce sont les noeuds que chaque nom d'utilisateur doit aller à:

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

En fonction de votre facteur de réplication (RF), Cassandra peut également placer des répliques supplémentaires de chaque rangée sur les autres noeuds.

1

Vous pouvez vérifier où vos données seront placées avec nodetool getendpoints.

Voici un exemple simple. J'utilise ici ccm pour créer mon cluster - https://github.com/pcmanus/ccm.

Je vais utiliser vos utilisateurs de table avec le configration keyspace suivant:

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

Donc, il y aura 3 répliques.

D'abord je créer cluster avec 5 nœuds:

> ccm create -v 3.2 -n 5 test 

eux commencent:

> ccm start 

et vérifier si mon groupe est en cours d'exécution:

> ccm status         

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

Maintenant, je peux vérifier où les données seront placées avec nodetool getendpoints:

> ccm node1 nodetool getendpoints test_user users john;  

127.0.0.1 
127.0.0.2 
127.0.0.3 

'john' sera sur 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' sera sur 127.0.0.3, 127.0.0.4, 127.0.0.5.