Esta é uma pergunta bem carregada. Meu conselho geral é concentrar sua atenção no gerenciamento da complexidade e permitir que o sistema cresça organicamente.
Virtualização:
Você realmente deseja evitar a proliferação de servidores e, atualmente, tudo é virtualizado. Escolha uma plataforma que permita adicionar servidores virtuais rapidamente, bem como gerenciá-los com eficiência. Uma tendência que vi é ter dois (por exemplo) clusters AIX ou VMWare, um para prod, um para não-prod. O non-prod one é usado para todos os ambientes de desenvolvimento, teste e desenvolvimento. Esses ambientes são perfeitos para servidores da Web ou servidores de aplicativos, mas eu tentaria evitar colocar bancos de dados de produção grandes e em crescimento como uma VM (pelo menos no Windows).
Bancos de dados
Eles podem ficar fora de controle facilmente sempre que precisarem compartilhar recursos com outros servidores. Sempre ter bancos de dados em execução em um sistema operacional dedicado, nunca compartilhado 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 questão.
Você deseja uma infraestrutura escalonável que não o limite se você precisar, por exemplo, migrar para uma solução em cluster. Muitos bancos de dados vão ficar bem em uma VM, mas para os poucos que eventualmente precisarão de mais potência do que o conveniente para fornecer em um ambiente de VM, você vai encontrar-se desejando colocá-los em raw hardware .
Se você não estiver falando sobre janelas, algumas dessas diretrizes não serão relevantes. É prática comum aceitar colocar grandes bancos de dados em crescimento como LPARs em um hypervisor do 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 de produção, desenvolvimento, teste e controle de qualidade têm a mesma aparência para o seu armazenamento, mas você pode querer investir algum tempo para encontrar uma maneira de priorizar seu produto. É uma péssima ideia, por exemplo, ter um disco de compartilhamento de banco de dados de produtos pesados (conjuntos de raid, pools, o que for) com um servidor de desenvolvimento. Dev pode acertar os discos com a mesma força que às vezes, e a última coisa que você precisa é descobrir se algum tipo de teste é o que está atrasando sua produção.
Peça a alguém que conheça o seu armazenamento e analise todos os potenciais afunilamentos (portas, cache, controladores, disco, etc.) e faça o possível para impedir a contenção de tantos quanto possível entre prod e não-prod.
Dito isso, às vezes as pessoas da aplicação 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 quantidades semelhantes (ou pelo menos quanticamente diferentes) de potência de armazenamento.