5

Esiste un db distribuito ad alta disponibilità, eventualmente coerente che supporta l'operazione idempotent su valori scalari?Eventualmente coerente database distribuito con operatore di incremento idempotenziale?

Se si utilizzano gli aggiornamenti normali, è possibile che avremo 2 valori diversi su nodi diversi e nessuno dei valori sarebbe corretto poiché è necessario aumentare gli importi per entrambi i valori di transazione.

C'è un db distribuito in cui posso inviare un comando di aumento (chiave, attributo [colonna], diff) in modo che quando ricevo una risposta posso essere sicuro che quell'operazione verrà eseguita su altre repliche indipendentemente dalla corrente valore dell'account? In questo modo avrò la consistenza finale per aumentare l'operazione anche se 2 nodi diversi sono aumentati di un valore diverso perché quell'aumento si propagherebbe ad altre repliche.

Non sto parlando di aggiornamenti condizionali in quanto non funzionerebbe con l'alta disponibilità db come cassandra (è per questo che non hanno questa caratteristica), mi interessa l'operazione di aumento atomico.

Grazie.

P.S. Nel caso di aumento idempotent avrei un aumento comando (chiave, attributo, diff, lock_key) in modo che db non farebbe aumentare se già ricevuto lo stesso comando con lo stesso lock_key

tl; dr:

C'è un modo per fare un contatore preciso nel database di tipo AP distribuito? 2 problemi: 1) Se invio un'operazione per aumentare un contatore e non ottengo risposta, invierei nuovamente quella richiesta ma non voglio aumentare il contatore due volte. 2) Se quel contatore viene aggiornato nello stesso tempo su un'altra replica, desidero combinare eventualmente questo aumento, non per sovrascrivere i valori. Quindi c'è un comando come aumento ("equilibrio di John", +5.67, "sdfsdfas") dove sdfsdfas è una stringa utilizzata per scartare l'aggiornamento duplicato. C'è un db che replica questo tipo di comandi?

+0

Non sono sicuro di capire lo scenario in cui ciò sarebbe utile. Se è fondamentale che tutte le repliche debbano mantenere lo stesso valore in ogni momento, devono essere mantenute sincronizzate. In che modo "gli aggiornamenti idempotenti" potrebbero essere d'aiuto? –

+0

cosa ne pensi di utilizzare qualsiasi db con la replica, e quindi equivalentemente "inserire in increase_operations (target_id, increase_amount, operation_id)" e quindi sum() la tua strada verso la vittoria? operation_id è il modo in cui si identificano le operazioni duplicate. Sicuramente alla fine coerente. – goat

risposta

1

Ok, vedo che problema 2 è stato risolto in cassandra https://issues.apache.org/jira/browse/CASSANDRA-1072 contatori Distributed si combinano operazioni di aumento quindi tutto sarà coerente alla fine.

Problema 1 (idempotenza) è una questione aperta: https://issues.apache.org/jira/browse/CASSANDRA-4775

almeno so che la gente pensa a tale proposito, è molto importante per il mio scenario così cercherò di aiutare a risolvere questo problema.

Spero che questo aiuti a chiarire la mia domanda.

1

Mi sembra che tu stia parlando di due cose diverse. Idempotence significherebbe che è possibile inviare più volte l'istruzione increase ma il contatore verrà aumentato solo una volta. L'atomicità non ha senso per una singola operazione (ha senso per più di uno, ad esempio, aumentare il contatore E la data di aumentare atomicamente, o entrambi vengono modificati, o nessuno lo fa).

MongoDB supporta le operazioni atomiche a livello di "documento" (che non sono sicuro che sia necessario), ma ovviamente un operatore di incremento non è idempotente (per definizione! Come si aumenterebbe il contatore altrimenti?).

Puoi chiarire la tua domanda?

Inoltre, non è possibile avere un database "alla fine coerente" in cui tutti i nodi avranno sempre lo stesso valore di una determinata chiave. Ecco perché è "alla fine coerente", perché non può garantire che siano gli stessi "in questo momento".

quanto per una risposta, se si desidera utilizzare MongoDB per il mantenimento di un operatore di incremento, utilizzare il seguente schema (dal loro sito web, ad esempio del [$inc operator][1]):

db.collection.update({ age: 20 }, { $inc: { age: 1 } }); 
db.collection.update({ name: "John" }, { $inc: { age: 1 } }); 

Nel tuo caso, sarebbe db.collection.update({$inc:{mycounter:1}});

+0

sì, mi piacerebbe avere qualcosa come l'aggiornamento ({nome: "John"}, {$ inc: {balance: 58.4}}); Ricevo una conferma in MongoDB in modo da non eseguire la stessa query due volte? Questo è un modo. Un altro modo per ottenere lo stesso risultato è una sorta di aumento idempotenziale in modo che la stessa operazione non funzioni due volte. Per esempio se il comando richiede di fornire un qualche tipo di lock_key in modo che sappia se ho già provato ad aggiornare. Mi piacerebbe vedere una funzione come quella in un database AP (MongoDB è CP, giusto?) – user1944408

+0

Aggiunto tl; dr nella mia domanda. – user1944408

Problemi correlati