
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.txt
sieht 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 ctime
ist 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 ln
und rm
-Operationen sind atomar, sodass zwei gleichzeitige Aufrufe dieser Skripte nichts durcheinander bringen würden.