Onde nasceu ?

Dados do Linkedln e análise da equipe pesquisa, análise e hadoop e dados gasoduto pesquisar gráfico social Caltrain chefe muito branda

dois vivas para o modelo de dados relacional A visão relacional é um triunfo da ciência da computação, mas ... colar juntos cordas para chegar a seus dados é bobagem duro para construir estruturas de dados reutilizáveis não escondem a hierarquia de memória! bom: arquivos de sistemas API ruim: SQL, alguns RPCs por que é tão difícil?

Falhas em um sistema distribuído é muito mais complicada Um pode falar com B não implica B pode conversar com um

Voldemort é um repositório de dados distribuído que é concebido como umarmazenamento de chave-valor utilizado pelo LinkedIn para armazenamento de alta escalabilidade. É nomeado após o fictício Harry Potter vilão Lord Voldemort . Voldemort ainda está em desenvolvimento. Não é nem banco de dados de um objeto, nem um banco de dados relacional. Ele não tentar satisfazer relações arbitrárias e asACID propriedades, mas sim é um grande, distribuído, tolerante a falhas, tabela persistente hash.

Vantagens
Voldemort oferece uma série de vantagens em relação a outras bases de dados:  Combina na memória cache com o sistema de armazenamento de modo que uma camada de armazenamento em cache separado não é necessário (em vez do sistema de armazenamento em si é apenas rápido) É possível emular a camada de armazenagem, uma vez que é completamente mockable. Isso faz com que o desenvolvimento e o teste de unidade simples, em que pode ser feito contra um sistema de armazenamento de usar e deitar fora de memória sem a necessidade de um cluster real ou sistema de armazenamento real Lê e escreve escala horizontal Simple API: A API decide replicação de dados e colocação e acomoda uma ampla gama de aplicações específicas estratégias Dados transparentes porcionamento: Este permite a expansão cluster sem reequilíbrio todos os dados

  

Propriedades
O Voldemort armazenamento de dados distribuídos tem as seguintes propriedades:      
[1]

Colocação de dados: Suporte para conectáveis estratégias de posicionamento de dados existe para apoiar coisas como distribuição em centros de dados que estão distantes. A replicação de dados: Os dados são automaticamente replicadas ao longo de um grande número de servidores. Dados particionamento: Os dados são automaticamente dividida de modo que o servidor contém apenas um subconjunto dos dados totais Desempenho do nó único bem: 10-20k de operações por segundo pode ocorrer dependendo das máquinas, a rede, o sistema de disco, eo fator de replicação de dados Independência nó: Cada nó é independente de outros nós sem ponto central de falha ou coordenação Serialização Pluggable: Este permite que as chaves ricos e valores, incluindo listas e tuplas com campos nomeados, bem como a integração com frameworks de serialização comuns. Exemplos dessas estruturas são Avro, serialização de Java, Protocol Buffers, e Thrift Falhas transparentes: falhas do servidor são manipuladas de forma transparente, de modo que o usuário não ver tais problemas Controle de versão: Os itens de dados são versões para maximizar a integridade dos dados em caso de falha, sem comprometer a disponibilidade do sistema

 

Valor-chave de armazenamento
Para habilitar alto desempenho e disponibilidade que permitem apenas muito simples de valor-chave de acesso de dados. Ambas as chaves e os valores podem ser objetos compostos complexos, incluindo listas ou mapas, mas nada-a-menos as consultas apenas suportados são efetivamente o seguinte: valor = store.get (chave) store.put (valor, chave) store.delete (chave) Este não é de forma suficientemente boa para todos os problemas de armazenamento, há uma variedade de trade-offs: Contras
   

sem complexos filtros de consulta tudo se junta deve ser feita no código sem restrições de chave estrangeira não desencadeia

Prós
  

 

apenas consultas eficientes são o desempenho possível, muito previsível fácil de distribuir através de um cluster de orientação a serviços muitas vezes não permite restrições de chaves estrangeiras e forças de junta a ser feito em código de qualquer maneira (porque chave se refere a dados mantidos por outro serviço) utilizando um banco de dados relacional que você precisa de uma camada de cache para escalar lê, a camada de cache normalmente obriga em valores-chave de armazenamento de qualquer maneira muitas vezes acabam com XML ou outros blobs desnormalizada para o desempenho de qualquer maneira separação limpa de armazenamento e lógica (SQL incentiva lógica buisiness mistura com as operações de armazenamento para maior eficiência) nenhum objeto-relacional perder-jogo

Mais discussão dos detalhes do modelo de dados, será dada a seguir.

Arquitetura do Sistema

e delegando-a todos os N réplicas de armazenamento em paralelo. entre os nós de roteamento. Cada uma dessas camadas é responsável por executar uma função. ao manusear quaisquer falhas. digamos.Cada camada no código implementa uma interface de armazenamento simples que não colocar. a camada de roteamento é responsável por tomar uma operação. O que fazemos é simplesmente uma questão de se a camada de rede fica acima ou abaixo da camada de roteamento. hardware clientes com balanceamento de carga (http dizer escrita em Ruby). obter e excluir. etc Por exemplo. reconciliação versão. como a comunicação TCP / IP.Da mesma forma que temos a flexibilidade de onde o roteamento inteligente de dados para partições é feito. Isso pode ser feito no lado do cliente para "inteligentes" clientes. ou pode ser feito no lado do servidor para permitir mudos. Mantendo cada uma destas camadas separadas significa que eles podem ser misturados e combinados no tempo de execução para atender diferentes necessidades. Por exemplo. serialização. um PUT. . podemos adicionar uma camada de compressão que comprime valores de byte em qualquer nível abaixo do nível de serialização.

Na final. agradável do ponto de vista de transferência (já que há menos potenciais gargalos). bdb-processo. indica um balanceador de carga de hardware ou round-robin balanceador de carga de software e "Partition roteamentoconsciente" é o armazenamento de sistemas de roteamento interno.No diagrama acima. e 1-hop serviços remotos usando . há menos saltos). Essa flexibilidade torna configurações de alto desempenho possível. bem. O acesso ao disco é o único grande desempenho atingido no armazenamento. mas requer a inteligência de roteamento para subir na pilha (por exemplo. Lúpulo rede exigem flexibilidade de arquitetura para eliminar. 2-hop. para que. no diagrama acima. Obviamente menos lúpulo é bom do ponto de vista de latência (desde. "Carregar Bal". no caso simples de um único replicado ler a necessidade máquina pode buscar diretamente do local. o segundo é o lúpulo de rede. Note que. O acesso ao disco pode ser evitado através do particionamento do conjunto de dados e armazenamento em cache. o cliente deve ser Java e usar a nossa biblioteca). a imagem mais à direita os pedidos http-RPC para o serviço estão a ser encaminhados para as máquinas que contêm os dados corretos (quando possível). podemos implementar 3-hop. tanto quanto possível.

um . o acesso ao disco para valores pequenos é dominado por tempo de busca para particionamento tem o efeito de melhorar a eficiência do cache. Evento se d não muda carga não vai distribuir uniformemente a partir de um único servidor removido / falha para o resto do agrupamento. dividindo o conjunto "quente" de dados em pequenos pedaços que podem (espero) ser totalmente em memória no servidor que armazena essa partição. Dados particionamento e replicação Dados precisa ser particionado em um cluster de servidores de modo que nenhum único servidor precisa manter o conjunto de dados completo. Assim. Mesmo quando os dados podem caber em um único disco. para qualquer probabilidade p você pode escolher um fator apropriado replicação R para alcançar uma probabilidade aceitavelmente baixo de perda de dados. Da mesma forma os servidores regularmente não. não se pode armazenar dados em um único servidor ou a probabilidade de perda de dados será inversamente proporcional ao tamanho do cluster.. então a probabilidade de perda de pelo menos um servidor de um dia. será de 1 (1 .. o que nos permite fazer look-ups de uma forma peer-to-peer sem contato com um servidor central de metadados que tem um mapeamento de todas as chaves aos servidores. .p ) s . A maneira mais simples possível para alcançar este objetivo seria cortar os dados em S partições (um por servidor) e armazene cópias de uma determinada chave K em R servidores. Uma maneira de associar osR servidores com chave K seria tomar um = K mod S e armazenar o valor em servidores um .configurações diferentes. Isto significa que os servidores no cluster não são intercambiáveis. porque nós compramos um novo hardware ou um servidor está temporariamente fora do ar).um + r . um . É óbvio que este fato. Neste caso dpodem mudar e todos os dados irão deslocar entre os servidores. tornar-se sobrecarregado. Esta permite um desempenho muito elevado para ser alcançado quando é possível encaminhar chamadas directamente serviço para o servidor apropriado. ou são levadas em manutenção. Se existirem S servidores e cada servidor é assumido falhar independentemente com probabilidade p em um determinado dia. e não apenas a qualquer servidor disponível de forma aleatória. A desvantagem da abordagem acima ocorre quando um servidor é adicionado ou retirado do cluster (dizer. e os pedidos devem ser encaminhados para um servidor que contém os dados solicitados.. Este sistema tem a propriedade interessante que qualquer pessoa pode calcular a localização de um valor apenas por saber de sua chave.

Cada chave é única para uma loja. Para visualizar o método de hash consistente. pois os dados não é necessariamente tabular (um valor pode conter listas e mapeamentos que não são consideradas em um mapeamento rigoroso relacional). Usando esta técnica voldemort tem a propriedade de que. Uma chave é mapeada para o anel usando uma função arbitrária hash. e cada um dos S servidores é atribuído Q / S destes. quando um novo servidor é adicionado a um conjunto de S servidores. O equivalente aqui é uma "loja". O diagrama abaixo fotos um anel de hash para servidores A . e então calcular uma lista de R servidores responsáveis por esta chave. quando um servidor falhar carga irá distribuir igualmente sobre todos os servidores restantes no cluster.Hashing consistente é uma técnica que evita esses problemas. apenas 1 / ( S +1) valores devem ser movidos para a nova máquina. B . As setas indicam as teclas mapeadas no anel de hash ea lista resultante de servidores que irá armazenar o valor para essa chave seR = 3. e podemos usá-lo para calcular a localização de cada tecla no cluster. no máximo. Este anel é dividido em Q partições de tamanho igual. Da mesma forma. com Q >> S . e cada chave pode ter. não usamos a palavra tabela. Consultas . C . um valor. D . Formato de dados e consultas Em um banco de dados relacional de dados é dividido em mesas 2D. podemos ver as possíveis inteiros valores de hash como um anel começando com 0 e circulando em torno de 2 ^ 311. tendo os primeiros R nós únicos quando se mover sobre as partições no sentido horário.

por isso. fazemos listas de apoio como valores que realiza a mesma coisa . Note-se que. mas para grandes relacionamentos um-para-muitos (digamos que uns mapas chave para dezenas de milhões de valores).util. Na maioria dos casos desnormalização é uma melhoria de desempenho enorme uma vez que existe apenas um único conjunto de pesquisas em disco. uma vez que cada uma tem um desempenho muito previsível. inserindo o tipo apropriado na configuração da loja: .Voldemort suporta semântica hashtable. Este caso (raro) deve ser dividido em sub-consultas ou não tratadas a nível de aplicação. Isso garante que o cliente serializa os bytes corretamente. apesar de não apoiar um-muitos relações. Isso faz com que a distribuição através de máquinas particularmente fácil. No nível mais baixo do formato de dados para Voldemort é apenas matrizes de bytes para ambas as chaves e valores. nem de carga). já que tudo pode ser dividido pela chave primária.util. que deve ser mantido no servidor e transmitido através de um cursor preguiçosamente esta abordagem não é prático. é fácil de quebrar o desempenho de um serviço para o número de operações de armazenagem executa rapidamente e estimar a carga. Isso faz com que o teste de unidade exterior de um recipiente ou ambiente muito mais prática. Modelo de Dados e serialização Serialização em Voldemort é conectável assim você pode usar um dos cozido em serializers ou facilmente escrever a sua própria. Formatos de nível mais alto de dados são uma opção de configuração que são definidos para cada loja . para um único valor pode ser modificado em um tempo e de recuperação é de chave primária.Map onde o valor é um java. Em contraste consultas SQL são muitas vezes opaco. A simplicidade dos procedimentos podem ser uma vantagem. ter uma interface de operação de três permite transparentemente zombar fora da camada de armazenamento de todo e teste de unidade usando uma implementação de simulação-de armazenamento que é um pouco mais do que um HashMap. e os planos de execução pode ser dependente dos dados. é possível armazenar um número razoável de valores associados a uma única tecla.List. Os seguintes tipos são suportados fora da caixa. Além disso. Isto corresponde a um java.qualquer formato pode ser apoiado através da implementação de uma classe Serializer que lida com a tradução entre bytes e objetos. por isso pode ser muito difícil de estimar se uma determinada consulta terá um bom desempenho com dados realistas sob carga (especialmente para um novo recurso que não tem nem dados.

e nós queremos ser capazes de traduzir entre todos eles:    Em estruturas de dados de memória: por exemplo. Este é o tipo de serialização só que tem um mapeamento completo de bytes <-> objetos e de cordas <-> objetos. Tipo de serialização JSON Detalhes Existem três estados que os dados podem residir. Este é o problema de mapeamento objetorelacional clássico. apenas dando-lhe de volta o byte exata []. através do cliente de linha de comando).       json .Avro é outro sistema de serialização de dados rich.Apenas armazena cordas primas. valores booleanos e números de precisão diferentes. thrift . em torno de padroniza o formato de consulta de texto e programas de lidar com o mapeamento entre essas cordas e as estruturas de dados internos do programa usa. identidade . .Thrift é outro formato de serialização geração de código. avro-generic / avro específica / avro-reflexivo . corda . pois suporta os tipos comuns que são usados em todas as linguagens de programação (strings. Útil para blobs XML. mapas. Nossa utilização da produção atual utiliza uma digitado. Assim. o restante desta seção descreve a motivação por trás do tipo json. JSON é um excelente modelo de dados para armazenamento. se você não precisa de acesso à linha de comando. e para outras aplicações de outros mecanismos de serialização pode ser melhor.Nosso velho amigo de serialização Java.Isso efetivamente desativa serialialization. esquema check formato JSON-like. Isto significa que pode ser interagido com como SQL (por exemplo. datas. String e serialização de identidade são bastante auto-explicativo. mas isso não tem nenhum estatuto especial. digitado JSON modelo de dados que suporta listas. um objeto Usuário Bytes para transmissão de persistência e de rede Representação de texto: É essencial ser capaz de ter um DBA verificar certos valores e fazer atualizações on-line sem escrever novo código SQL. Esta pode ser a melhor maneira de ir. Certifique-se de entender a compatibilidade garante serialização java fornece antes de armazenar muitos objetos java. java-serialização . protobuf . basicamente.Um binário. compacto.buffers Protocolo é um formato de serialização de geração de código do Google. Documentação / Tutorial para os formatos de serialização outros podem ser facilmente encontrados na internet.

"sobrenome": "string". todos com o mesmo formato exacto (ou seja. Da mesma forma que queremos ser capazes de verificar afirmações sobre a forma de os dados para evitar que erros de digitação uma coluna para armazenar dados corrompidos. int32. O uso mais comum para todo o problema é fazer com que o armazenamento de N linhas. int64. neste caso JSON é um desperdício. float64. e o valor associado. se eu esperar uma loja para conter cadeias então eu posso especificar o tipo de tabela já que "String" Note que esta definição de tipo é.números. bem como. bytes. o código Java retornará uma <String. digamos. boolean. "e-mails": ["string"]} Aqui. objeto. contendo as mesmas colunas). Aqui está uma lista completa de tipos permitidos: definição do tipo de exemplo tipo subestilos bytes usados armazenáveis Tipo Java exemplo JSON . array. ids membros. devemos ser capazes de atribuir um esquema para a chave eo valor de cada loja que descreve o que é permitido para armazenar lá e como traduzi-lo para e de bytes. O esquema pode-se ser especificado em JSON. listas / matrizes e objetos / tabelas de hash).Object> mapa contendo cada uma das teclas de dados. string. posso especificar o tipo ["Int32"] O código java irá retornar uma List <Integer>. int16. Por exemplo. utilizando os seguintes tipos: int8. float32. uma vez que armazena o formato de dados em cada linha. o problema é que ele é inerentemente sem esquema. Se eu esperar a loja para conter um objeto de usuário simples que eu poderia definir o tipo {"Fname": "string". em si JSON válido O código java que busca dados irá retornar uma String Se eu esperar a loja para conter uma lista de números inteiros. "id": "int32". objeto de data. Para evitar isso.

32 float64 data. duplo. Isso permite que a migração de esquema para ter lugar sem derrubar o serviço que recebe os dados.int8. "height": "int16"} ["Int32"] objeto objeto 1 tamanho + Mapa de conteúdos <String. bytes "Olá" "String" boolean boolean verdadeiro {"Key1": 1. . Long 1 32. qualquer algoritmo que deve falar com> 50% de servidores para garantir a consistência torna-se bastante problemática se o aplicativo é executado em vários centros de dados e. Byte [] de corda ou bytes 1 Boolean "Int32" corda cordas. "Key2": "2". Os dados serão sempre gravados usando o esquema mais recente. Lenta (devido a muitas idas) e frágil como eles exigem que todos os servidores de estar disponível para processar uma transacção Em particular. Para ajudar com a evolução do esquema esta implementação JSON inclui a capacidade de versão do esquema para permitir a migração gradual dos dados. Byte. Note-se que mesmo que um valor pode ter todos esses campos diferentes que só suportam consultas por chave definida da loja. a latência para o cruzamento de dados do centro de operações será extremamente alto. portanto. 2. int16. int32. data 2+ comprimento String. Float. Short. número int64. mas estes são ambos. Integer. "key3": false} [1. mas será sempre ler usando qualquer esquema foi usado para escrever. A solução tradicional para este problema é distribuído transações. 8. Consistência e Versioning Ao tomar simultânea múltipla escreve distribuídos em vários servidores (e talvez vários centros de dados) de consistência de dados torna-se um problema difícil.Object> tamanho * sizeof (tipo) ordem ordem List <> Neste sentido. a definição de tipo é um conjunto de restrições de padrão json que fazem serialização eficiente (por meio da distribuição de fora campos repetidos e armazenar números compacta) e permitir a checagem de dados básicos de correção. 32. 64. 64. float32. 3] "Boolean" {"Nome": "string". 16.

na presença de partições de rede é comprovadamente impossível (a partição é quando. 2PC normalmente requer 2N roundtrips bloqueio. e resolver inconsistências em tempo de ler. Nós usamos versões e leitura de reparação. se um usuário adiciona um endereço de e-mail à sua conta. mas não são uma opção real quando a transação deve abranger cargas de várias páginas (que pode ou não pode ser concluída.Este é um protocolo para chegar a um acordo sobre um valor que é mais tolerante fracasso. . pode carregar o objeto de usuário. mas são comparáveis aos 2PC. mas pode exigir a lógica de aplicação adicional para resolver conflitos. mas não tolerantes. Esse é o método utilizado aqui. escrever os novos valores de volta para o banco de dados.Este é um protocolo de bloqueio que envolve duas rodadas de coordenação entre as máquinas. e replicação. todas as leituras de retorno que o mesmo valor de chave. Isso envolve pouca coordenação e é completamente falha tolerante. e muito lenta. adicionar o e-mail. É perfeitamente consistente falha. Isto tem uma das melhores garantias de disponibilidade e maior eficiência (apenas W escreve ida e volta de rede são necessários para réplicas N onde W pode ser configurado para ser inferior a N). Existem vários métodos para alcançar a consistência com diferentes garantias e compensações de desempenho. Aplicações costumam fazer uma leitura-modificação-atualizar seqüência ao modificar dados. Paxos estilo de consenso . Variações Paxos variar um pouco. mas A e B pode 't alcance C e D). e depois para ler o tempo de detecção do conflito. encontramos problemas: agora precisamos atualizar vários valores em várias máquinas e deixar as coisas em um estado consistente. Leia-reparação . Na presença de falhas no servidor isso é muito difícil. No mundo só de leitura de dados é criado de uma forma consistente e não mudou. por exemplo. As transações em bancos de dados são uma solução para este problema. Por exemplo. na ausência de alterações. e em seguida. A e B podem alcançar um ao outro e C e D podem alcançar um ao outro. Quando acrescentamos tanto escreve.As duas primeiras abordagens evitar inconsistência permanente.    Duas fases . Esta abordagem envolve a escrita de todas as versões inconsistentes. e que pode terminar em qualquer período de tempo específico) O valor para uma determinada chave é consistente se. e resolver os problemas.Uma solução alternativa é a tolerar a possibilidade de inconsistência.

kreps @ linkedin.com"}) # 2 modifica o cliente de e-mail e faz um put [Cliente 2] colocado (1234. "email": "jay.Outra abordagem para atingir a consistência é usando Handoff sugeriu .com"} [Cliente 2] se (1234) => {"nome": "Jay". {"nome": "Jay". "email": "jay. "email": "jay. Isso funciona bem em um banco de dados centralizado. tornando os dados consistente.kreps @ yahoo.com"} # Cliente uma modifica o nome e faz um put [Cliente 1] colocar (1234. {"nome": "jay Kreps". Para isso o uso de um único valor não irá conter o suficiente da história escrita para nos permitir jogar fora versões antigas. "email": "jay. quando esses nós para baixo voltar as "dicas" são empurrados para eles. Considere a seguinte seqüência de ações: # Dois servidores ao mesmo tempo buscar o mesmo valor [Cliente 1] chegar (1234) => {"nome": "Jay". Werner Vogels) Controle de versão em um sistema distribuído Um sistema de controle de versão simples é otimista bloqueio armazenamos um balcão único ou "relógio" valor com cada pedaço de dados e só permitir atualizações quando a atualização especifica o valor do relógio correta. Então.com"} {"Nome": "Jay".com"} {"Nome": "jay Kreps".kreps @ linkedin. "e-mail": "jay.kreps @ linkedin. se acharmos que os nós de destino são para baixo nós armazenamos uma "dica" do valor atualizado em um dos nós vivos.kreps @ linkedin.kreps @ linkedin.kreps @ yahoo. Muitos dos detalhes são emprestados do papel da Amazônia abaixo Aqui estão alguns bons textos sobre este assunto:     Consistência na Dynamo da Amazon Paxos Made Simple Duas fases O significado é de consistência eventual (por CTO da Amazon. mas cai em um sistema distribuído onde os servidores aparecem e desaparecem e replicação pode levar tempo. "e-mail": "jay. Neste método durante as gravações. "email": "jay.com"}) # Agora temos as seguintes versões conflitantes: {"Nome": "Jay".com"} .

Parâmetros de roteamento Qualquer sistema persistente precisa responder à pergunta "onde está o meu material?". Um relógio vetor é uma lista de servidor: pares de versão: [1:45. Então.O número de máquinas de ler a partir de W . portanto. pois a resposta é sempre "em algum lugar no servidor de banco de dados". Quando fazemos uma leitura precisamos ler a partir de pelo menos um servidor para obter a resposta. Um relógio vetor mantém um contador para cada servidor escrito.2:3. Esta é uma pergunta muito fácil se tivermos um banco de dados centralizado. mas também nos permite detectar conflitos e deixar o cliente conciliar estes.2:1] [1:1. três parâmetros que importam:    N . Num sistema de chave dividida existem várias máquinas que podem ter os dados. Aqui está um exemplo simples de duas versões conflitantes: [1:2. v1 i > v2 i .O número escreve bloquear para . nós queremos um sistema de controle de versão que permite detectar substitui e jogar fora a versão antiga.2:2] Assim. Existem. entãov1 e v2 co-ocorrer.5:55] A versão indica que o servidor era o "mestre" para que o número de gravações. No entanto não há nenhuma regra que irá dizer ao servidor que ele pode jogar fora ou se muda para o e-mail ou a mudança de nome. quando fazemos uma gravação que precisamos (finalmente) escrever a todos N das réplicas.O número de réplicas R . e estão em conflito. e nos permite calcular quando duas versões estão em conflito. nosso esquema de versões define uma ordem parcial sobre os valores que simples esquemas de bloqueio otimista definem uma ordem total .Neste modelo os dois últimos escreve tornar irrelevante o valor original (desde que acontecerá depois da original). Uma resposta a isso é uma assim chamada versão vetor de relógio. Se nem v1 > v2 nem v1 < v2 . e quando uma versão bem-sucedida ou precede outro. Uma versão v1 consegue uma versão v2 se para todo i .

em seguida. Outros mecanismos de armazenamento suportados são MySQL. além de fornecer um iterador sobre os valores na loja local. Para adicionar uma nova implementação de persistência você precisa implementa colocar. Estamos no processo de open-sourcing um. que transfere dados de um data warehouse ou instância hadoop ao sistema vivo.Processamento em lote de dados é geralmente muito mais eficiente do que o acesso aleatório. as gravações são não-bloqueio e não há garantia de que quer o sucesso. no entanto. Se pelo menos um posto / apagar consegue. Voldemort persistência backend que suporta muito eficiente acesso somente leitura que ajuda a ter um monte de dor de nossos criação. que estão na faixa 12TB se armazenado explicitamente para todos os membros. então o valor será eventualmente o novo valor. ou artigos de notícias relacionadas) e assim por N entidades podem produzir até N 2 relacionamentos. muitas vezes. Se o cliente quer garantir o estado depois de uma operação de escrita não devem emitir outra gravação. Um exmaple no LinkedIn são as redes membros.Note que se R + W > N então temos a garantia de "ler nosso escreve". o que significa que se pode facilmente produzir mais dados em lote computadorizada que podem ser facilmente acessados pelo sistema vivo. se nenhum conseguiu então o valor é perdido. implantação e gestão de grandes. sem exceção. significa a reconstrução do índice . muitas vezes lidar com as relações entre as entidades (por exemplo. somente leitura lote conjuntos de dados computadorizada Grande parte da dor de lidar com computação lote vem do processo de "push". se a gravação falhar (digamos. no entanto. Suporte para lote computadorizada de dados read-only lojas Uma das necessidades mais intensivas de dados de armazenamento é armazenar os dados do lote calculados sobre os membros e conteúdo do nosso sistema. excluir e. Hadoop expande essa capacidade. então o Estado é indeterminado. A semântica é esta: se uma operação de colocar / apagar sucede. o armazenamento em memória (utilizado para o teste de unidade) e nosso mecanismo de armazenamento próprio costume de somente leitura (gerados offline como um processo de lote em Hadoop). Puts e exclusões não são consistentes nem seja imediatamente isolado. Camada de persistência Apoiamos uma API simples para persistência e uso BDB edição Java como padrão. obter. porque nós muito poucos conseguem realizar a operação). Se W = 0. então é garantido que pelo menos W nós realizou a operação. Em um db tradicional este. Estes postos de trabalho. os usuários relacionados.

Para mais detalhes sobre estas lojas lote computadorizada (chamado somente leitura lojas) ler esta . mas isso ainda significa que o sistema vivo está agora construindo um índice GB de muitos. Isso por si só pode levar horas ou dias.Benchmarks para ir com o papel acima Consistência na Dynamo da Amazon . ter uma db online e offline. e. em um db SQL os dados serão implantados como uma nova tabela e.Consistência.Este é o original! Tempo.no sistema ao vivo com os novos dados.Um bom post sobre Dynamo Paxos Made Simple Duas fases . para o novo conjunto de dados (ou Performa). serviços partição tolerantes web . e pode destruir o desempenho em consultas ao vivo. resultados comparativos .Para efeito de comparação. Um Fit Tamanho é tudo: uma idéia cujo tempo chegou e saiu . normalmente. tornando possível a Prebuild o próprio índice offline (em Hadoop ou onde).Uma visão um tanto tendenciosa do desempenho bdb. geralmente não é de todo eficiente. Disponibilidade. Isso é melhor do que fazer milhões de atualizações individuais. Partição tolerância escolher dois. Referências            Dynamo: altamente disponível Amazônia loja Key-Value .Wikipédia descrição. Voldemort corrige esse processo. Berkeley DB desempenho . mas isso requer esforço e significa apenas metade hardware do seu está sendo utilizada. Google Bigtable . ea Ordenação de Eventos em um Sistema Distribuído Este é o modelo para o sistema de controle de versões Consistência eventual Revisited discussão muito interessante no Blog Werner Vogels 'na interação com os desenvolvedores do sistema de armazenamento e quais as vantagens e desvantagens significa em termos práticos. disponíveis. Fazendo milhões de instruções SQL INSERT ou UPDATE. e depois troca). Algumas pessoas têm fixado este trocando no nível de banco de dados (por exemplo.Parte 2. em seguida. . uma abordagem muito diferente. trocou para substituir os dados atuais quando a nova tabela é completamente construído. ao mesmo tempo servindo de tráfego ao vivo. Clocks. Postgres e Vertica Tamanho único? .Papel muito interessante pelo criador de Ingres. Conjectura de cerveja e da viabilidade de consistentes. e simplesmente empurrá-lo para fora aos servidores ao vivo e transparente trocar.

xml . Config / subdiretório do projeto Isto inclui configurações de exemplo que você pode modificar com suas especificidades próprias. por exemplo) no cluster. Configuração de cluster Aqui está um exemplo cluster. que controla o diretório no qual dados e configuração residem.Configuração Há três arquivos de configuração que a operação do servidor de controle:    cluster. Isso inclui informações sobre o número necessário de sucesso lê para manter a consistência.Este contém as informações sobre todas as lojas (tabelas.Este contém os parâmetros de ajuste que controlam um determinado nó.xml para um cluster de 2 nós com 8 partições de dados. bem como qualquer configuração necessária para o mecanismo de persistência local. o número necessário de gravações. já que não é informação pública ao cluster. server. stores.xml corresponde a si mesma. o que eles estão em nome de host. há uma variável de ambiente.properties . etc É exatamente o mesmo para todos os nós de Voldemort. É o mesmo em todos os nós do cluster. Finalmente.Este contém as informações sobre todos os nós (servidores. as portas que eles usam. bem como a forma como chaves e valores são serializados em bytes. tais como BDB ou mysql. por exemplo) no cluster. Este arquivo é diferente em cada nó. rack. VOLDEMORT_HOME. Isto inclui o ID do nó local para que ele saiba o que a entrada em cluster. Não guarda parâmetros de ajuste ou diretórios de dados para os nós. Você pode ver um exemplo de como a configuração é Definiu no.xml . mas é específico para que a configuração de nós em particular. também o tamanho do pool de threads. etc) chamadas zonas: <cluster> <-! O nome é apenas para ajudar os usuários a identificar este cluster do gui -> <name> mycluster </ name> <Zone> <zone-id> 0 </ zona-id> <proximity-list> 1 </ proximidade lista-> <Zone> <Zone> <zone-id> 1 </ zona-id> . Nós também temos opcionais "zona" campos que permitem mapear os nós para determinados grupos lógicos (datacenter.

xml e stores.com </ host> <http-port> 8081 </ http-port> <socket-port> 6666 </ socket porta-> <admin-port> 6667 </ admin porta-> <partitions> 4. mas eles são um mecanismo para particionar o espaço da chave de tal forma que cada tecla é estaticamente mapeado para uma partição de dados em particular. Outro ponto importante a lembrar é que o número de partições de dados não podem ser alterados. e que as IDs de nós e partições não pode ser alterado.com </ host> <http-port> 8081 </ http-port> <socket-port> 6666 </ socket porta-> <admin-port> 6667 </ admin porta-> <-! Uma lista de partições de dados atribuídos a este servidor -> <partitions> 0.5.Fazemos apoiar uma redistribuição online (reequilíbrio) de partições.3 </ partições> <zone-id> 0 </ zona-id> </ Server> <servidor> <id> 1 </ id> <host> vldmt2. O que isto significa é que um determinado cluster pode suportar muitas lojas cada uma com replicação diferentes fatores.prod.prod. um início ID seqüencial com 0 que identifica cada servidor no cluster -> <id> 0 </ id> <host> vldmt1. assim como o mapeamento de chave para partição.linkedin. quando na . uma vez que alguns dados é mais importante do que os outros dados.1.linkedin.6. O script aqui vai gerar esta parte da configuração para você. Em outras palavras. uma vez que pode significar que os clientes vão pensar seus dados devem estar no nó X. a inclusão de novos resultados em gânglios movendo propriedade de divisórias. o fator de replicação não é codificado no projeto do cluster. Isto significa que é importante dar um bom número de partições para começar.2.<proximity-list> 0 </ proximidade lista-> <Zone> <servidor> <-! O ID de nó é único. e o correcto equilíbrio entre o desempenho e consistência de uma loja pode ser diferente da outra loja. Isto é importante. mas o número total de partições irá sempre permanecer o mesmo.7 </ partições> <zone-id> 1 </ zona-id> </ Server> <Cluster /> Uma coisa que é importante entender é que as partições não são partições estáticas de servidores. Note-se que a configuração é atualmente arquivos simples por isso é importante que os dados em cluster.xml ser exatamente o mesmo em cada servidor.

O nome da loja. Cada colocar ou apagar operação deve. É equivalente ao nome da tabela no SQL. O padrão a ser igual a leituras necessária . Esta limitação será removida como a configuração é movida em voldemort si. Configuração da loja Aqui é um stores. Esta é a seqüência em que os clientes serão capazes de conectar e operar sobre esta loja.Este é o número total de vezes que os dados são armazenados.verdade ele foi armazenado no nó Y . "nome": "string"}] </ esquema info-> <compression> <type> gzip <type> <Compressão /> </ Value serializador-> </ Loja> </ Lojas> Cada um desses parâmetros merece uma discussão rápida:    Nome . preferido-lê (opcional)-O número de sucesso lê o cliente irá tentar fazer antes de retornar um valor para a aplicação. eventualmente. que requer apenas uma única leitura e escrita e usa bdb para persistência: <stores> <store> <name> teste </ nome> <replication-factor> 2 </ replicação fator-> <preferred-reads> 2 </ preferencial lê-> <required-reads> 1 </ requerido lê-> <preferred-writes> 2 </ preferencial-escreve> <required-writes> 1 </ requerido-escreve> <persistence> bdb </ persistence> <routing> cliente </ routing> <routing-strategy> consistente de roteamento </ rota estratégia> <key-serializer> corda <type> tipo </> <schema-info> utf8 </ esquema info-> </ Key serializador-> <value-serializer> <type> json </ type> <schema-info version="1"> [{"id": "int32". acertar esta muitos nós. replicação factor .xml exemplos de uma loja chamada de teste. Um factor de replicação de nsignifica que pode ser possível tolerar até n .1 falhas de nó sem perda de dados.

e lê-se necessário é 2.Determina como armazenamos as réplicas. o esquema descrito no JSON aqui ). parcimônia .javaserialização . Os subelementos são os mesmos que para a chave serializador. e de cache . O esquema info-dá informações para o serializador sobre como realizar o mapeamento (por exemplo. Atualmente. mas os dados é sempre lido com a versão que foi escrito com. corda . bytesprimas). roteamento . Isto permite a evolução do esquema gradual. persistência . zona de roteamento etodoroteamento . encaminhamento estratégia ..Considere um caso em que o factor de replicação é 5. Atualmente nós suportamos três roteamento-estratégias consistente de roteamento (padrão). Havia apenas um sido sensível teria jogado uma exceção. mas uma vez que apenas três são sensíveis permitirá a leitura para completar.Determina a política de roteamento. leituras preferida é 4.Se três dos cinco nós são operacionais. valor serializador. já que era menor do que a garantia de consistência solicitado para esta tabela (e que poderia significar retornar dados obsoletos).O menor número de gravações que podem ter sucesso sem o cliente voltar uma exceção. memória . então o cliente pode experimentar todos os nós para tentar chegar a 4 preferido lê. Aqui estão algumas serializers exemplo: . esse poderia ser um dos bdb.O tipo de serialização usado para ler e gravar chaves . Os tipos suportados são os mesmos que para as chaves. O padrão é exigido-escreve necessário-escreve .O tipo de serialização usado para ler e escrever valores .O backend de persistência utilizada pela loja. Apoiamos tanto cliente (Client lado de roteamento) e servidor (encaminhamento do lado do servidor). exceto que o serializador o valor pode ter vários esquemas-infos com versões diferentes. O tipo pode ser json . A versão mais recente é a usada para gravar dados. No exemplo acima. ou identidade (ou seja. destacam-se ainda "compressão" o subelemento que atualmente suporta 'gzip' e 'lzf "compressão. serializador-chave . protobuff . A diferença entre o cache e memória é que a memória vai jogar e OutOfMemory exceção se torna maior do que a pilha da JVM enquanto o cache irá descartar dados. Controle de versão é suportada apenas pelo serializador JSON como formatos de serialização outros têm os seus sistemas de controle de versão próprios. mysql . preferido-escreve (opcional)-O número de sucesso escreve o cliente tenta bloquear antes de voltar para o sucesso.        necessário-lê -O número mínimo de leituras que podem ter sucesso sem lançar uma exceção. readonly .

something. todos os dias.'binário'. "símbolos": ["foo".ou 'avro-generic'.YourProtoBuffClassName </ esquema info-> </ Value serializador-> <-! Uma serializador que serializa objetos poupança geradas através de um dos seguintes protocolos . -> <value-serializer> <type> protobuff </ type> <schema-info> java = com.something. "bar"]} </ esquema info-> </ Value serializador->         retenção dias (opcional) .YourThriftClassName.                          <-! Uma serializador que serializa cordas simples na codificação UTF8 -> <value-serializer> corda <type> tipo </> <schema-info> utf8 </ esquema info-> </ Value serializador-> <-! Uma serializador que serializa dados formato binário JSON com o esquema dado. "tipo": "enum". Em seguida. protocol = binário </ esquema info-> </ Value serializador-> <-! Serialização Avro . -> <value-serializer> <type> json </ type> <schema-info> [{"id": "int32". 'json' ou 'simples-json'. um trabalho programado . -> <value-serializer> thrift <type> tipo </> <schema-info> java = com. Cada valor é um List <Map <String. "nome": "string"}] </ esquema info-> </ Value serializador-> <-! Uma serializador que serializa objetos protocolo tampão de determinada classe.Este parâmetro opcional permite que você defina uma propriedade de retenção para seus dados. Suporte atual para clientes Java apenas. 'avro específica' ou 'avro-reflexivo' -> <value-serializer> <type> avro-generic </ type> <schema-info> {"nome": "tipo". ?>> onde as chaves "id" e "nome" e os valores são um ID inteiro de 32 bits e um nome de cadeia. em um momento especificado nos servidores.

retenção-scan-acelerador taxa (opcional) .Se retenção dias é especificado esta é a taxa em que nós vamos examinar as tuplas para excluir dados. Podemos ativar esse recurso em uma base por loja. Se você pretende usar a zona de roteamento de estratégia.. </ Loja> </ Lojas> A mudança importante aqui é a introdução de zona de replicação fator que deve conter um fator de replicação que você quer em cada zona. será executado para apagar todos os dados que têm timestamp> retenção dias.única zona. Outros parâmetros:   zona de contagem * ... precisamos estender a definição loja de dizer como é para replicar zonas wrt. O número 0 significa que vamos bloquear pelo menos por um pedido do local. Isso é útil para manter seus dados aparadas.O número de zonas que deseja bloquear para durante lê / escreve. Aqui está um exemplo de uma definição loja com enabled 'zona de roteamento ". <routing-strategy> zona de roteamento </ rota estratégia> <. entrega consistente e proximidade handoff. O número 1 significa que vamos bloquear pelo menos por um pedido de uma outra zona. <stores> <store> <name> teste </ nome> .Este número deve ser total do indivíduo zona de replicação do fator -> <replication-factor> 2 </ replicação fator-> <zone-replication-factor> <replication-factor zone-id="0"> 1 </ replicação fator-> <replication-factor zone-id="1"> 1 </ replicação fator-> </ Zona-replicação fator-> <zone-count-reads> 0 </ zona-count-lê> <zone-count-writes> 0 </ zona-count-escreve> <hinted-handoff-strategy> proximidade handoff </ insinuou-handoff estratégia> . Este parâmetro define a estratégia que usaria para decidir qual vivemos nós a escrever a nossa "dica" para. sugeriu-handoff estratégia (opcional) . As várias opções são qualquer handoff. Por nó de configuração .. antes de retornar a solicitação..Outro mecanismo de consistência que nós adicionamos recentemente é sugerido handoff ..

Nós armazenamos por nó de configuração baseada no arquivo server.transactions falso . Também pode ser especificado através do VOLDEMORT_HOME variável de ambiente ou através de uma opção de linha de comando.bdb.home / config BDB lojas configuração metadata.home nenhum data.directory enable.size 200MB bdb.directory $ {Voldemort.id nenhum voldemort. O diretório onde os dados são armazenados voldemort O diretório onde voldemort configuração é armazenada node. # A identificação da * este nó de cluster * particular (diferente para cada nó no cluster) node. Maior é melhor.flush. O arquivo nua mínimo deve ter a seguinte propriedade. A maioria das propriedades têm padrões sensatos (espero).transactions falso bdb.write.home} / dados $ {} Voldemort.properties. Esta bdb.cache. Deve ser imediatamente transações escrito para o disco? Quando a transação foi escrito para o disco devemos forçar o disco para limpar o cache do sistema operacional.id = 0 Aqui está uma lista de todas as opções de configuração suportadas: nome omissão descrição O identificador seqüencial exclusivo para este servidor no cluster (começa com 0) O diretório base para Voldemort.engine verdadeiro Se o motor BDB ser ativado? O cache BDB que é partilhada por todas as tabelas BDB.

store bdb.engine falso mysql.interval. Maior fanout mais effienciently suporta 'btrees' maiores.interval.ms 30000 bdb.host mysql.size bdb.directory} / bdb ambiente está localizado BDB 1GB O tamanho de um arquivo de registro individual O tamanho fanout para a btree.port raiz . Quantas vezes (em bytes) devemos posto o log de transações? Checkpoints fazer inicialização e desligamento mais rápido.é uma operação relativamente cara.fanout 512 bdb.password mysql. bdb.directory O diretório onde o meio $ {Data.env.bytes 20 * 1024 * 1024 bdb.checkpoint.data.one.user mysql.checkpoint. irá criar um conjunto de ligação que irá ser utilizado para a instância mysql O nome de usuário para usuário mysql A senha para o usuário mysql localhost 3306 O anfitrião da instância mysql A porta da instância mysql enable.threads falso 1 MySQL armazena configuração Devemos ativado o mecanismo de armazenamento mysql? Se o fizer.mysql.per.max.btree.logfile. Quantas vezes em ms devemos posto o log de transações Use um ambiente de BDB para cada loja Número de tópicos mais limpas BDB bdb.cleaner.

Nome da classe de estratégia de pesquisa a ser usado ao mesmo tempo encontrar a chave.backup.readonly.data.mysql.pusher.directory $ {Data. readonly.engine falso Devemos permitir que o motor de armazenamento readonly? O número de cópias de segurança dos dados para manter em torno de reversão.enable verdadeiro .delete.strategy BinarySearchStrategy readonly.store. Útil para diminuir IO durante swap.directory} / somente leitura readonly.Apoiamos BinarySearchStrategy e InterpolationSearchStrateg y O diretório para armazenar arquivos de dados somente leitura.database voldemort O nome do banco de dados mysql Somente leitura configuração lojas enable. Milissegundo esperamos antes de apagar dados antigos.backups 1 readonly.enable verdadeiro slop.search.engine bdb slop.ms 0 Configuração de armazenamento de Slop Queremos iniciar um mecanismo de armazenamento de água suja + ter o trabalho habilitado? O mecanismo de armazenamento que devemos usar para armazenar mensagens misdelivered que precisam ser redirecionado? Ativar o trabalho empurrador slop que slop.

first.parallel.cleanup.empurra cada 'slop.attempts 3 rebalancing.byte.frequency.start.enable = true) slop.optimization verdadeiro Configuração de retenção retention.period.write.sec 10 * 1000 * 1000 10 * 1000 * 1000 Slop max ler rendimento Slop máximo escrever rendimento pusher.ho 0 ur Hora em que deseja iniciar o trabalho de limpeza primeira retenção Execute o trabalho de retenção de limpar cada n horas retention.timeout.frequency.rebalancin 3 g rebalancing.rebalancing verdadeiro Permitir reequilibrar serviço? Número de tentativas do rebalancer lado do servidor faz para buscar dados Vez que damos para o lado do servidor reequilíbrio para concluir a cópia de dados Lojas para reequilíbrio em paralelo Devemos executar o nosso otimização reequilíbrio para não partição lojas conscientes? max.read.byte.seconds 10 * 24 * 60 * 60 max.per.ms enable.cleanup.ms' ms (Pré-requisito slop.stores.per.sec slop.hours 24 Configuração fofocas .rebalancing.type Tipo de trabalho a ser StreamingSlopPusherJo usado para empurrar os b slops 5 * 60 * 1000 Reequilíbrio configuração Freqüência em que vamos tentar empurrar os slops slop.

core. max (1. se enable. número de processadores) max. se enable. Usado por BIO (ou seja. se enable.threads O número de segmentos para manter viva pelo serviço de administração.interval. Usado por BIO (ou seja. se enable.enable.connector = true) nio. Usado por NIO (ou seja.selectors max (8. Usado por NIO (ou seja.threads 20 admin.enable verdadeiro Habilitar o serviço de administração? O número máximo de linhas utilizadas por serviços de administração.admin.nio.threads} / 2) ocioso.nio.max.connector.connector = false) admin.nio.connector = false) Número de threads seletor para operações de administração.ms falso 30 * 1000 Serviço de administração Ativar fofoca para sincronizar o estado Ativar gossup cada ms n admin.threads 100 .selectors max (8.nio.connector = true) O número máximo de threads o servidor pode usar (Usado por HTTP e nio. $ mesmo quando {admin.connector falso Ativar NIO no lado do servidor Número de threads seletor para operações normais. número de processadores) Núcleo Voldemort configuração do servidor enable.gossip gossip.nio.max.connector.

threads} quando ocioso (Usado por / 2) HTTP e BIO enable. Essencialmente a quantidade de tempo de bloquear em uma operação de rede de baixo nível antes de lançar um erro.único serviço) O SO_TIMEOUT soquete.nio.enable.per.sec 10 * 1000 * 1000 http.único serviço) O número de segmentos para manter viva mesmo max (1. $ {max.sec 10 * 1000 * 1000 stream. Acompanhar as estatísticas de carga nas lojas.ms 5000 stream.enable jmx.BIO .stat.write.connector = false .timeout.logging verdadeiro verdadeiro verdadeiro verdadeiro enable. Max transferência de leitura permitida quando os fluxos de dados de serviços de Admin Max rendimento gravação permitida quando os fluxos de dados de serviços de Admin Ativar o servidor de dados HTTP? Ativar o servidor de dados tomada? Permitir o monitoramento JMX? Registrar cada operação em todas as lojas.nio.timeout.tracking verdadeiro .byte. A quantidade total de tempo para esperar por respostas adequadas de todos os nós antes de lançar um erro.connector = false .ms 4000 routing. core.enable enable.read.per.verbose.enable socket.threads socket.byte.

threads 6 Número de tópicos para usar para trabalhos programados BDB Gestão O armazenamento de chaves de valor subjacente é também importante para a configuração e gestão da operação.scheduler. então toda a configuração é feita através do arquivo server. Se BDB é usado.properties. Se o MySQL é usado então administração mysql habitual deve ser feito. É importante configurar correctamente o cliente também. Configuração do cliente As definições acima foram todos para o servidor. A Oracle tem um writeup que dá uma boa visão da parte operacional da BDB.Segue uma lista de opções de configuração para os clientes: nome max_connections 50 omissão descrição O número máximo permitido de ligação para cada nó voldemort O número máximo de segmentos de clientes (usada pelo pool de thread do cliente) O número máximo de operações de nós na fila antes de ações do cliente será bloqueado (usada pelo pool de thread do cliente) A quantidade de tempo para manter um segmento de cliente inativo vivo (usada pelo pool de thread do cliente) Definir o tempo máximo permitido para bloquear max_threads 5 max_queued_requests 50 thread_idle_ms 100000 connection_timeout_ms 500 .

Número de seletores utilizado para pedidos de multiplexação em nosso cliente NIO Defina o tamanho do buffer de socket (em bytes) de usar tanto para tomada de lê e escreve soquete Permitir o monitoramento JMX Use a loja novo oleoduto encaminhado para o lado cliente de roteamento Número de vezes que vai tentar se conectar a url do bootstrap Separados por vírgula lista de URLs para usar servidores como de bootstrap socket_timeout_ms 5000 routing_timeout_ms 15000 seletores 8 socket_buffer_size 64 * 1024 enable_jmx verdadeiro enable_pipeline_routed_store verdadeiro max_bootstrap_retries 2 bootstrap_urls Parâmetro obrigatório serializer_factory_class Fábrica serializador com Personalizado . O número de operações de bloqueio pode ser configurado usando o preferido as leituras e preferenciais escreve-configuração para a loja.à espera de uma ligação gratuita Máxima quantidade de tempo que o socket irá bloquear a espera por atividade de rede Definir o tempo limite para todas as operações de bloqueio para completar em todos os nós.

suporte para avro. etc serializador nome da classe fábrica Zona ID onde o cliente reside.Apoiamos failuredetector_implementation etector BannagePeriodFailureD etector e ThresholdFailureDetecto r BannagePeriodFailureD etector: O número de milissegundos este nó é considerado como 'proibido' ThresholdFailureDetecto r: Número mínimo de falhas que devem ocorrer antes que o índice de sucesso é verificado contra o limiar ThresholdFailureDetecto r: intervalo de milissegundos para o qual o limite é válido. pb. java.Usado para fazer a decisão mais inteligente de roteamento em caso de "zona de roteamento ' client_zone_id 0 Detector de falha configs Nome da classe do detector de falha que o cliente irá BannagePeriodFailureD utilizar. é 'reset' após esse período é excedido ThresholdFailureDector: A representação percentual inteiro do limiar que devem ser cumpridos ou excedidos failuredetector_bannage_period 30000 failuredetector_threshold_count 10 minimum failuredetector_threshold_interv 10000 al failuredetector_threshold 80 .

Há duas coisas importantes aqui: (1) cache BDB deve caber na pilha ou então ele não vai funcionar (obviamente). max. max. Para os clusters de somente leitura que usamos as mesmas configurações de JVM GC. exceto o tamanho da pilha é definido para um valor menor. tamanho total de JVM JVM_SIZE = "-server-Xms4096m-Xmx4096m" Isso é feito porque.log" Esta é a configuração em uma caixa de RAM 32GB com um tamanho de cache BDB de 10GB e 3 tópicos mais limpas. somente leitura e de leitura e escrita. no caso de somente leitura lojas contamos com o cache da página OS e realmente não queremos que a nossa pilha da JVM para ocupar espaço.Algumas sugestões adicionais JVM Configurações No LinkedIn mantemos dois conjuntos de clusters. (2) você deve usar a marca concorrente e varredura gc ou então o GC pausas da coleta de tais monte um grande causará períodos sem resposta (isso não acontece no primeiro ou. tamanho total de JVM JVM_SIZE = "-server-Xms22g Xmx22g" # Novos Tamanhos Geração JVM_SIZE_NEW = "-XX: NewSize = 2048m-XX: MaxNewSize = 2048m" # Tipo de coletor de lixo para usar JVM_GC_TYPE = "-XX: + UseConcMarkSweepGC-XX: + UseParNewGC" # Ajustando opções para o coletor de lixo acima JVM_GC_OPTS = "-XX: CMSInitiatingOccupancyFraction = 70-XX: SurvivorRatio = 2" # JVM atividade GC configurações de log JVM_GC_LOG = "-XX: + PrintTenuringDistribution-XX: + PrintGCDetails-XX: + PrintGCDateStamps-Xloggc: $ LOG_DIR / gc. Aqui é o que usamos no LinkedIn para nossas leitura-gravação lojas: # Min. eventualmente. Os cachos de leitura e escrita são clusters usando lojas BDB e têm características totalmente diferentes daquelas JVM usando somente leitura lojas. # Min. Publicar / Assinar API Sistemas de armazenamento tornaram-se muito mais especializado nos últimos anos com cada sistema de fornecimento de conhecimentos em determinadas áreas-Hadoop e armazéns de dados proprietários fornecer capacidades de processamento em lote. se arrasta para cima e depois. entra em uma espiral de morte gc pausa). os .

Por exemplo. Poderia ser um simples índice secundário que implementa um contador específico do nó lógico que rastreia número de modificação para cada chave. Amazônia tem implementado essa funcionalidade como uma "árvore Merkle" estrutura de dados em seu sistema que permite que nós Dynamo de comparar os seus conteúdos de forma rápida e pegar até diferenças que eles perderam. nós definitivamente queremos tentar outras soluções. Scala tem uma sintaxe flexível e integra-se facilmente com o Java de modo que seria uma boa escolha para tal uma casca. Scala Voldemort Shell Voldemort vem com um shell de texto muito simples. Suporte para LevelDB mecanismo de armazenamento Desde Voldemort suporta um interface do mecanismo de armazenamento conectável. etc . A API que seria fornecido seria algo como getAllChangesSince (ChangeNumber int). Voldemort é um sistema de valoreschave especializada. ou processados por outro sistema. Interface operacional Um dos problemas principais para um sistema prático distribuído é saber o estado do sistema. mas isso não é a única abordagem. temos um Krati mecanismo de armazenamento baseado em contrib. bem como realizar operações mais intensas como iniciar / parar os nós. Este projeto seria fazer uma primeira taxa de gestão de GUI e funcionalidades de controle correspondente a ser capaz de conhecer o desempenho ea disponibilidade de cada nó do sistema. agitaram mais em Hadoop. mas os mesmos dados armazenados no Voldemort pode precisar de ser indexados por pesquisa.índices de pesquisa fornecem suporte para consultas complexas texto classificados. e uma variedade de bancos de dados distribuídos surgiram. Na verdade nós até mesmo Voldemort poderia subscrever um ao outro como um mecanismo rápido catch-up para a recuperação de falhas. e esta api daria a última alteração para cada chave. Outro mecanismo de armazenamento que é pegar um impulso do Google é LevelDB . o reequilíbrio. . A melhor maneira de construir uma coisa é integrar completamente uma língua com um intérprete e fornecer um conjunto de comandos administrativos pré-definidos como funções no shell. Voldemort tem um rudimentar GUI que fornece informações básicas. Cada um desses sistemas tem a possibilidade de subscrever as mudanças que acontecem em Voldemort e obter um fluxo de tais mudanças que eles podem processar em sua própria maneira especializada. A primeira fase deste projeto exigiria a construção de JNA / JNI ligações para o mecanismo de armazenamento seguido pela integração com Voldemort. a restauração de replicação.

Pedido de ajuda Duplex O trabalho preliminar foi feito para apoiar os nossos pedidos de impressão duplex soquete. Migrando do XML para YAML iria aliviar este problema um pouco. Melhor sistema de configuração Os XML arquivos podem ficar realmente fora de controle. Alguns pensamentos iniciais podem ser encontrados aqui Apoio Maven Queremos adicionar a capacidade de empurrar frascos em um repositório Maven central. Isso seria minimizar o impacto da latência de rede em centros de dados. uma vez que aumenta o tamanho de cluster. No longo prazo. Um bom v1 poderia derivar idéias existentes bem sabe sistemas como Riak Memcache suporte ao protocolo Um projeto fácil seria a de fornecer a mesma API como Memcache.DESCANSAR baseado API Além dos já existentes Ruby / Python clientes com um RESTO baseada API iria aumentar a adoção entre a comunidade web. gostaríamos de chegar a um melhor sistema de configuração (Explore Zookeeper?) .