rsync

hardlink, ve Rsync + hardlink ile incremental (sadece değişen dosyaları) günlük backup almak

Selamlar;

Rsync’i backup almak için kullanmaktayız. Buradaki güzelliğimiz şöyle, sadece değişen dosyaları backup almak istiyoruz, ancak diğer dosyalarımız da link olarak backup aldığımız klasörün içerisinde hazır bulunsun istiyoruz. Böylelikle, backupı geri yüklemek, klasörü silip, backup olarak aldığımız klasörü kopyalamak kadar basit olabilsin.

Hard-link nedir?

Hard link temel olarak , dosyanın diskte bulunan kısmını işaret eden pointer ın adıdır. Yani normal 1 dosya oluşturup adına a.txt verdiğimizi hayal edelim. Burada, a.txt ye ait veriler diskte bir yerde bulunmakta, ve bu disk alanını işaret eden a.txt ismi ise bir hardlinktir. ve aynı disk bloğuna 1’den fazla hard-link verebiliriz. Yani hem a.txt hem b.txt dediğmiz şey aynı veriyi içerebilir. Bu durumda 2 pointer (2 hard-link) ama tek dosyamız olacaktır. hard-link in kısayoldan veya symbolic linkten tek farkı ise, bu şeyin bir link değil tamı tamamına gerçek bir dosya olarak davranmasıdır. a.txt ve b.txt aynı disk alanını gösteren 2 hardlink ise, burada a.txt yi silerseniz bile, işletim sistemi, bu veri alanına işaret eden başka bir hard link olduğu için veriye sizi b.txt üzerinden halen eriştirebilir halde tutacaktır. Yani a.txt yi sildiğinizde aynı veriye b.txt den halen erişebilir olmaktasınız.

hardlinks

Hard-link ile kullanılan Rsync’in avantajı nedir?

Bu şekilde aldığınız backuplar cümbür cemaat tüm kasörü aynen backup almış gibi olmanızı sağlar, ancak disk alanı olarak bunu harcamanıza gerek olmaz. Sadece değişen dosyalarınız cp komutu ile kopyalanır, diğerleri ln komutu ile hardlink yapılır. bu harclink yapılanlar disk alanı harcamaz. Sadece df -i komutuyla gördüğünüz INode harcarlar. (yani disk pointer’ı harcarlar). Yani zararı yoktur (dosyayı kopyalasaydık hem INode hem disk alanı harcayacaktık), kârı çok büyüktür (özellikle büyük dosyalarda disk alanından çok kâr ederiz), ek olarak da bütün backup klasörümüz gerçekten o anki halinin copy paste’i gibi kullanılabilir haldedir. Yani base directorynizi 2-3 gün sonra bile silseniz, hiç canınız acımaz. 

Kodlar çok kısa ve basit

aşağıda /local-backup/ dizinimiz yedeklerimizin gün gün bulunduğu ana klasörümüz olacak. /var/www/ana_dizin/ de yedeği alınacak ve üzerinde zaman zaman birşeylerin değişeceği ana dizinimiz olacak. Bu dosyayı backuper.sh olarak alıp cronjobunuza ekleyebilirsiniz.

basedir=$(ls -t /local-backup/| head -1)
/usr/bin/rsync -avtb --delete --link-dest=../$basedir /var/www/ana_dizin/ /local-backup/`date +%F`/

basedir ile başlayan satır, oluşan en güncel backup dizinini bulacak, bir alt satırdaki komut ile de rsync ile buraya hardlink verecek şekilde backupı alacaksınız.

Bu kodda bulunan `date +%F` kısmı sadece Y-m-d formatında tarihi verdiğinden bu backup scriptini günde 1 kere çalıştırmanız makul olacak, aksi halde üzerine yazacaktır. Ancak siz orada `date +%F` kısmını `date +%Y-%m-%d:%H:%M:%S` şeklinde saniyeye kadar değişken hale getirebilirsiniz.

Deneyelim

  • Boş disk alanımızı kontrol edelim, (df komutu ile)
  • anlayabilmek içini içinde 5 MB lık 2 dosya olan bir klasör oluşturup backupını alacak şekilde backuper.sh ımızı düzenleyelim. date kısmında da `date +%Y-%m-%d:%H:%M:%S` eklinde verelim ki bir kaç defa ayrı klasörlere backup alabilelim.
  • scriptimizi 10 kez çalıştıralım. Toplamda 10 MB x 10 kez çalıştırma = 100MB lık disk alanımız eksilmesi gerekirken, df -h yaptığımızda sadece 10 MB lık disk alanımız (ilk nüsha) eksildiğini göreceksiniz.
  • Bu noktadan itibaren anlamamızı pekiştirmek için çeşitli varyasyonlarla ana dizindeki dosyaları değiştirebiliriz.

Görüşmek üzere.