Dicas para armazenar com eficiência 25 TB + no valor de milhões de arquivos no sistema de arquivos

11

Digamos que você esteja enfrentando 25 TB de arquivos de log não compactados e que tenha à sua disposição uma variedade de 20 caixas de mercadorias com capacidade de armazenamento gratuito coletivo de 25 TB.

Como você os armazenaria?

a) Qual sistema de arquivos distribuído usar?

b) Qual formato / algoritmo de compressão / descompressão?

c) O tamanho do arquivo de log é de 1 MB a 7 MB, no máximo, todo o texto e muito espaço em branco

d) O uso é a) as pessoas desejam os arquivos de log mais recentes do que o anterior, então qual sistema de cache usar b) as pessoas só lêem os arquivos de log e não os excluem c) as pessoas desejam listar os arquivos de log em um intervalo de datas

e) O sistema operacional em execução nas caixas de mercadorias é Linux,

f) Quanto ao backup, temos uma matriz de armazenamento que cuida disso. Portanto, existe a capacidade de restaurar dados da matriz.

Não quero que eles acessem o sistema de arquivos diretamente. O que devo fazer ? Como faço para obter uma API baseada em REST para isso?

Poupe 2 centavos e o que você faria?

Ankur

Ankur Gupta
fonte
Quais sistemas operacionais estão executando as caixas de mercadorias? Você precisa de tolerância a falhas ou se perder todos os dados armazenados em uma caixa, tudo bem?
Mark Henderson
@farseeker editou a pergunta para responder a suas perguntas. Obrigado
Ankur Gupta
Apenas releia a pergunta, e a primeira pergunta que eu faria é: Onde estão os 25 TB de arquivos de log armazenados agora e eles podem ficar lá?
Mark Henderson
@farseeker em um sistema de arquivos NFS
Ankur Gupta
Que tal en.wikipedia.org/wiki/…
Neil McGuigan

Respostas:

7

Não sou um ninja do sistema de arquivos distribuídos, mas depois de consolidar o maior número de unidades possível em poucas máquinas, tentei usar o iSCSI para conectar a maior parte das máquinas a uma máquina principal. Lá, eu poderia consolidar as coisas em um armazenamento tolerante a falhas. De preferência, tolerante a falhas dentro de uma máquina (se uma unidade sair) e entre máquinas (se uma máquina inteira estiver desligada).

Pessoalmente, eu gosto do ZFS. Nesse caso, a compilação na compactação, desduplicação e tolerância a falhas seria útil. No entanto, tenho certeza de que existem muitas outras maneiras de compactar os dados, tornando-os tolerantes a falhas.

Gostaria de ter uma solução de arquivos distribuídos chave na mão para recomendar, eu sei que isso é realmente desagradável, mas espero que aponte você na direção certa.

Edit: Ainda sou novo no ZFS e configurando o iSCSI, mas lembrei-me de ver um vídeo da Sun na Alemanha, onde eles mostravam a tolerância a falhas do ZFS. Eles conectaram três hubs USB a um computador e colocaram quatro unidades flash em cada hub. Para impedir que qualquer hub desmonte o pool de armazenamento, eles criaram um volume RAIDz que consiste em uma unidade flash de cada hub. Em seguida, eles distribuem os quatro volumes ZFS RAIDz juntos. Dessa forma, apenas quatro flash drives foram usados ​​para paridade. Em seguida, é claro, o hub desconectado e que degradava cada zpool, mas todos os dados estavam disponíveis. Nessa configuração, até quatro unidades podem ser perdidas, mas apenas se duas não estiverem no mesmo pool.

Se essa configuração fosse usada com a unidade bruta de cada caixa, isso preservaria mais unidades para dados e não para paridade. Ouvi dizer que o FreeNAS pode (ou seria capaz de) compartilhar unidades de maneira "bruta" via iSCSI, então presumo que o Linux possa fazer o mesmo. Como eu disse, ainda estou aprendendo, mas esse método alternativo seria menos dispendioso do ponto de vista da paridade de unidade do que minha sugestão anterior. Obviamente, ele usaria o ZFS, que eu não sei se seria aceitável. Eu sei que geralmente é melhor manter o que você sabe se precisará construir / manter / reparar alguma coisa, a menos que seja uma experiência de aprendizado.

Espero que isso seja melhor.

Edit: Pesquisei e encontrei o vídeo sobre o qual falei. A parte em que eles explicam a propagação da unidade flash USB pelos hubs começa em 2m10s. O vídeo é para demonstrar o servidor de armazenamento "Thumper" (X4500) e como distribuir os discos pelos controladores. Se você tiver uma falha no controlador do disco rígido, seus dados ainda serão bons. (Pessoalmente, acho que este é apenas um vídeo de nerds se divertindo. Eu gostaria de ter uma caixa Thumper, mas minha esposa não gostaria que eu passasse um palete pela casa.: D Essa é uma caixa grande.)

Edit: Lembrei-me de encontrar um sistema de arquivos distribuído chamado OpenAFS . Eu não tinha tentado, só tinha lido um pouco sobre isso. Talvez outros saibam como ele lida com o mundo real.

Scott McClenning
fonte
4

Primeiro, os arquivos de log podem ser compactados em proporções realmente altas. Acho que meus arquivos de log são compactados na proporção 10: 1. Se eles compactarem até uma proporção de 5: 1, são apenas 5 GB ou 20% da sua capacidade de armazenamento.

Como você tem armazenamento mais que suficiente, o algoritmo de compactação específico não é muito importante. Você poderia...

  • Use arquivos zip se os usuários do Windows estiverem acessando os arquivos diretamente.
  • Use o gzip se eles forem acessados ​​através do Linux e a descompressão rápida for importante.
  • Use bzip2 se eles forem acessados ​​através do Linux e é importante ter os menores arquivos possíveis.

A grande questão é: como você vai fornecer aos usuários acesso fácil a esses arquivos? Parte disso depende de como suas máquinas estão configuradas.

Se você puder colocar armazenamento suficiente em uma única máquina, poderá fazer algo extremamente simples, como um compartilhamento de arquivo somente leitura do Windows. Basta organizar os arquivos em subdiretórios e você estará pronto para começar.

Se você não conseguir criar um único servidor de arquivos para esses arquivos, poderá achar que precisa de um sistema de arquivos distribuído. O Windows possui um sistema de arquivos distribuídos (DFS) que pode atender às suas necessidades.

Se suas necessidades forem mais avançadas, convém um aplicativo da Web como front-end, onde seus usuários possam navegar e baixar arquivos de log. Nesse caso, eu recomendo usar o MogileFS, que é um sistema de arquivos distribuído projetado para ser usado com um servidor de aplicativos front-end. É muito fácil integrar-se à maioria das linguagens de programação da web. Você não pode montá-lo como uma unidade compartilhada no seu computador, mas é de primeira qualidade como um armazenamento de dados para um aplicativo Web.

Ryan
fonte
FYI: O Windows DFS é uma maneira de manter sincronizados arquivos / pastas em vários servidores. Não permitirá que você use o armazenamento em vários servidores como uma única unidade de armazenamento. microsoft.com/windowsserversystem/dfs/default.mspx
Scott McClenning
Depois de pensar sobre isso, você está certo; O DFS poderá ser usado se você tiver um ponto raiz do DFS para as pastas que estão em outras máquinas. Dessa forma, o usuário veria uma estrutura de arquivo e não precisaria saber em quais máquinas os dados realmente vivem, o DFS saberia. Isso funcionaria. Normalmente, quando as pessoas me perguntam sobre o Windows DFS, geralmente pensam que é uma maneira de reunir espaço de armazenamento e é por isso que chego a essa conclusão. Desculpe e seu direito que poderia funcionar.
Scott McClenning 11/11/10
2

lessfs é um sistema de arquivos com desduplicação e compactação. Embora não resolva o problema inteiro, pode valer a pena olhar como um back-end.

Hubert Kario
fonte
2

exportar essas pastas via NFS

monte-os em uma única máquina com o apache em execução (na raiz do documento) como uma árvore

use zip para compactá-los - com boa taxa de compactação, o zip pode ser aberto em todos os sistemas operacionais

listar arquivos no Apache - para que você esteja dando acesso apenas aos usuários (os arquivos de log não devem ser editados, certo)

jato
fonte
1
Concorde com nfs + httpd, discorde com zip. O gzip interage muito melhor com o http.
Tobu
+1 para comentar o gzip do @Tobu - Com a configuração correta, o Apache pode enviar arquivos com gzip para um navegador da Web que os descompacta e os exibe de forma transparente. Os usuários nem precisam saber sobre a compactação.
Christopher Cashell
0

Você já pensou em compactar os arquivos de log? Em seguida, faça algo no front-end para descompactá-lo antes de servi-lo ao usuário final. Talvez um tipo de script CGI.

Varanda
fonte
0

@Ankur e @Porch. Concordo plenamente com a necessidade de compactar esses logs.

@jet Eu acho que o esquema mais simples é melhor - portanto, o httpd para o usuário final está próximo do ideal. E o back-end pode ser qualquer.

Na minha opinião - divida os logs em 2 grupos - pastas 'antigas' e 'novas'.

Mesclá-los na raiz do documento httpd. Use uma compactação forte para arquivos antigos (arquivos xz ou 7z, populares para todos os sistemas operacionais) com dicionários grandes e tamanhos de bloco, podendo até ser arquivos sólidos.

Use fs de compressão para os novos: lessfs (métodos de compactação com desduplicação + compressão leve), compressecompress 0.9.x (rw, métodos de compactação leve a forte), btrfs / zfs, squashfs (ro, métodos de compactação leve a forte, desduplicação, uso para logs recém-rotacionados).

Você pode gravar transparentemente os logs em fs compactados (fusecompress, lessfs, btrfs / zfs). Forneça acesso de E / S por httpd aos logs que estão sendo gravados. Eles serão transparentes para os usuários e descomprimidos de forma transparente para eles.

Avisos sobre o fusecompress: 1) use apenas 0.9.x - é estável. Clone a partir daqui https://github.com/hexxellor/fusecompress

Versões posteriores não suportam bem o lzma ou perdem dados.

2) usa apenas 1 núcleo de CPU para compactar um arquivo, portanto, pode ser lento.

Recomprima cada logon na pasta 'nova', com mais de um tempo (vários meses) e vá para 'antiga'.

ximik
fonte