Scripting para alocação de domínio para o servidor

2

Eu tenho dois arquivos de texto:

arquivo # 1: domain.txt

cocacola.com
airtel.com
pepsi.com

arquivo # 2: servers.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

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

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

No exemplo acima allocation.txt como uma 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

Gostaria de receber ajuda / orientação!

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

    
por codeofnode 28.04.2013 / 22:38

2 respostas

1

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
    
por 01.05.2013 / 17:20
0

Em vez de armazenar as informações em arquivos de texto simples, você pode fazer uso do sistema de arquivos. Por exemplo, tenha um arquivo por endereço IP em seu pool. Alocar um domínio para o endereço IP seria vincular um arquivo de domínio ao arquivo de endereço IP. Então você sabe qual é a alocação atual para o endereço IP, observando o número de links (que é uma informação prontamente disponível, já que é armazenada no inode). E você não precisa se preocupar em reescrever arquivos simples a cada vez 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 para o endereço IP.

(re) alocar um domínio é 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

A desalocação é 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 contenha o endereço IP)

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

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

Então, como um bônus, o ctime do arquivo é a última vez que um domínio foi alocado ou desalocado para ele. Você também pode usar o mtime (usando 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 / hash, obter o endereço IP de um domínio seria muito rápido. Todas as operações ln e rm são atômicas, então duas chamadas simultâneas para esses scripts não atrapalhariam as coisas.

    
por 01.05.2013 / 11:30