O que é CRDT em Sistemas Distribuídos?

Sou um novato em Sistemas Distribuídos e estou a tentar ter uma ideia sobre o conceito de CRDT. Sei que tem três anotações:
Conflict-free Replicated Data Type
Convergent Replicated Data Type
Commutative Replicated Data Type
Alguém pode dar um exemplo onde usamos CRDT em sistemas distribuídos? Muito obrigado antecipadamente.

Author: fnaticRC ggwp, 2015-12-10

3 answers

Os CRDTs são inspirados pelo trabalho de Marc Shapiro. Em computação distribuída, um tipo de dados replicados sem conflito (abreviado CRDT) é um tipo de estrutura de dados especialmente projetada usada para alcançar uma forte consistência eventual (SEC) e monotonicidade (ausência de retrocessos). Existem duas vias alternativas para assegurar a SEC: os CRDTs baseados na operação e os CRDTs baseados no estado.

Os CRDTs em diferentes réplicas podem divergir uns dos outros, mas no final podem ser fundidos com segurança, desde que eventualmente, um valor consistente. Em outras palavras, CRDTs têm um método de junção que é idempotente, comutativo e associativo.

As duas alternativas são equivalentes, uma pode emular a outra, mas os CRDTs baseados em operações requerem garantias adicionais do middleware de comunicação. CRDTs são usados para replicar dados através de vários computadores em uma rede, executando atualizações sem a necessidade de sincronização remota. Isso levaria a uma fusão de conflitos em sistemas usando o convencional eventual tecnologia de consistência, mas CRDTs são projetados de tal forma que os conflitos são matematicamente impossíveis. Under the constraints of the CAP theorem they provide the strongest consistency guaranties for available / partition-tolerant (AP) settings.

Alguns exemplos em que são utilizados

O Riak é a biblioteca de código aberto mais popular do CRDT e é usado pela Bet365 e pelo League of Legends. Abaixo estão alguns links úteis que suportam Riak.

1 - Bet365 (usa Erlang e Riak) http://www.erlang-factory.com/static/upload/media/1434558446558020erlanguserconference2015bet365michaelowen.pdf

2 - League of Legends USA a implementação Riak CRDT para o seu sistema de chat no jogo (que lida com 7,5 milhões de utilizadores concorrentes e 11 mil mensagens por segundo)

3-Roshi implementado por SoundCloud que suporta um conjunto de tempo LWW: - Post no Blog: https://developers.soundcloud.com/blog/roshi-a-crdt-system-for-timestamped-events

 14
Author: Metin Dagcilar, 2016-03-15 13:16:38

Os CRDTs usam a matemática para impor consistência através de um conjunto distribuído, sem ter que se preocupar com consenso e latência/indisponibilidade associada.

O conjunto de valores que um CRDT pode tomar a qualquer momento, vem sob a categoria de uma semi-Estrutura (especificamente uma semi-Estrutura de junção), que é um POSET (conjunto parcialmente ordenado) com uma função de limite inferior superior (LUB).

Em termos simples, um POSET é uma coleção de itens em que nem todos são comparáveis. Por exemplo, em uma matriz de pares: {(2,4), (4, 5), (2, 1), (6, 3)}, (2,4) is (4,5), but can't be compared with (6,3) (since one element is larger and the other smaller). Agora, um semi-retículo é um POSET em que dado 2 pares, mesmo que você não possa comparar os dois, você pode encontrar um elemento maior do que ambos (LUB).

Outra condição é que as actualizações deste tipo de dados tenham de aumentar, os CRDTs têm um estado monotonicamente crescente, onde os clientes nunca observam a reversão do estado.

Este artigoExcelente usa a matriz I usado acima como exemplo. Para um CRDT que mantenha esses valores, se duas réplicas estão tentando alcançar um consenso entre (4,5) e (6,3), elas podem escolher um LUB = (6,5) como consenso e atribuir ambas as réplicas a ele. Uma vez que os valores estão a aumentar, este é um bom valor para resolver.

Há duas maneiras de os CRDTs se manterem em sincronia entre si através de réplicas, eles podem transferir o estado periodicamente (tipo de dados replicados convergentes), ou podem transferir actualizações (deltas) à medida que vão obtendo them (comutative replicated data type). O primeiro precisa de mais largura de banda.

Soundcloud's Roshi é um bom exemplo (embora não esteja mais em desenvolvimento, parece), eles armazenam dados associados a um timestamp, onde o timestamp está obviamente aumentando. Todas as atualizações que venham com um timestamp menor ou igual do que o armazenado são descartadas, o que garante idempotência (as escritas repetidas são OK) e comutatividade (as escritas fora de ordem são ok. A comutatividade é a=b means b=a, que neste case means update1 followed by update2 is same as update2 followed by update1)

As escritas são enviadas para todos os grupos, e se certos nós não respondem devido a um problema como lentidão ou partição, espera-se que eles alcancem mais tarde através de a read-repair, o que garante que os valores convergem. A convergência pode ser alcançada através de 2 protocolos como eu mencionei acima, propagar estado ou atualizações para outras réplicas. Acho que o Roshi faz o primeiro. Como parte do read-repair, o estado de permuta das réplicas, e porque os dados aderem à propriedade semi-retículo, convergem.

PS. Sistemas que usam CRDTs são eventualmente consistentes, ou seja, adotam AP (altamente disponível e tolerante à partição) no teorema de CAP .

Outra excelente leitura sobre o assunto.

 2
Author: Siddhartha, 2018-07-26 21:25:29
Essas três expansões do acrónimo significam basicamente a mesma coisa.

Um CRDT é convergente se as mesmas operações aplicadas numa sequência diferente produz (converge para) o mesmo resultado. Isto é, as operações podem ser comutadas - é um RDT comutativo. A razão pela qual as operações podem ser aplicadas em uma sequência diferente e ainda obter o mesmo resultado é que as operações são livres de conflitos.

Então CRDT significa a mesma coisa, qualquer uma das três expansões você usa-embora pessoalmente eu prefira "convergente".
 1
Author: cliffordheath, 2015-12-10 02:21:10