2017-06-14 7 views
0

Comment Cassandra garantit-il une cohérence éventuelle lors de l'écriture simultanée? Par exemple, le client A écrit sur tableA.rowA.colA, alors que le client B écrit en même temps sur tableA.rowA.colA.Cassandra concurrent écrit

Les nœuds de coordinateur distribuent la requête aux nœuds de réplique, à savoir NodeA NodeB et NodeC.

Sur le noeud A, la requête ClientA arrive en premier. Sur NodeB, la requête ClientB arrive en premier. Alors, sera-t-il toujours incohérent?

Répondre

3

Cassandra suit une politique "Last Write Wins". L'horodatage utilisé peut être défini manuellement mais par défaut, le côté client est défini par le demandeur see Datastax Java Driver docs. L'ordre dans lequel les écritures arrivent n'est pas pertinent. Si l'écriture A a un horodatage plus tôt que l'écriture B, elle sera toujours écrasée par l'écriture B. Le seul cas ambigu est celui où les horodatages correspondent exactement. Dans ce cas, la valeur plus grande gagne.

La partie éventuellement cohérente de c'est:

  • En supposant A a un horodatage plus tôt que B
  • Si A arrive sur une réplique 1 et B arrive sur Replica 2, l'état est B
  • Le réplica 1 répond A jusqu'à ce qu'il reçoive les informations sur B à partir de la réplique 2
  • Lorsque B est répliqué, le réplica 1 répond également à B.

La plupart des cas d'utilisation impliquent de ne pas stocker l'état dans Cassandra afin que ces types de problèmes ne se produisent pas.

+0

OK, l'horodatage est réglé avant qu'elle atteigne une machines de réplique. Donc, assurez-vous que toutes les demandes de mise à jour ont le même horodatage pour le même client. – user1947415

+0

Comment les clients synchronisent-ils leur horodatage? comme serveur différent ont l'heure locale différente. – user1947415

+0

NTP généralement, mais il est plus important de construire un modèle de données où différents clients ayant un temps de non-synchronisation ne détruira pas les données. – RussS

1

Chaque écriture (insertion/mise à jour/suppression) sur cassandra, un horodatage associé à chaque colonne est également inséré. Lorsque vous exécutez une requête de lecture, les horodatages sont utilisés pour sélectionner une mise à jour "gagnante" dans une seule colonne ou élément de collection

Et si j'ai une écriture réellement simultanée avec le même horodatage? Dans le cas improbable où vous obtenez exactement deux horodatages correspondant à sa microseconde, vous pourriez vous retrouver avec une mauvaise version, mais Cassandra s'assure que les liens sont systématiquement rompus en comparant les valeurs des octets.

Donc pour votre cas " sur NodeA la demande ClientA arrive en premier. sur NodeB la demande de ClientB arrivent d'abord »

  • Si l'horodatage de la demande ClientA est la plus ancienne alors ClientA gagnera

  • Si l'horodatage de demande ClientB est plus ancienne que ClientB gagnera .

  • Si ClientA et ClientB les deux ont le même horodatage puis gagnant est choisi en comparant les valeurs lexicalement par octets, de sorte que la valeur retournée est déterministe