サーバーへのドメイン割り当てのスクリプト

サーバーへのドメイン割り当てのスクリプト

テキスト ファイルが 2 つあります。

ファイル#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

各ドメイン ( から まで上から下へ 1 つずつ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 つのスクリプトで実現できますか?

答え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アドレスごとに1つのファイルを用意します。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 アドレスに割り当てられたドメインの数に 1 を加えた数です。

ドメインの(再)割り当ては次のようになります。

#! /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( を使用touch)を使用して、それに関連する別の時刻を保存することもできます。

IP アドレスごとに 1 つの inode を使用します。ファイルシステムにインデックス/ハッシュ化されたディレクトリがある場合は、ドメインの IP アドレスの取得は非常に高速になります。すべてのlnおよびrm操作はアトミックなので、これらのスクリプトを 2 回同時に呼び出しても、問題が発生することはありません。

関連情報