Em vez de armazenar as informações em arquivos de texto simples, você pode fazer uso do sistema de arquivos. Por exemplo, tenha um arquivo por endereço IP em seu pool. Alocar um domínio para o endereço IP seria vincular um arquivo de domínio ao arquivo de endereço IP. Então você sabe qual é a alocação atual para o endereço IP, observando o número de links (que é uma informação prontamente disponível, já que é armazenada no inode). E você não precisa se preocupar em reescrever arquivos simples a cada vez e garantir acesso exclusivo a esses arquivos simples. Você pode usar outros atributos do arquivo (como mtime, ctime, uids) para armazenar outras informações sobre os endereços IP.
Por exemplo:
$ 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
Acima, o número de links (5, 3, 2) é um mais o número de domínios alocados para o endereço IP.
(re) alocar um domínio é apenas uma questão de:
#! /bin/zsh -
domain=domain/$1
rm -f $domain
least_loaded_ip=(ip/*(ol[1]))
ln -f $least_loaded_ip $domain
A desalocação é apenas
#! /bin/zsh -
domain=domain/$1
rm -f $domain
Obter o IP de um domínio é apenas
#! /bin/zsh -
domain=domain/$1
cat $domain
(assumindo que o arquivo contenha o endereço IP)
Obtendo a lista de domínios alocados para um endereço IP (com o GNU find).
#! /bin/zsh -
ip=ip/$1
find domain -samefile $ip -printf '%P\n'
Então, como um bônus, o ctime
do arquivo é a última vez que um domínio foi alocado ou desalocado para ele. Você também pode usar o mtime
(usando touch
) para armazenar outro horário relacionado a ele.
Ele usa um inode por endereço IP. Se seus sistemas de arquivos tiverem diretórios indexados / hash, obter o endereço IP de um domínio seria muito rápido. Todas as operações ln
e rm
são atômicas, então duas chamadas simultâneas para esses scripts não atrapalhariam as coisas.