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
次の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アドレスの割り当てを理解できます(この情報はインデックスノードに保存されているため、簡単に入手できます)。毎回フラットファイルを再構築し、そのフラットファイルへの排他アクセスを保証することを心配する必要はありません。ファイルの他の属性(mtime、ctime、uidなど)を使用して、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検索を使用)。
#! /bin/zsh -
ip=ip/$1
find domain -samefile $ip -printf '%P\n'
また、ctime
ファイルの時間は、ドメインが最後に割り当てられたか解放された時間です。mtime
(を使用してtouch
)に関連する他の時間を保存することもできます。
IPアドレスごとに1つのinodeを使用します。ファイルシステムにインデックス/ハッシュディレクトリがある場合、ドメインのIPアドレスを取得するのは非常に高速です。すべてのln
ANDrm
演算はアトミックなので、これらのスクリプトへの2回の同時呼び出しは問題を引き起こしません。