Скрипт для выделения домена серверу

Скрипт для выделения домена серверу

У меня есть два текстовых файла:

файл №1:домен.txt

cocacola.com
airtel.com
pepsi.com

файл №2:серверы.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

Мне нужно написать скрипт, который будет выделять каждый домен (по одному сверху вниз от domains.txt) серверу (до server.txt), который имеет минимальную нагрузку в данный момент (если есть ничья по минимальной нагрузке, то сервер выделяется с FCFS).

Наконец, я хочу написать скрипт, который будет делать то, что описано выше, а затем создать новый файл с изменениями под названием: allocation.txt.

В приведенном выше примере allocation.txtв качестве вывода будет (после выполнения скрипта):

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

Буду признателен за любую помощь/руководство!

Какой бы вы использовали базовый подход к решению этой проблемы? Можно ли все это сделать одним скриптом?

решение1

Следующий скрипт на Python должен сделать то, что вам нужно:

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

решение2

Вместо того, чтобы хранить информацию в текстовых файлах, вы можете использовать файловую систему. Например, иметь один файл на IP-адрес в вашем пуле. Выделение домена для IP-адреса будетсвязываниефайл домена в файл IP-адреса. Затем вы узнаете, каково текущее распределение для IP-адреса, посмотрев на количество ссылок (эта информация легкодоступна, поскольку она хранится в inode). И вам не нужно беспокоиться о перезаписи плоских файлов каждый раз и гарантировать эксклюзивный доступ к этим плоским файлам. Вы можете использовать другие атрибуты файла (например, mtime, ctime, uids) для хранения другой информации об IP-адресах.

Например:

$ 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

Выше количество ссылок (5, 3, 2) равно единице плюс количество доменов, выделенных для IP-адреса.

(Пере)распределение домена в таком случае сводится всего лишь к следующему:

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

Отмена распределения — это просто

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

Получить IP для домена просто

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

(предполагается, что файл содержит IP-адрес)

Получение списка доменов, выделенных для IP-адреса (с помощью GNU find).

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

Тогда в качестве бонуса, ctimeфайл — это последний раз, когда домен был выделен или освобожден для него. Вы также можете использовать mtime(using touch) для хранения другого времени, связанного с ним.

Он использует один inode на IP-адрес. Если ваши файловые системы имеют индексированные/хэшированные каталоги, то получение IP-адреса для домена будет очень быстрым. Все операции lnи rmявляются атомарными, поэтому два одновременных вызова этих скриптов не испортят ситуацию.

Связанный контент