Esta é uma pergunta bastante carregada. Meu conselho geral é focar sua atenção no gerenciamento da complexidade e permitir que o sistema cresça organicamente.
Virtualização:
Você realmente deseja evitar a expansão do servidor e, atualmente, tudo é virtualizado. Escolha uma plataforma que permita adicionar servidores virtuais rapidamente, além de gerenciá-los com eficiência. Uma tendência que eu vi é ter dois (por exemplo) clusters AIX ou VMWare, um para prod e outro para não prod. O non-prod one é usado para todos os ambientes de desenvolvimento, teste e preparo. Esses ambientes são perfeitos para servidores Web ou servidores de aplicativos, mas eu tentaria evitar colocar grandes bancos de dados de produção em crescimento como uma VM (pelo menos no Windows).
Bases de dados
Eles podem facilmente sair do controle sempre que eles precisam compartilhar recursos com outros servidores. Sempre tenha bancos de dados em execução em um sistema operacional dedicado, nunca compartilhados com um aplicativo ou servidor da web, a menos que haja uma boa razão para isso. Se você usa uma VM ou hardware é a única pergunta.
Você deseja uma infraestrutura escalável que não o limite se precisar, por exemplo, mudar para uma solução em cluster. Muitos bancos de dados ficarão bem em uma VM, mas para os poucos que precisarão de mais potência do que o conveniente para fornecer em um ambiente de VM, você se encontrará desejando colocá-los em hardware bruto .
Se você não está falando sobre janelas, algumas dessas diretrizes não serão relevantes. É prática comum aceita colocar grandes bancos de dados em crescimento como LPARs em um hypervisor AIX, por exemplo.
Armazenamento
Você não pode ter virtualização real (com mobilidade de VM e cluster de host) sem armazenamento compartilhado. Os servidores Prod, dev, testing e QA têm a mesma aparência do seu armazenamento. No entanto, convém investir algum tempo para encontrar uma maneira de priorizar o seu prod. É uma péssima idéia, por exemplo, ter um banco de dados de produtos pesadamente sobrecarregado, compartilhando discos (conjuntos de incursões, pools, o que for) com um servidor de desenvolvimento. Às vezes, os desenvolvedores podem atingir os discos com tanta força quanto a produção, e a última coisa que você precisa é descobrir se algum tipo de teste é o que está desacelerando sua produção.
Peça a alguém que conheça seu armazenamento que se sente e analise todos os gargalos em potencial (portas, cache, controladores, disco etc.) e faça o possível para evitar disputas pelo maior número possível entre prod e non-prod.
Dito isto, às vezes as pessoas do aplicativo precisam executar benchmarks de desenvolvimento para ajudar a quantificar os efeitos de um novo patch ou algo assim. Nessa situação, talvez seja necessário oferecer a eles quantidades semelhantes (ou pelo menos quantificáveis diferentes) de potência de armazenamento.