Scripting zur Domänenzuordnung zum Server

Scripting zur Domänenzuordnung zum Server

Ich habe zwei Textdateien:

Datei Nr. 1:domain.txt

cocacola.com
airtel.com
pepsi.com

Datei Nr. 2:Server.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

Ich muss ein Skript schreiben, das jede Domäne (eine nach der anderen von oben nach unten von domains.txt) dem Server (bis server.txt) zuweist, der zu einem bestimmten Zeitpunkt die geringste Auslastung aufweist (wenn bei der geringsten Auslastung ein Gleichstand besteht, wird dem Server FCFS zugewiesen).

Schließlich möchte ich ein Skript schreiben, das die oben beschriebenen Schritte ausführt, und dann eine neue Datei mit Änderungen mit dem Namen erstellen: allocation.txt.

Im obigen Beispiel allocation.txtsieht die Ausgabe (nach Ausführung des Skripts) folgendermaßen aus:

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

Ich wäre für jede Hilfe/Anleitung dankbar!

Was wäre Ihr grundsätzlicher Ansatz zur Lösung dieses Problems? Kann all dies mit einem Skript erreicht werden?

Antwort1

Das folgende Python-Skript sollte das tun, was Sie möchten:

#!/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

Antwort2

Anstatt die Informationen in einfachen Textdateien zu speichern, können Sie das Dateisystem verwenden. Sie können beispielsweise eine Datei pro IP-Adresse in Ihrem Pool haben. Die Zuweisung einer Domäne zu der IP-Adresse wäreVerlinkungeine Domänendatei in die IP-Adressdatei. Dann wissen Sie, wie die aktuelle Zuweisung für die IP-Adresse aussieht, indem Sie sich die Anzahl der Links ansehen (eine Information, die leicht verfügbar ist, da sie im Inode gespeichert ist). Und Sie müssen sich nicht darum kümmern, Flatfiles jedes Mal neu zu schreiben und exklusiven Zugriff auf diese Flatfiles zu garantieren. Sie können andere Attribute der Datei (wie mtime, ctime, uids) verwenden, um andere Informationen über die IP-Adressen zu speichern.

Zum Beispiel:

$ 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

Oben ist die Anzahl der Links (5, 3, 2) eins plus die Anzahl der der IP-Adresse zugewiesenen Domänen.

Die (Neu-)Zuweisung einer Domain ist dann lediglich eine Frage von:

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

Die Aufhebung der Zuweisung ist nur

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

Die IP für eine Domain zu bekommen ist einfach

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

(vorausgesetzt, die Datei enthält die IP-Adresse)

Abrufen der Liste der einer IP-Adresse zugewiesenen Domänen (mit GNU Find).

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

Als Bonus ctimeist in der Datei der Zeitpunkt angegeben, zu dem ihr zuletzt eine Domäne zugewiesen oder freigegeben wurde. Sie können auch mtime(mit touch) verwenden, um einen anderen damit verbundenen Zeitpunkt zu speichern.

Es wird ein Inode pro IP-Adresse verwendet. Wenn Ihre Dateisysteme indexierte/gehashte Verzeichnisse haben, wäre das Abrufen der IP-Adresse für eine Domäne sehr schnell. Alle lnund rm-Operationen sind atomar, sodass zwei gleichzeitige Aufrufe dieser Skripte nichts durcheinander bringen würden.

verwandte Informationen