Imagine um sistema que tenha um grande número de servidores. Cada um deles tem várias configurações:
- Alguns específicos para o servidor
- Alguns específicos para a região
- Alguns comuns em todos eles
- Talvez você possa ter alguns agrupamentos personalizados, como este grupo de servidores apenas para leitura
- etc.
A prática atual que tenho em mente é uma estrutura de propriedades simples com habilidades primordiais.
Vamos usar os servidores do Google para os fins do exemplo. Cada um deles tem uma lista de configurações para carregar.
Por exemplo, o servidor de Londres pode ter:
rootsettings.properties
, europesettings.properties
, londonsettings.properties
, searchengine.properties
, Etc.
Onde cada arquivo contém um conjunto de propriedades e a sequência de carregamento permite substituir propriedades, quanto mais você avançar.
Por exemplo: rootsettings.properties
pode ter accessible=false
como padrão, mas é substituído searchengine.properties
poraccessible=true
O problema que estou tendo com essa estrutura é que é muito fácil sair do controle. Ele não está estruturado, o que significa que você pode definir qualquer propriedade em qualquer nível e muitos itens podem se tornar obsoletos.
Além disso, a alteração do nível intermediário torna-se impossível à medida que a rede cresce, pois agora você afeta um número muito grande de servidores.
Por último, mas não menos importante, cada instância individual pode precisar de 1 propriedade especial, o que significa que sua árvore acaba com uma configuração para cada servidor, tornando a solução não muito ideal.
Eu apreciaria muito se você tiver alguma sugestão / idéia de uma melhor arquitetura de gerenciamento de configuração.
Respostas:
Acho que você precisa se perguntar primeiro e esclarecer alguns pontos, para poder decidir melhor como resolver seu problema.
Primeiro: quem deve ter controle sobre os servidores?
É um único administrador que vai controlar centenas de servidores? Então você precisa centralizar a configuração o máximo possível.
Ou cada servidor está potencialmente sob controle de um administrador individual, que não deseja que suas configurações sejam anuladas ou controladas por uma configuração centralizada? Então você deve se concentrar na configuração descentralizada. Se cada administrador tiver um punhado de servidores para gerenciar no máximo, isso ainda poderá ser gerenciado manualmente.
Segundo: você realmente precisa de várias opções de configuração ou pode manter o número reduzido para algumas? Em vez de tornar tudo e tudo configurável "apenas por precaução", restrinja-se melhor às opções de que seu sistema realmente precisa. Isso pode ser feito, por exemplo, por
tornando seu software um pouco mais inteligente (por exemplo, o que o programa pode determinar automaticamente perguntando ao ambiente)?
seguindo "convenção sobre configuração" rigidamente - por exemplo, estabelecendo certas convenções de nomenclatura ou derivando algumas opções como padrão de outras opções
Terceiro: você realmente deseja um nível hierárquico de configuração codificado no software? Imagine que você não sabe de antemão quantos servidores haverá, se uma hierarquia semelhante a uma árvore é realmente a melhor estrutura para eles ou quantos níveis a árvore precisa ter. A solução mais simples que consigo pensar é fornecer uma configuração centralizada, apenas um arquivo de configuração por servidor, e permitir que os administradores responsáveis determinem como resolvem o problema de gerenciar as configurações de vários servidores.
Por exemplo, os administradores podem escrever scripts de gerador que distribuem um arquivo de configuração central para um grupo de servidores diferentes e fazem algumas pequenas modificações em cada cópia. Dessa forma, você não precisa fazer suposições sobre a "topologia de distribuição do servidor" de antemão, a topologia pode ser ajustada a qualquer momento para os requisitos do mundo real. A desvantagem é que você precisa de administradores com algum conhecimento de como escrever scripts em uma linguagem como Perl, Python, Bash ou Powershell.
fonte
Eu pessoalmente nunca gostei da herança do arquivo de configuração. Você menciona ter uma sequência de carregamento, não sabe como isso é definido ou derivado. Talvez ajude a tornar a sequência óbvia, espelhando-a em uma estrutura de diretório em que você coloca os arquivos ou os inclui nos nomes dos arquivos.
Isso funcionará até um ponto em que você tenha um agregado de valores de configuração que não se alinham a uma região. Portanto, você precisa considerar o eixo organizacional escolhido.
O que mais gosto é isolar agregados de valores de configuração em seus próprios arquivos e ter um arquivo de configuração (folha) apontado para um.
Um exemplo:
Dentro
londonsettings.properties
você pode ter um valor como:Isso permite mais graus de liberdade ou um adicional.
fonte
Eu tive o mesmo problema e de código aberto minha solução. Você pode encontrar o código fonte aqui https://github.com/Bikeman868/Urchin
Eu o uso para um sistema grande com muitos servidores, com vários aplicativos em cada servidor e vários ambientes. Inclui uma interface do usuário escrita em Dart para gerenciar a configuração.
Você pode entrar em contato comigo diretamente se precisar de ajuda para decolar.
A solução que implementei é baseada em regras. Você geralmente começa com uma regra que se aplica a todas as configurações e adiciona regras como "todas as máquinas neste ambiente criam arquivos de log para esse caminho UNC". As regras podem ser específicas para um ambiente, um aplicativo, uma máquina ou uma instância de um aplicativo. As regras também podem ser mais específicas, pois somente nesta instância específica desse aplicativo em execução neste servidor específico.
As regras são aplicadas na ordem do menos específico ao mais específico e as regras posteriores podem substituir os valores especificados nas regras anteriores. Isso significa, por exemplo, que você pode criar uma regra que se aplica a um aplicativo específico e substituí-lo por um valor diferente para uma máquina específica ou uma instância específica do aplicativo, etc.
O servidor possui uma interface REST + JSON, portanto funciona com a maioria dos sistemas de desenvolvimento e também possui uma biblioteca de cliente conveniente para aplicativos .Net.
fonte
Esse tipo de configuração é um pesadelo para gerenciar. É melhor tentar reduzi-los o máximo possível, fazendo com que os componentes do software lidem com todos os casos.
ou seja, em vez de configurar um servidor API para uma região, passe a região com a chamada API e deixe que uma única configuração do servidor lide com todas as regiões.
No entanto, desde que você esteja no estado em que se encontra. Aconselho não instalar um sistema para gerar configurações. Ele apenas adiciona complexidade a um problema já complexo.
Em vez disso, tenha as configurações armazenadas em sua ferramenta de implantação por tipo de servidor. (configurações de implantação do polvo, reescritas do arquivo teamcity, etc.) Isso permite que você esteja implantando as mesmas configurações da última vez em que atualizou o software e oferece controle refinado sobre as alterações.
Você não quer estar na situação em que faz uma alteração nos seus arquivos de meta-configuração e precisa testar o arquivo de configuração que produz em suas várias regiões / servidores / agrupamentos personalizados
fonte
Nenhuma pesquisa; toda opinião pessoal, mais de 30 experiência em TI. Parece uma estrutura de dados complicada, que pode ser alterada / modificada rapidamente, com um grande número de usuários.
Considere um repositório de banco de dados (por exemplo, SQL) para estruturar os dados, com processos de extração personalizados que produzem arquivos de configuração individuais para cada usuário. Você pode usar uma consulta ao banco de dados para determinar o impacto de uma alteração antes que ela seja implementada; encontre ocorrências duplicadas, etc. Arquivos simples individuais fazem parte do problema. Além disso, você pode obter logs de alterações e suporte à recuperação / reconstrução. Com o controle do banco de dados, você poderá eliminar o problema de herança de configuração. Esse tipo de solução exigirá uma estrutura de banco de dados adicional. A estrutura correta de chaves compostas é muito importante.
Essa é a minha sugestão.
Você pode procurar em alguns sistemas de controle e segurança de sistemas de fornecedores muito caros que implementam esse tipo de serviço. Considere-os. Em geral, eles serão dependentes do ambiente.
fonte