Este artigo foi traduzido por máquina.

O programador

Banco de dados NoSQL Cassandra, Parte 3: Cluster

Ted Neward

 

Da última vez, examinei o Apache Cassandra, o "open source, distribuído, descentralizado, elasticamente escalável, altamente disponível, tolerante, tuneably coerente, orientado por coluna banco de dados que se baseia a sua concepção de distribuição no Amazon Dynamo e o seu modelo de dados no Google Bigtable," conforme descrito no livro, "Cassandra: O guia definitivo"(o ' Reilly Media, 2010). Para ser mais preciso, tendo instalado Cassandra (na primeira parte desta série), olhei como programa-lo do Microsoft .NET Framework, fazendo os bits básicos de leitura e gravação de dados a ele. Nada de espetacular.

Na verdade, parte do espetacular"Cassandra" é embrulhado em suas habilidades inerentes ao cluster bem, dando Cassandra fácil de expansão. Isto significa que pode crescer para fora aos tamanhos "ridículos" — na maioria dos casos com pouco ou nenhum esforço administrativo — particularmente quando comparado com o trabalho exigido pela maioria dos bancos de dados relacionais para armazenar tamanhos equivalentes. Por exemplo, uma empresa de tecnologia local aqui em Redmond, Wash. (onde moro), afirmou em um recente startup meetup que era armazenar mais de 50PB de dados em Cassandra.

Mesmo permitindo exagero e hipérbole, apenas um décimo do que (5PB, ou mais de 5, 000TB) é um bloco bastante robusto de dados. Para ser justo, o site de Cassandra (cassandra.apache.org) afirma, "O maior conhecido Cassandra cluster tem mais de 300 terabytes de dados em mais de 400 máquinas," que ainda é muito difícil de fazer com uma configuração relacional de out-of-box.

Mas a chave para todos os que o armazenamento é no cluster, e enquanto recebendo um cluster desse tamanho em produção provavelmente está além do escopo deste artigo, podemos pelo menos começar a brincar com ele, obtendo um cluster de vários nós correndo para o trabalho de desenvolvimento. Exige algumas etapas, para que apresentarei um passo de cada vez. (By the way, DataStax tem uma instalação fácil para Cassandra, mas falta como perto como eu posso dizer-lhe a capacidade de configurar um cluster de vários nós em uma caixa; que é sobre sua única desvantagem que vejo até agora).

Instalar Recap

No primeiro artigo desta série (msdn.microsoft.com/magazine/jj553519), eu passei a dor (às vezes angustiante) da criação de Cassandra do arquivo. zip e a linha de comando: Certifique-se de um ambiente de execução Java está instalado e o caminho; Certifique-se de que uma variável de ambiente JAVA_HOME é configurada; Descompacte a distribuição de Cassandra em um diretório; e, em seguida, inicie o arquivo "cassandra.bat" do diretório "bin" para obter o servidor em funcionamento.

No momento, pode ter parecido realmente anacrônica a fazê-lo, mas duas coisas positivas vêm de fazer a instalação dessa forma. Primeiro, você tem alguma experiência em como instalar um servidor escrito em Java (e que acaba por ser uma habilidade muito útil, dado como muitos dos diferentes implementações de NoSQL são escritas em Java). Em segundo lugar, você vai precisar para "enganar" que a instalação em um nível muito baixo para obter Cassandra execução várias vezes em uma única caixa.

Você vê, a noção de Cassandra de escalabilidade vem de um "anel" de servidores: várias instâncias do serviço Cassandra executando em várias caixas, cada um armazenando uma parte do conjunto total de dados. Então, quando novos dados são gravados para o anel, Cassandra "fofocas" (que é o termo técnico real para ele) entre os diferentes nós do anel para colocar os dados no lugar certo dentro do anel. Em um anel bem-administrada, Cassandra balançará uniformemente os dados entre os nós. Cassandra tem um número de diferentes estratégias para escrever os dados entre os nós, e é sempre possível escrever uma nova estratégia personalizada (supondo que você está confortável escrevendo Java), mas por agora vou ficar com os padrões para manter as coisas mais fáceis.

Um anel para governá-los todos...

Normalmente, a maneira mais fácil de configurar um cluster de Cassandra é ter várias máquinas e, obviamente, uma maneira de fazer isso, em um único laptop é definir as várias instâncias de máquina virtual executando todos simultaneamente. Mas que podem obter pesado e amp até os requisitos de hardware muito rapidamente, especialmente se você é um desses desenvolvedores que faz tudo o que fora um laptop (como eu).

Assim, a segunda maneira de obter vários nós é ter Cassandra executar várias vezes na mesma caixa, armazenamento de dados em vários lugares e ouvir em portas de tomada diferente. Isso significa mergulhar nos arquivos de configuração Cassandra para configurar configurações de configuração diferente de dois (ou mais) e cada lançamento.

Supondo que uma instalação de Cassandra 1.1 (a versão mais recente de redação deste), Cassandra armazena todas as suas informações de configuração no diretório /conf. Dentro desse diretório, existem dois arquivos em particular que eu preciso editar: log4j-Properties e cassandra.yaml. Também preciso descobrir onde os nós dados e logs estão indo para ir, então vou em frente e apenas criar dois subdiretórios sob a Cassandra instalar diretório. Supondo que você instalou Cassandra no C:\Prg\apache-cassandra-1.1.0 (como eu), então você quer criar dois novos diretórios abaixo que, um para cada nó, você vai criar: C:\Prg\apache-Cassandra-1.1.0\node1 e \node2.

Dentro desses dois diretórios, copie o conteúdo do diretório /conf Cassandra, que trará sobre os dois arquivos que você precisa. Você também quer copiar o arquivo de cassandra.bat de/bin, porque é onde a terceira e última mudança precisa acontecer, para dizer Cassandra onde estará os arquivos de configuração, que ela precisa ser executado.

Isso não é divertido de coisas do Java?

O primeiro arquivo, log4j-Properties, é um arquivo de configuração para o projeto de código aberto do log de diagnóstico do log4j. (Java usa arquivos "Properties" bem como Windows usado arquivos ". ini" volta no mesmo dia). Seu interesse principal aqui é ter a certeza de que cada nó Cassandra é escrever um arquivo de log de diagnóstico para um local diferente do que os outros nós. Pessoalmente, eu quero todos os dados para cada nó esteja dentro desses diretórios \node1 e \node2, assim que eu quero encontrar a linha dentro do log4j-Properties que lê como este:

Log4J.appender.R.File=/var/log/Cassandra/System.log

Então eu quero mudá-lo para ler algo mais Windows-ish e mais \node1-ish, como este:

Log4J.appender.R.File=C:/PRG/Apache-Cassandra-1.1.0/Node1/log/System.log

O diretório de log não tem que existir antes de começa a Cassandra — ela vai criá-lo se ele não está lá. A propósito, certifique-se das que barras são barras aqui apenas confiam em mim um presente; ele vai trabalhar. (Java reconhece-los se eles estão para a frente ou barras para trás, mas a sintaxe do arquivo de propriedades usa barras para trás como caracteres da seqüência de escape, como espécie de como eles funcionam em c# cordas.)

Em segundo lugar, você precisa de crack Abra o arquivo "cassandra.yaml" para fazer o próximo conjunto de alterações. A sintaxe ".yaml" é "Ainda uma outra linguagem de marcação," e, sim, você adivinhou-lo — é outra sintaxe de configuração de estilo. ini. Java nunca padronizado sobre este assunto, por isso é muito comum ver vários estilos diferentes de configuração todos os conjoined juntos em um único projeto (como Cassandra).

Especificamente, você precisará alterar algumas configurações aqui; Estes estão espalhados por todo o arquivo (que, aliás, é cheio de toneladas de comentários, por isso eles são realmente um pouco auto-explicativo, se você ler tudo):

cluster_name: 'Test Cluster'
data_file_directories:
  - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
listen_address: localhost
rpc_address: localhost

O "Nome_do_Cluster" é opcional, mas não é uma coisa ruim para mudar de qualquer maneira, talvez a algo como "MyCluster" ou "Cluster O divertimento grande." O resto das configurações, no entanto, precisa ser alterado. As entradas de "diretórios" necessário apontar para os diretórios \node1 e \node2, respectivamente.

Um anel para encontrá-los todos...

As duas últimas configurações precisam ser alteradas por razões diferentes. Cassandra, recorde, instintivamente quer seja executado como um serviço por máquina, então ela assume que é OK para ligar apenas um soquete TCP/IP para "localhost". Mas se você tiver dois ou mais serviços executados na mesma caixa, que não vai funcionar. Então você precisa dizer-lhe para ligar para endereços que resolverão efetivamente a mesma caixa, mesmo que fossem diferentes valores. Felizmente, você pode fazer isso colocando explicitamente 127.0.0.1 para node1, 127.0.0.2 node2 e assim por diante.

(Você pode estar se perguntando por que isso funciona; a resposta está além do escopo deste artigo, mas qualquer boa referência de TCP/IP deve ser capaz de explicá-lo. Se você não está convencido, tente "ping 127.0.0.1" e "ping 127.0.0.2" em sua caixa. Ambos devem resolver muito bem. Se você não gosta de especificar esses valores, você pode sempre atribuir-lhes nomes no seu arquivo "hosts" no diretório c:\WINDOWS\system32\drivers\etc..)

Parte da razão que Cassandra precisa nesta configuração de rede funcionou é porque ela vai para "descobrir" o anel primeiro ligar a um nó de "semente", que dirá em seguida, essa instância sobre os outros nós no anel. Isso tudo faz parte do protocolo de fofocas que ela usa para transmitir informações importantes ao redor do anel. Se nós foram Configurando o anel para correr em máquinas diferentes, Cassandra seria necessário a configuração de "sementes" para apontar para um nó de correr, mas neste caso, porque nós estamos todos correndo na mesma caixa — o padrão 127.0.0.1 funciona muito bem.

Após todas as alterações, o arquivo cassandra.yaml no \node1 deve olhar como este:

cluster_name: 'Test Cluster'
data_file_directories:
  - C:/Prg/apache-cassandra-1.1.0/node1/data
commitlog_directory: C:/Prg/apache-cassandra-1.1.0/node1/commitlog
saved_caches_directory: C:/Prg/apache-cassandra-1.1.0/node1/saved_caches
listen_address: localhost
rpc_address: localhost
For \node2, the file should look like this:
cluster_name: 'Test Cluster'
data_file_directories:
  - C:/Prg/apache-cassandra-1.1.0/node2/data
commitlog_directory: C:/Prg/apache-cassandra-1.1.0/node2/commitlog
saved_caches_directory: C:/Prg/apache-cassandra-1.1.0/node2/saved_caches
listen_address: 127.0.0.2
rpc_address: 127.0.0.2

Finalmente, Cassandra precisa ser informado quando ela inicia onde encontrar a configuração de arquivos, e normalmente ela faz isso olhando ao longo do CLASSPATH do Java (que é vagamente semelhante ao mecanismo de resolução de assembly do .NET Framework, mas sobre um primitivo mais de meia década, para ser franco). Ela também quer expor alguns gerenciamento e monitoramento de informações para o JMX (Java equivalente PerfMon ou Windows Management Instrumentation) sobre uma porta de TCP/IP, e ambos os serviços não podem usar a mesma porta. Assim, as alterações finais têm que ser cassandra.bat:

REM certifique-se de que quaisquer variáveis CLASSPATH definido pelo usuário não são usados na inicialização

conjunto CLASSPATH="%CASSANDRA_HOME%\node1"

E para cassandra.bat em \node2:

REM certifique-se de que quaisquer variáveis CLASSPATH definido pelo usuário não são usados na inicialização

conjunto CLASSPATH="%CASSANDRA_HOME%\node2"

Bem como a seguinte linha no \node2:

-Dcom.sun.management.jmxremote.port=7299^

No original, a porta vai ler "7199."

Como eu disse, isso não é divertido de coisas do Java?

… E atai-o na escuridão

Mas uma vez que todas as coisas de configuração fica fora do caminho, a diversão começa. Fogo até uma janela de prompt de comando (um com as variáveis de ambiente JAVA_HOME e CASSANDRA_HOME apontando para a raiz do JDK e Cassandra diretórios de instalação, lembra) e mudar diretório para o diretório \node1, você já foi enganando fora. Disparar "cassandra -f" no prompt e assistir a rolagem de informação diagnóstica por. Esta é a primeira instância, e supondo que todas as configurações são boas (sem erros), você deve ver o texto rolar e terminam com "Ouvir para clientes de poupança..."

Agora, em uma segunda janela do prompt de comando, navegue sobre a \node2 e fazer a mesma coisa. Desta vez, como ele é acionado acima, você também verá alguma atividade acontecer em poucos minutos na janela \node1 — o que está acontecendo lá é que depois que a instância de \node2 se levanta e em execução, ele se conecta à instância do \node1 (a "semente"), e os dois essencialmente configurar uns dos outros para começar a trabalhar em um anel juntos. Em particular, olhar para as duas linhas "INGRESSANDO: aguardando informações de esquema e o anel"e"nó /127.0.0.1 agora é parte do cluster"para aparecer na janela de \node2 e"nó /127.0.0.2 agora é parte do cluster"e"InetAddress /127.0.0.2 está agora"na janela de \node1.

Mas, se você perdeu, vendo essas mensagens, Cassandra tem uma surpresa mais na loja para você. Em uma terceira janela de prompt de comando, vá para – o original Cassandra \bin diretório e lançamento "nodetool anel h 127.0.0.1" e você deve ver algo como Figura 1.


Figura 1 duas instâncias de Cassandra, cada proprietário de 50 por cento dos dados

Isso é realmente emocionante coisas, porque como você pode ver a coluna Owns, as duas instâncias de Cassandra já descobri que cada um deve trabalhar de próprio 50% dos dados, sem qualquer configuração adicional de sua parte. Doce!

A melhor parte é que se você executar o código do artigo anterior, os dados serão distribuídos no cluster sem modificações adicionais.

É um complemento, não uma substituição

Como alguns dos outro banco de dados ferramentas esta coluna tem explorado (MongoDB e SQLite), Cassandra não deve ser considerado como um substituto por atacado para um banco de dados relacional, mas como uma tecnologia complementar que pode ser usado tanto para áreas onde o recurso de conjunto de um banco de dados relacional apenas não cabe bem (cache ou armazenar conjuntos de dados altamente estruturados vêm à mente, por exemplo), ou como um sistema híbrido, em conjunto com um banco de dados relacional. Por exemplo, uma empresa pode armazenar um conjunto de "fixo" de elementos de dados em um banco de dados relacional e incluir como uma das colunas relacionais uma chave de Cassandra, a fim de recuperar os dados restantes, não-estruturados. O banco de dados relacional, em seguida, pode permanecer estruturados e relacionais (obedecendo a maioria ou todas as regras de forma normal), mas o sistema global ainda terá a flexibilidade para armazenar elementos de dados adicionais imprevistos que os usuários sempre parecem querer adicionar ao sistema como idades.

Outro exemplo, considere a página Web hit dados, que sempre iriam ser chaveados fora a página em si, ainda seriam controlar facilmente em milhões ou bilhões de elementos de dados. Um serviço de encurtamento de URL (como bit. ly) seria trivial fazer aqui, porque o caminho da URL minimizado (a parte de "foobar" em http://bit.ly/foobar) seria a chave e bateu a estatísticas de dados — bem como uma descrição opcional e talvez até mesmo um instantâneo periódico da URL redirecionada — seria feita para Cassandra. e assim por diante.

Cassandra não vai assumir o datacenter em breve, nem deve. Mas quando usado de forma inteligente, é uma nova ferramenta poderosa na caixa de ferramentas, e desenvolvedores seria tolos para ignorá-lo. Há muito mais para explorar sobre Cassandra, mas é hora de deixar a profetisa Trojan ir e passar para outras coisas.

Boa codificação.

Ted Neward é um consultor de arquitetura na Neudesic LLC. Ele já escreveu mais de 100 artigos e é autor ou coautor de dezenas de livros, incluindo “Professional F# 2.0” (Wrox, 2010). Ele é um F # MVP e especialista Java e fala em conferências, Java e .NET em todo o mundo. Ele consulta e mentores regularmente — contatá-lo em ted@tedneward.com ou Ted.Neward@neudesic.com se quiser que ele venha a trabalhar com sua equipe. Ele blogs em blogs.tedneward.com e pode ser seguido no Twitter em twitter.com/tedneward.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Kelly Sommers