Script para alocação de domínio no servidor

Script para alocação de domínio no servidor

Eu tenho dois arquivos de texto:

arquivo nº 1:domínio.txt

cocacola.com
airtel.com
pepsi.com

arquivo nº 2:servidores.txt

192.0.53.42 , 4    # 4 domains already allocated on server 192.0.53.42
192.53.1.2 , 1     # 1 domains already allocated on server 192.53.1.2
192.36.155.21 , 2  # 2 domains already allocated on server  192.36.155.21

Preciso escrever um script, que irá alocar cada domínio (um por um de cima para baixo de domains.txt) para o servidor (para server.txt) que possui a carga mínima em um determinado instante (se houver empate na carga mínima então o servidor é alocado com FCFS).

Finalmente, quero escrever um script para fazer como acima e criar um novo arquivo com modificações chamado: allocation.txt.

No exemplo acima allocation.txtcomo saída terá (após a execução do script):

192.0.53.42 , 4
192.53.1.2 , 3 , cocacola.com , airtel.com
192.36.155.21 , 3 , pepsi.com

Eu apreciaria qualquer ajuda/orientação!

Qual seria sua abordagem básica para resolver esse problema? Tudo isso pode ser realizado por um script?

Responder1

O seguinte script python deve fazer o que você deseja:

#!/usr/bin/python
serv=[]
for l in open("servers.txt","r").xreadlines():  # for each server
    s,n = l.split(",") # extract server name and load
    n=int(n.split("#")[0].strip()) # ignore comments
    serv.append([s.strip(),n]) # store server and its load
for l in open("domain.txt","r").xreadlines(): # for each domain
    m = serv.index(min(serv,key=lambda i:i[1])) # find server with lowest load
    serv[m].append(l.strip()) # add the domain
    serv[m][1]=serv[m][1]+1 # increase the load
alloc=open("allocation.txt","w")
for l in serv:
    print>>alloc, " , ".join([l[0],str(l[1])] + l[2:]) # write output file

Responder2

Em vez de armazenar as informações em arquivos de texto simples, você pode usar o sistema de arquivos. Por exemplo, tenha um arquivo por endereço IP em seu pool. Alocar um domínio ao endereço IP seriavinculandoum arquivo de domínio para o arquivo de endereço IP. Então você sabe qual é a alocação atual do endereço IP observando o número de links (que é uma informação prontamente disponível, pois está armazenada no inode). E você não precisa se preocupar em reescrever arquivos simples todas as vezes e garantir acesso exclusivo a esses arquivos simples. Você pode usar outros atributos do arquivo (como mtime, ctime, uids) para armazenar outras informações sobre os endereços IP.

Por exemplo:

$ ls -lRi
.:
total 8
59597091 drwxr-xr-x 2 chazelas chazelas 4096 May  1 10:12 domain/
59597087 drwxr-xr-x 2 chazelas chazelas 4096 May  1 10:11 ip/

./domain:
total 28
59554312 -rw-r--r-- 5 chazelas chazelas 12 May  1 10:11 test1.com
59554312 -rw-r--r-- 5 chazelas chazelas 12 May  1 10:11 test2.com
59554312 -rw-r--r-- 5 chazelas chazelas 12 May  1 10:11 test3.com
59554312 -rw-r--r-- 5 chazelas chazelas 12 May  1 10:11 test4.com
59554314 -rw-r--r-- 2 chazelas chazelas 11 May  1 10:11 test5.com
59562599 -rw-r--r-- 3 chazelas chazelas 14 May  1 10:11 test6.com
59562599 -rw-r--r-- 3 chazelas chazelas 14 May  1 10:11 test7.com

./ip:
total 12
59554312 -rw-r--r-- 5 chazelas chazelas 12 May  1 10:11 192.0.53.42
59562599 -rw-r--r-- 3 chazelas chazelas 14 May  1 10:11 192.36.155.21
59554314 -rw-r--r-- 2 chazelas chazelas 11 May  1 10:11 192.53.1.2

Acima, o número de links (5, 3, 2) é um mais o número de domínios alocados ao endereço IP.

(re)alocar um domínio é então apenas uma questão de:

#! /bin/zsh -
domain=domain/$1
rm -f $domain
least_loaded_ip=(ip/*(ol[1]))
ln -f $least_loaded_ip $domain

Desalocar é apenas

#! /bin/zsh -
domain=domain/$1
rm -f $domain

Obter o IP de um domínio é apenas

#! /bin/zsh -
domain=domain/$1
cat $domain

(assumindo que o arquivo contém o endereço IP)

Obtendo a lista de domínios alocados para um endereço IP (com GNU find).

#! /bin/zsh -
ip=ip/$1
find domain -samefile $ip -printf '%P\n'

Então, como bônus, o ctimearquivo é a última vez que um domínio foi alocado ou desalocado para ele. Você também pode usar mtime(using touch) para armazenar outro horário relacionado a ele.

Ele usa um inode por endereço IP. Se seus sistemas de arquivos tiverem diretórios indexados/com hash, obter o endereço IP de um domínio seria muito rápido. Todas as operações lnand rmsão atômicas, portanto, duas chamadas simultâneas para esses scripts não atrapalhariam as coisas.

informação relacionada