Bu metodun avantajları aşağıdaki gibi sıralanabilmekteydi:
- Uzak makinalar arasında yapılan senkronizasyon işleminde düşük bant genişliği yeterli olmaktadır.
- Sık yedek alınabilmesi sayesinde yansı, oldukça güncel tutulabilmektedir. Senkronizasyon sıklığı dakikalara indirilebilir.
- Çok sayıda yansı performans kaybı yaratmaksızın ana ambara bağlanabilmektedir.
Eğer SVN ambarının bulunduğu makinada yedek almamız söz konusu ve güncellik gereksinimi çok sık değilse yukarıdaki türde bir yansılama yapmak yerine birazdan anlatacağım yöntem ile yedek alınması daha uygun olacaktır. Bu yöntem ayrıca ayar dosyalarını da içerecek şekilde ambar'ın bire bir kopyasını alacaktır. "svnadmin hotcopy" aracını kullanacağımız bu metod, "svnsync" aracını kullandığımız yöntemde de olduğu gibi SVN sunucusu hizmet verirken yedek alabilmektedir.
Yedekleme sürecinin alt adımlarını aşağıdaki gibi kabaca oluşturuyoruz:
- Önce zamanlanmış crontab görevi çalışıyor
- Crontab görevi, belirlenen SVN ambar dizinleri için ayrı bir script çalıştırıyor
- Bir SVN ambarı için geçici bir dizin oluşturuluyor
- svnadmin hotcopy aracı ile geçici dizinde kopya ambar oluşturuluyor
- Kopya ambar paketlenerek arşivleniyor
- Gereğinden eski arşivler silinerek diskte yer açılıyor
- /yedek/svn (Buraya kullanacağımız scriptleri koyacağız)
- /yedek/svn/source (Yedeklenecek ambarlara soft linkler içerecek dizindir. Yedeklenmesini istediğimiz ambara bu dizinden soft link atarak kolayca yedekleme sürecine sokabileceğiz. Silinen linkler için ise artık yedekleme yapılmıyor olacak.)
- /yedek/svn/target (Yedek arşivlerini içerecek)
#!/usr/bin/perl
use Time::localtime;
$BACKUP_TTL = 10; # Geriye donuk olarak tutulmasi istenen dosya sayisi
$TEMP_DIR = ".tmp";
if (!defined($ARGV[0]) || !defined($ARGV[1])) {
print "\nUsage:\ncd && svn-hotcopy.pl <repos_home> <repo_name>\n\n";
exit;
}
$now = time();
$current_path = `pwd`;
chomp($current_path);
$repos_home = $ARGV[0];
$repo_name = $ARGV[1];
$repo_path = "$repos_home/$repo_name";
$temp_path = "$current_path/$TEMP_DIR";
# --- su anki zamanin alinisi :
$cmd = 'date -d "'.ctime($now).'" +%Y%m%d-%H%M%S';
$timestamp = `$cmd`;
# --- veya tamamen sistem tabanli cozum:
# $timestamp = `date +%Y%m%d-%H%M%S`;
chomp($timestamp);
$backup_file_prefix = "svn.$repo_name";
$backup_filename = "$backup_file_prefix.$timestamp.tgz";
# --- gecici dizin olusturulmasi :
$cmd = "rm -rf $temp_path";
print("$cmd\n");
system($cmd);
$cmd = "mkdir -p $temp_path";
print("$cmd\n");
system($cmd);
# --- svn hotcopy :
$cmd = "svnadmin hotcopy $repo_path $temp_path/$repo_name";
print "$cmd\n";
system($cmd);
# --- paketleme islemleri :
$cmd = "tar zcfp $backup_filename -C $temp_path $repo_name";
print "$cmd\n";
system($cmd);
# --- temizlik islemleri ve geriye donuk silme islemleri:
$cmd = "rm -rf $temp_path";
print "$cmd\n";
system($cmd);
print "Deleting old archives...\n";
@files = glob("$backup_file_prefix.*");
$i = 1;
for $file (reverse(@files)) {
if ($i > $BACKUP_TTL) {
$cmd = "rm -f $file";
print("$cmd\n");
system("$cmd");
}
$i++;
}
print "completed.\n"; Yukarıdaki perl scriptini tüm ambarlar için çalıştıracak olan shell scripti (backup.sh) :#!/bin/bash BACKUP_HOME=/yedek/svn SOURCE_DIR=$BACKUP_HOME/source TARGET_DIR=$BACKUP_HOME/target BACKUP_SCRIPT=$BACKUP_HOME/backup.pl for REPO_NAME in $(ls $SOURCE_DIR); do (cd $TARGET_DIR && $BACKUP_SCRIPT $SOURCE_DIR $REPO_NAME) doneYukaridaki shell sctiptini tetikleyecek crontab satırı:
0 2 * * * /yedek/svn/backup.sh # --- each day at 02:00 AMHepsi bu kadar.

2 yorum:
gerek yedekleme yöntemleriniz olsun, gerekse taekwondo ilginiz gerçekten çok hoş. Teşekkürler...
Teşekkür ederim :)
Yorum Gönder