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
fonte
Respostas:
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.
fonte
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...
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.
fonte
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.
fonte
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)
fonte
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.
fonte
@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'.
fonte