Sem categoria

Quer saber o que seus servidores memcached estão fazendo? Toque neles.

É possível fazer o dump de partes do cache usando "stats dump ..." para obter algumas das chaves no cache (e então você pode ir em frente e buscar cada valor). Aqui está um exemplo de como fazer isso: stats dump 1 10 xxxx get Não seria melhor se você pudesse espionar o servidor memcached? As pessoas que executam o memcached no Solaris já podem fazer isso usando o DTrace. Mas seria bom criar uma solução que funcionasse também para outras pessoas. Dustin Sallings e eu nos unimos e começamos a projetar uma interface que permitisse obter um fluxo de notificações do seu servidor memcached. Entre os requisitos para a solução estavam:

  • Neutro em relação ao mecanismo. As pessoas podem ter seus próprios mecanismos de armazenamento memcached especializados, e de que adianta uma nova interface se ela não funcionar com seus mecanismos especializados. Isso significa que o protocolo precisa ser extensível.
  • Use o protocolo binário para obter o máximo de portabilidade. O protocolo binário não é ambíguo; é neutro em termos de hardware, sistema operacional e linguagem de programação. Ao usar o protocolo binário, podemos acessar servidores remotos.

A interface tap abre muitas possibilidades para os desenvolvedores de software memcached:

  • Observabilidade - Podemos conectar um cliente tap ao servidor e ver quando os itens são adicionados/modificados/excluídos
  • Replicação - Por que não permitir que um servidor memcached ouça os eventos de tap de outro servidor? Por que parar em um só? Vamos criar um círculo de 10 servidores e permitir que eles escutem o próximo no círculo (observe que isso cria uma janela de inconsistência a partir do momento em que você executa uma operação no primeiro nó até que ela seja "replicada" em todo o círculo).
  • Persistência - Essa é uma das solicitações mais populares que vejo atualmente. Em vez de criar um mecanismo especializado que faça a persistência, podemos conectar um tap stream que receba todos os eventos de mutação do servidor memcached e armazene os dados em uma mídia persistente.

Então, como funciona a interface do Tap? Ela funciona aproveitando as vantagens da implementação do mecanismo memcached. Nessa implementação, o núcleo do memcached é responsável pelo tratamento do protocolo e pela E/S da rede, e o mecanismo é responsável por alimentar o núcleo com um fluxo de eventos. Vamos ver um exemplo: Quando o servidor receber uma mensagem "TAP Connect" do cliente, o núcleo do memcached tentará obter um fluxo de tap do mecanismo de armazenamento chamando get_tap_iterator(). Com o iterador instalado, o núcleo do memcached tentará obter o próximo evento a ser enviado ao cliente do tap sempre que o soquete for gravável. Se o mecanismo não tiver nenhum evento para enviar ao cliente, o iterador deverá retornar TAP_PAUSE (e chamar notify_io_complete para notificar o núcleo para começar a percorrer o iterador novamente). Então, qual é a aparência do iterador? À primeira vista, você pode pensar que ele parece muito complexo, mas vamos dar uma olhada mais de perto no protótipo: tap_event_t tap_iterator(ENGINE_HANDLE* handle, const void *cookie, item **item, void **engine_specific, uint16_t *nengine_specific, uint8_t *ttl, uint16_t *flags, uint32_t *seqno); A documentação da API fornece informações detalhadas sobre cada parâmetro, mas eu gostaria de destacar um dos parâmetros. O parâmetro engine_specific permite que cada mecanismo de armazenamento transmita informações extras em cada mensagem TAP para que o mecanismo receptor possa recriar o evento (por exemplo, podem ser informações de bucket usadas pelo mecanismo de bucket ou informações extras de segurança, se você criar um mecanismo com reconhecimento de segurança). O servidor memcached também é capaz de receber mensagens TAP e transmiti-las ao mecanismo de armazenamento. Sempre que uma mensagem TAP for recebida, ele chamará a função tap_notify na interface do mecanismo: ENGINE_ERROR_CODE tap_notify(ENGINE_HANDLE* handle, const void *cookie, void *engine_specific, uint16_t nengine, uint8_t ttl, uint16_t tap_flags, tap_event_t tap_event, uint32_t tap_seqno, const void *key, size_t nkey, uint32_t flags, uint32_t exptime, uint64_t cas, const void *data, size_t ndata); Parece fácil, não é? Se isso lhe parecer interessante, você deve dar uma olhada no projeto TAP.

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Trond Norbye

Trond Norbye é arquiteto de software na Couchbase. Principal colaborador dos projetos Couchbase e Memcached. Criou as bibliotecas de clientes C/C++ e node.js do Couchbase.

3 Comentários

  1. Você sabe como eu poderia fazer isso na versão Windows? Preciso enumerar todas as chaves usando o cliente .net.

  2. Matt Ingenthron março 11, 2012 em 4:28 am

    A libcouchbase é construída sob MSVC, portanto, você pode fazer isso com C no Windows, mas atualmente não há uma opção .NET. O outro cliente importante é o cliente Java.

    Nunca experimentei, mas é possível que a amostra tap.py que acompanha o servidor pode ser adaptado para ser executado no IronPython. No entanto, use por sua própria conta e risco. Tenha cuidado, pois o TAP com registro pode levar a condições OOM se você não for cuidadoso.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.