Um problema de balanceamento de carga de dados. Isso é divertido. Aqui estão algumas experiências que tive lidando com grandes conjuntos de dados, mesmo que normalmente tenhamos espalhado por vários servidores.
-
Parece que você ainda não separou o armazenamento da apresentação. Você precisa fazer isso. Projete uma interface para seu armazenamento (ele pode ser apresentado como arquivo como um servidor separado, um compartilhamento NFS ou similar). Pessoalmente, sou strongmente a favor de ter um servidor de "mídia", que serve apenas os dados. Dessa forma, você se move para o modelo NAS e economizará uma enorme quantidade de dor à medida que crescer.
-
Depois de separar a mídia do aplicativo, você poderá começar a procurar soluções sobre como lidar com essa grande quantidade de dados que você tem.
Existe um grande número de produtos SAN comerciais. Eles normalmente carregam o saldo em uma grande quantidade de discos e manipulam bem ou adicionam / removem armazenamento. Eles também são muito caros, e parece que você já tem hardware.
No lado do Linux, existe um software padrão para lidar com essa quantidade de dados sem problemas. O LVM e o EXT4 podem lidar com sistemas de arquivos muito grandes (tenha cuidado com o tempo do FSCK). Se eu fosse construir isso, provavelmente iria LVM, EXT4 e servir os dados usando o Apache. Essa combinação também permite aumentar o armazenamento do tamanho necessário.
Mas isso é apenas estratégias gerais. Agora, para atacar o problema específico que você tem. É um pouco difícil sem conhecer os detalhes da implementação, mas posso oferecer algumas sugestões:
Parece que você não está balanceando a carga do seu IO corretamente. Eu suponho que você pode acompanhar qual disco serve seus dados. Nesse caso, você deve criar um script de "rebalanceamento". Quando você adiciona um novo disco ao seu sistema, esse script coleta dados de todos os discos antigos e preenche o novo disco. Em seguida, você pode distribuir os arquivos recebidos por todos os discos e, assim, obter um melhor balanceamento da carga de E / S. Isso pressupõe que você tenha sistemas de arquivos diferentes nos diferentes discos e não apenas está criando um JBOD enorme, o que é uma má ideia em geral.
Um segundo passo é iniciar o perfil. Faça um pequeno aplicativo que registra cada solicitação de arquivo. Se você vir um disco específico sendo atingido mais do que seu quinhão, você troca dados entre o disco e o disco menos utilizado. Esse tipo de balanceamento de carga é feito preferencialmente como um trabalho regular, talvez a cada hora ou dia.
Além disso, certifique-se de obter grandes caches de E / S. O que normalmente mata o desempenho de E / S no tipo de aplicativo que você tem é quando você atende a tantos arquivos diferentes que sobrecarrega os caches, fazendo com que o disco comece a ser descartado. Maximize o cache em seus controladores de disco e jogue a maior quantidade de memória possível no sistema. O Windows terá todo o prazer de usar RAM reserva como cache de leitura. Não é difícil, ou mesmo especialmente caro, encher mais de 128G de RAM em um servidor hoje. Esse é um cache muito grande, mesmo que seu conjunto de arquivos seja 1TB.
Com a quantidade de dados que você está veiculando, sugiro que você fique longe das soluções RAID. Reconstruir grandes arrays de ataque tende a ser uma experiência dolorosa.