Redis (oito) Distribuído Bloqueio

esboço

O artigo descreve o uso de distribuídos em Redis introduz a realização de ideias, bem como funções RedLock alcançar.

motivação bloqueio distribuído

Quando existem vários clientes, mas apenas um tem o direito de realizar arquitetura distribuída pode considerar o uso de um bloqueio distribuído. É preciso primeiro saber o propósito do bloqueio é conseguir a execução sequencial.

projeto RedLock

Nós deve atender a dois objetivos: para proteger a segurança ea atividade

  1. atributo de segurança: o mutex para garantir que apenas um cliente ao mesmo tempo para obter um bloqueio.
  2. propriedades activas A: deadlock libertação, acidente cliente ou cluster partição obtido de bloqueio pode ser libertado
  3. Ativo propriedade B: tolerância a falhas, enquanto a maioria dos gânglios Redis estão vivos, o cliente é provável para adquirir e liberar o bloqueio.

Por que só alcançar failover-base não é suficiente

Isto é porque geralmente usam replicação mestre-escravo mestre-escravo para atingir uma elevada disponibilidade, mas pode ser a seguinte:

  1. Cliente Um adquire o bloqueio. (Clientâ a adquirida em trava master) no mestre
  2. Os acidentes de mestre antes da gravação para a chave é transmitida ao escravo. (Escrito no mestre de tempo de replicação escravo, mestre baixo off)
  3. O escravo é promovido a mestre. (Neste herança ponto de escravos, tornou-se o novo mestre do masster original)
  4. Cliente B adquire o bloqueio ao mesmo recurso A já mantém um bloqueio para. VIOLAÇÃO DE SEGURANÇA! (Porque o velho mestre para baixo o inimigo, em seguida, o pedido de escrita não é capaz de replicar o sucesso, clientB adquirir o bloqueio no novo mestre, caso em que dois clientes têm o bloqueio)

implementação RedLock

Distribuídos nós Bloqueio único Redis

Adquirir um bloqueio

SET resource_name my_random_value NX PX 30000

Vemos aqui o uso de duas coisas principais: my_randow_value e expiração tempo. my_random_value para cada cliente é único, é usado para ordenar a libertação de presos de forma segura, utilizando lua para representar o seguinte processo: Se esta chave estiver presente, e entre my_random_value exatamente como o meu, então você pode seguramente excluída.

Em relação ao tempo de expiração

Quando um cliente obtém o bloqueio for bem sucedida, se ele falhar, ou devido a segmentação de rede (partição de rede) teve lugar fazendo com que nenhuma comunicação nó Redis mais tempo e, em seguida, ele teria sido segurando o bloqueio e outros clientes para sempre você não pode obter um bloqueio

se redis.call ( "get", KEYS [1]) == ARGV [1], em seguida, 
    retornar redis.call ( "del", KEYS [1]) 
else 
    return 0 
final

Por que usar este my_random_value isso? my_random_value de cada cliente são os mesmos para você? Considere o seguinte cenário.

  1. O cliente 1 adquire o sucesso de bloqueio.
  2. Cliente 1 em uma operação bloqueada por um longo tempo.
  3. Para o tempo de expiração, o bloqueio é automaticamente liberado.
  4. Cliente 2 começa a corresponder ao mesmo bloqueio de recurso.
  5. Cliente uma recuperação de bloqueio para cima, libertado os bloqueios mantidos pelo cliente dois

Na verdade, esta situação é como o CAS problema ABA na mesma operação depois de um não sei o recurso é considerado pelos outros clientes.

ok, vamos então olhar para o RedLock situação distribuído bloqueio implementação distribuída.

Distributed processo de bloqueio descrito RedLock

A descrição a seguir a partir de referências:

Ele baseia-se na N nó Redis completamente independente.

  1. Adquire a hora actual (em milissegundos).

  2. operações realizadas sequencialmente para adquirir o bloqueio para os nós N Redis sequencialmente. Esta operação processo de aquisição para adquirir o bloqueio na frente com um único nó das mesmas Redis, incluindo my_random_value seqüência aleatória, também contém o tempo de expiração (como PX 30000, ou seja, bloquear tempo válido). A fim de garantir um nó Redis não está disponível quando o algoritmo pode continuar a executar a operação do bloqueio também terá um (out) de tempo limite, é muito menor do que o tempo efetivo do bloqueio (dezenas de milissegundos). Cliente para obter um bloqueio falha do nó Redis após Redis deve tentar o próximo nó imediatamente. Aqui fracasso, deve incluir qualquer tipo de falha, tais como o nó Redis não está disponível, ou o bloqueio no nó Redis foi realizada por outro cliente (Nota: Redlock descrição Redis mencionado apenas o caso em que o nó não está disponível aqui, mas ele também deve incluir outras falhas).

  3. Cálculo para todo o processo de aquisição do bloqueio de consumir um total de quanto tempo é calculado subtraindo-se o tempo da primeira etapa de gravação com o tempo atual. Se o nó do cliente adquirida com sucesso Redis da maioria (> = N / 2 + 1) para o bloqueio, o tempo de aquisição de bloqueio e não há tempo efetivo total consumido (bloqueio de tempo de validade) do que a fechadura, então o tempo que o cliente foi finalmente obter bloqueio bem sucedido, caso contrário, que o fracasso final para adquirir o bloqueio.

  4. Se o último adquirem uma fechadura é bem sucedido, em seguida, o tempo efectivo da fechadura devem ser recalculados, a qual é igual ao tempo eficaz do fecho inicial menos o tempo consumido para adquirir o passo de bloqueio 3 calculada.

  5. Se a aquisição definitiva de bloqueio falhou (provavelmente devido ao tempo de aquisição é inferior ao número de Redis nodelock N / 2 + 1, ou toda a aquisição de bloqueio consome processo tempo além do bloqueio inicial efectivo), então o cliente deve informar imediatamente todos Redis inicia a operação do nó de libertação do bloqueio (ou seja, Redis Lua roteiro descrito anteriormente).

Podemos ver o registro do tempo não existe um único padrão, se há um tempo nó passa mais rápido,

Exemplos reiniciar o Notes

Redis assumindo um total de cinco nós de: A, B, C, D, E. Imagine a seguinte seqüência de eventos ocorre:

  1. Um cliente bloqueado com êxito A, B, C, adquirem com êxito o fecho (mas não bloqueado D e E).
  2. Nó C colapso do reinício, mas o cliente 1 em C mais o bloqueio não é persistente para baixo, perdido.
  3. Nó C após o recomeço, o cliente 2 bloqueado C, D, E, adquirindo com sucesso o bloqueio.

Como a análise acima de Reinicie o nó causado por problema de falha de bloqueio, não é sempre possível. Para resolver este problema, também antirez propôs o conceito do atraso de reinício (reinicia atrasadas) a. Em outras palavras, depois de uma falha de nó, primeiro ele não reiniciar imediatamente, mas espera por algum tempo para reiniciar, esse tempo deve ser maior que o tempo efetivo do bloqueio (bloqueio de tempo de validade). Neste caso, o nó irá reiniciar antes de bloqueio participar expirar, ele não afetará as fechaduras existentes após o reinício.

Solte as Notas de bloqueio

Na versão final do bloqueio quando, antirez especial ênfase na descrição do algoritmo, o cliente deve iniciar a operação de liberação do bloqueio Redis para todos os nós. Ou seja, mesmo quando adquirir o bloqueio para um nó sem sucesso, ao liberar o bloqueio não deve perder este nó. Por que isso? Imagine esta situação, adquirindo o pedido de bloqueio é enviado para um nó cliente Redis Redis alcançou com sucesso o nó que implementou com sucesso a operação SET, mas voltou para o pacote de resposta do cliente foi perdida. Este cliente parece ter um pedido de bloqueio falhou devido a um tempo limite, mas parece que aqui em Redis, bloqueio tem sido bem sucedida. Portanto, quando a trava é liberada, o cliente deve obter o tempo para aqueles Redis falha de bloqueio nó também iniciou o pedido. Na verdade, neste caso, um modelo de comunicação assíncrona é provável de ocorrer: o cliente para comunicação do servidor é normal, mas na direção oposta é problemática.

A análise de Martin

Martin Kleppmann em 2016/02/08 hoje eu publicou um blog, chamado "Como não distribuído bloqueio", no seguinte endereço: https://martin.kleppmann.com/2016/02/08/how-to-do -distributed-locking.html ele apresentou várias perguntas sobre redlock:

  • RedLock provavelmente devido ao chumbo GC à falha de bloqueio
  • RedLock fortemente dependente do tempo, a segurança em si não é suficiente.

O impacto da GC no bloqueio Distribuído

1297993-20200407095540783-1330354705.png

fio de GC pode ser visto ao executar a obstrução levando bloqueio expirar, quando a pausa GC cliente 1 na recuperação de mais, não conhecem seus próprios bloqueios mantidos expirou, ainda é a recursos partilhados (imagem acima é um serviço de armazenamento) lançou um pedido de dados de escrita, mas desta vez o bloqueio é realmente o cliente 2 detém, por isso tanto o pedido do cliente, é possível escrever conflito papel exclusivo (falha do bloqueio).

Uma vez que é um fator importante para o bloqueio mutex destruição GC, não é ainda possível ambiente de GC. M no artigo também fez um sistema de computador complexo, como falha de página de memória, e assim são susceptíveis de conduzir a um tal fenômeno, M proposta esgrima sinal de coisas para evitar tais incidentes.

1297993-20200407100150240-1179496212.png

Pessoalmente sinto-me muito estranho, este esgrima token e RedLock em papel my_random_value não é o mesmo que você, embora haja manter a ordem simbólica, mas é identificar o recurso foi bloqueado outros clientes.

dependência temporal forte causada por segurança

Referências a partir da descrição:

Martin construir uma sequência de eventos no texto, permitindo falha Redlock (dois clientes ao mesmo tempo segurando o bloqueio). Para ilustrar Redlock referido excesso de confiança no sistema (tempo), ele primeiro dá um exemplo seguinte (assumindo que existem cinco ou Redis nós A, B, C, D, E):

  • A partir de 1 Redis nó do cliente A, B, C adquirida com sucesso o bloqueio (nó maioria). Devido a problemas de rede, D e E comunicar com o fracasso.
  • O relógio no nó C ocorreu saltar para a frente, resultando na manutenção de um bloqueio sobre ele rapidamente expirado.
  • 2 cliente Redis dos nós C, D, E adquirido com sucesso o bloqueio com um (nó maioria) dos recursos.
  • Cliente 1 e 2 cliente agora acho que eles manter o bloqueio. A razão acima isto pode ocorrer por causa do Redlock segurança (propriedade de segurança) relógio tem relativamente forte dependência da natureza do sistema, uma vez que o relógio do sistema torna-se imprecisa, a segurança do algoritmo também não pode garantir a . Na verdade, quando Martin aqui é apontar algumas questões básicas algoritmo distribuído, ou algumas questões de senso comum que deve ser mais bem distribuídos algoritmo baseado no modelo assíncrono (modelo assíncrono), a segurança do algoritmo não deve confiar em qualquer nota Suponha (suposição de temporização). No modelo assíncrono: processo pode ser interrompido por qualquer período de tempo, a mensagem pode ser adiada na rede por qualquer período de tempo, ou até mesmo perdido, o relógio do sistema pode estar errado de qualquer forma. Um bom distribuída algoritmo, esses fatores não deverá afectar a sua segurança (propriedade de segurança), mas pode afectar a actividade (propriedade liveness), ou seja, mesmo em casos muito extremos (como o relógio do sistema um erro grave ), o algoritmo não pode dar resultados, no máximo, apenas por um período limitado de tempo, não deve dar resultados errados. existem tais algoritmos, na realidade, como o mais famoso Paxos, ou jangada. Mas, aparentemente, de acordo com esta norma, então, o nível Redlock de segurança é inatingível.

Esta secção descrito acima nos lembra do PAC CP, a fim de manter a consistência, sacrifício só pode ser disponibilidade.

suplemento

SETNX

Significado comando SETNX é: [Set se não existe] vai dizer que não há tempo será configurações de vencimento set, SETNX não é suportado, assim que o acima é conseguido através da Lua para alcançar a execução atômica.

tempo limite de simultaneidade causa desbloqueio

Quando um cliente pode adquirir o bloqueio por causa do tempo é muito curto, resultando em não executar o bloqueio será liberado devido expirado, enquanto outros clientes podem realizar bloqueado, então haverá dois clientes acesso aos recursos. A solução é o seguinte:

  • Aumentar o tempo de execução como o tempo de validade, ou seja, para aumentar o tempo de expiração
  • Aumentar fio daemon, aumentar o tempo de validade quando a expirar

bloqueio reentrancy

Sabemos java, pode re-lock como uma estrutura de dados para o julgamento são: ThreadLocal, então Redis é como conseguir isso? Nós olhamos como Redission é alcançado.

// Se não estiver presente lock_key 
IF (redis.call ( 'existe', CHAVES [1]) == 0) 
a, em seguida, 
    // lock_key fornecida para travar o identificador de segmento 1 
    redis.call ( 'HAjuste', CHAVES [ 1], ARGV [2], 1); 
    // definir o tempo de expiração 
    redis.call ( 'pexpire', teclas [1], aRGV [1]); 
    retorno nulo; 
    Fim; 
// se existir corrente lock_key e o identificador de segmento a ser bloqueado identificação segmento 
IF (redis.call ( 'hexists', teclas [. 1], ARGV [2]) ==. 1) 
    // incremento 
    então redis.call ( 'hincrby', CHAVES [1], ARGV [2], 1 ); 
    // repor o tempo de expiração 
    redis.call ( 'pexpire', teclas [. 1], ARGV) [1.]; 
    retorno nulo; 
    Fim; 
// Se o bloqueio falhar, o bloqueio de retorno restante tempo 
redis.call retorno ( 'PTTL ', CHAVES [1]);

HSEt pode ser visto através de uma estrutura realizada, de facto, que também é usada tabela hash ThreadLocal para armazenar os dados correspondentes.

Solte a tentativa de bloqueio

Quando o cliente não conseguirá obter o bloqueio novamente para nova tentativa de adquirir o bloqueio, então a função de repetição pode conseguir isso:

  • votação
  • Sinalização, usando Redis assinaturas de publicação, quando a aquisição falhar, as informações de bloqueio de assinatura de liberação. Processo sinalizado como se segue a partir da FIG: https://xiaomi-info.github.io/2019/12/17/redis-distributed-lock/

1297993-20200407104331124-1808925956.png

resumo

RedLock necessidade de implementação de confiar em cada nó do tempo, o que temos de nos concentrar um pouco. Artigo sobre a redLock e realização de ideias sobre alguns RedLock controvérsia, a última seção resume as idéias de várias funções complementares implementadas.

material de referência

  • https://redis.io/topics/distlock (documentos oficiais)
  • http://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html (esta questão RedLock bloqueio distribuído)
  • http://zhangtielei.com/posts/blog-redlock-reasoning.html (deve ver)
  • https://www.one-tab.com/page/Wuz27GojRK6uiiBMgKcbwQ (página Obras Completas)

Acho que você gosta

Origin www.cnblogs.com/Benjious/p/12651995.html
Recomendado
Clasificación