J'essaie de comprendre comment exactement les données sont répliquées sur plusieurs nœuds dans Cassandra. Supposons que nous ayons 6 nœuds et que le facteur de réplication est 3. Pour toute simplicité, supposons un seul centre de données et un seul rack. Puisque RF vaut 3, les données sont stockées dans 3 répliques. Je veux comprendre comment les 3 répliques sont décidées.

Se référant à l'exemple dans http: //www.datastax. com / dev / blog / virtual-nodes-in-cassandra-1-2 (première image, deuxième partie, c'est-à-dire avec des nœuds virtuels), disons que notre ligne tombe sous le nœud virtuel 'E' comme décidé par le partitionneur. La ligne doit donc être présente dans les nœuds 1, 5, 6 en fonction de la répartition des nœuds virtuels entre les différents nœuds.

Mais à venir à la documentation - http://docs.datastax.com /en/cassandra/2.1/cassandra/architecture/architectureDataDistributeReplication_c.html, il est dit que même dans le cas simple de SimpleStrategy, la première réplique sur un nœud est déterminée par le partitionneur. Des répliques supplémentaires sont placées sur les nœuds suivants dans le sens horaire de l'anneau. Les données seront-elles stockées dans des nœuds virtuels E, F, G ou peuvent-elles être des nœuds 1, 2, 3?

Laquelle est correcte ? 1er lien ou documentation?

Merci!

2
mac 16 janv. 2017 à 17:02

2 réponses

Meilleure réponse

Et si cela vous intéresse vraiment où vos données de partition se retrouvent dans le cluster, vous pouvez utiliser:

nodetool getendpoints

https://docs.datastax.com/en/cassandra/2.1/cassandra/tools/toolsGetEndPoints.html

Veuillez tenir compte du fait que la documentation est simplifiée afin que les gens la comprennent plus facilement lorsqu'ils voient pour la première fois. En réalité, c'est un hachage cohérent sur les stéroïdes.

Auparavant, chaque nœud avait un seul jeton et les jetons étaient des limites sur l'anneau qui étaient utilisées pour un hachage cohérent. En gros, vous aviez une plage entière divisée en nombre de nœuds que vous aviez dans le cluster. Lorsque vous deviez effectuer une opération sur une partition, vous preniez la clé de partition, vous la hachiez et vous saviez à quel nœud aller. Fondamentalement, après le hachage, vous obtenez un nombre dans une plage de -2 ^ 63 à 2 ^ 63 - 1. Ensuite, vous allez dans le sens des aiguilles d'une montre sur l'anneau jusqu'à ce que vous "trouviez" un marqueur et c'est ainsi que vous savez à quel nœud une partition appartient initialement. Si vous avez un plus grand facteur de réplication, continuez simplement dans le sens des aiguilles d'une montre sur l'anneau jusqu'à ce que vous "trouviez" tous les nœuds dont vous avez besoin pour satisfaire le facteur de réplication. Et c'est ainsi que vous savez quels nœuds du cluster ont votre partition.

Avec les nœuds virtuels, il existe une propriété num_tokens et chaque nœud sélectionne autant de jetons aléatoires (dans la plage mentionnée précédemment) lors de la jonction de l'anneau et ils sont ensuite utilisés pour un hachage cohérent. Fondamentalement, chaque nœud voit alors que le nouveau nœud veut avoir des parties de l'anneau et lui transmet les données. De plus, lorsque de nouvelles écritures arrivent, elles sont envoyées au nouveau nœud qui va les posséder (jusqu'à ce que le nœud rejoigne complètement l'anneau, ses réponses sont ignorées lorsqu'elles sont comptées pour les niveaux de cohérence).

Voici comment c'était avant (un seul jeton par nœud dans le cluster): Standard Consistent Hashing

Voici à quoi ressemble l'anneau avec les nœuds virtuels: Hashing cohérent avec les vnodes

Absolument les mêmes règles s'appliquent avec les nœuds virtuels et le hachage cohérent ordinaire, vous faites le tour de l'anneau pour sélectionner les répliques. Si lors de votre contournement de l'anneau, vous tombez à nouveau sur le même nœud, il vous suffit de l'ignorer et de continuer jusqu'à ce que vous trouviez tous les nœuds qui possèdent les données en fonction du facteur de réplication souhaité.

2
Marko Švaljek 17 janv. 2017 à 09:52

Les deux sont corrects mais je peux comprendre la confusion. Laisse-moi expliquer:

Dans ce cas, votre ligne tombe dans une certaine plage. Le partitionneur sait qu'un nœud est principalement responsable de cette plage. Il ne connaît pas les autres nœuds. Cependant, il peut déduire les autres nœuds en fonction du premier nœud.

Dans ce cas, le premier nœud est cinq. Il détient la plage de jetons E. Maintenant, réfléchissons à cette déclaration.

Des répliques supplémentaires sont placées sur les nœuds suivants dans le sens horaire de l'anneau.

Si vous utilisez SimpleStrategy, les nœuds suivants sont choisis dans le sens des aiguilles d'une montre à partir du premier nœud. Ce qui dans ce cas est de six et un. Un est choisi, car la plage de jetons va du maximum au minimum.

Notez que les nœuds sont disposés dans le sens des aiguilles d'une montre. Cinq, six et enfin un. Alors que la plage de jetons s'étend du maximum au minimum.

C'est ce que l'image du premier lien essaie d'expliquer en donnant aux 3 nœuds la plage de jetons E. Certains nœuds sont responsables de cette plage de jetons car ils héritent des lignes d'un nœud antérieur. Ils sont responsables de certaines plages car ils sont les suivants.

1
Jan 16 janv. 2017 à 14:56