Práticas recomendadas para lidar com grande número de arquivos de configuração / propriedade estruturados

15

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.propertiespode ter accessible=falsecomo padrão, mas é substituído searchengine.propertiesporaccessible=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.

SDekov
fonte
1
Primeira coisa: registre todas as propriedades carregadas na inicialização, pelo menos você sabe o valor que está sendo usado.
Walfrat 23/03
@Stoyan, você está procurando abordagens de "configuração de software" ou "configuração de servidor"?
Yusubov 23/03
Idéia maluca, mas não muito boa: alguém usou um sistema "CSS" para algo assim? Em vez de (ou além dos) nomes de arquivos que estão sendo estruturados, os dados dentro deles são.
user949300
Eu construo um sistema de gerenciamento de configuração centralizado, baseado em regras do tipo CSS. É gratuito para uso e código aberto. Veja minha resposta abaixo para mais detalhes.
bikeman868
parece uma abordagem razoável para mim.
dagnelies

Respostas:

5

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.

Doc Brown
fonte
Mesmo que isso não forneça uma solução diretamente, faz mais sentido como lidar com uma situação que já foi ruim. Em particular, tornar seu software um pouco mais inteligente .
SDekov
2

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.

rootsettings.properties
rootsettings.eurosettings.properties
rootsettings.eurosettings.londonsettings.properties

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:

bigcity.searchsettings.properties
regional.searchsettings.properties

Dentro londonsettings.propertiesvocê pode ter um valor como:

searchsettings:bigcity.searchsettings.properties

Isso permite mais graus de liberdade ou um adicional.

Joppe
fonte
2

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.

bikeman868
fonte
1

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

Ewan
fonte
0

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.

just.a.guy
fonte