编写脚本以将域分配到服务器

编写脚本以将域分配到服务器

我有两个文本文件:

文件#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 地址的当前分配情况。您不必担心每次重写平面文件并保证对这些平面文件的独占访问。您可以使用文件的其他属性(如 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 地址的域数量加一。

(重新)分配域只需执行以下操作:

#! /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) 来存储与其相关的另一个时间。

它为每个 IP 地址使用一个 inode。如果您的文件系统有索引/散列目录,那么获取域的 IP 地址将会非常快。所有lnrm操作都是原子的,因此对这些脚本的两个并发调用不会弄乱事情。

相关内容