Se você precisar usar o FTP, você pode escrever um script (talvez um programa em Python, ou em qualquer idioma que ofereça uma biblioteca FTP conveniente) que seu programa de upload execute imediatamente após completar o upload para o servidor 'master'. Esse script examinaria os sites FTP que deveriam ser replicados e não sairia até ver esses arquivos. No servidor mestre, você teria outro script que monitore o sistema de arquivos (como o inotify do Linux) e quando ele vir novos ou arquivos modificados, ele os envia para os servidores escravos.
Como alternativa, você pode usar um sistema de arquivos replicado. Isso move o problema de um conjunto de scripts homebrewed na camada de aplicativo para uma camada projetada para lidar com arquivos de replicação. Confira Tahoe-LAFS . Cito a frase relevante:
Users do rely on storage servers for availability. The ciphertext is erasure-coded into N shares distributed across at least H distinct storage servers (the default value for N is 10 and for H is 7) so that it can be recovered from any K of these servers (the default value of K is 3). Therefore only the failure of H-K+1 (with the defaults, 5) servers can make the data unavailable.