Thursday, March 6, 2014

Klasik Senaryo Bol Hata: Backup Dizininin Başka bir Servera Yedeklenmesi

Merhaba ,

Yakın zamanda bir database serverımızı RHEL 5.6 dan OEL 6.3 sürüme yükselttik. Ancak Symantec Backup Exec (BE) 2012 programı OEL 6.3 ile uyumsuz olduğundan, ki biz bunu sürüm geçişinden bir kaç hafta sonra öğrendik(!), yedeklerimizi alamamaya başladık. Bu sorunun çözümü için klasik bir yöntem olan bir ara backup server kurulmasına ve yedeklerin oraya atılarak, oradan BE tarafından alınmasını düşündüm. Bu yazıda bu kopyalama işlemlerin nasıl otomatize edileceği ve alınan hataların çözümünü bulacaksınız.


İlk olarak ara backup server kurulduktan sonra, ki bu serverın agent ile çalışabilen bir sürümde olmasına dikkat etmemiz gerekiyor, sıra backup dosyalarının kopyalanmasına geliyor. Bu aşamada hali hazırdaki yedek alan scriptlerimizin sonuna bir de kopyalama satırı eklememiz gerekiyor.

İki linux makine arasında kopyalama yapacağımız için "scp" ilk akla gelen seçenek. Aşağıdaki gibi bir satır ilk başta işimizi görecektir.

scp $backup_file user@BACKUP_SERVER:/$BACKUP_DEST

Ancak bu scriptin sıkıntısı kopyalamada kullandığımız "user" için şifre girmemiz gerekiyor ve scp ile direk şifreyi veremiyoruz.

Bu durumda şifreyi verebileceğimiz bir tool araştırırken , "sshpass" ile karşılaştım, (başka bir çözüm paylaşabilirseniz sevinirim). sshpass ile şifreyi scripte koyup , daha sonra scp ile çalıştırabilmekteyiz.
(Bu sayfada örnek kullanım bulabilirsiniz.)

sshpass -p 'password' scp $backup_file user@BACKUP_SERVER:/$BACKUP_DEST 

şeklinde çalıştırabileceğiz. Şimdi sıra sshpass kurulmasında, ilk önce "yum" ile paketi kurmayı deneyelim.

$ yum install sshpass
Plugin "refresh-packagekit" can't be imported
Loaded plugins: security
^CTraceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 285, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 136, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 434, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 99, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.6/site-packages/yum/depsolve.py", line 110, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 897, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 682, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 295, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 165, in populate
    if self._check_db_version(repo, mydbtype):
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 223, in _check_db_version
    return repo._check_db_version(mdtype)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1256, in _check_db_version
    repoXML = self.repoXML
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1455, in <lambda>
    repoXML = property(fget=lambda self: self._getRepoXML(),
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1447, in _getRepoXML
    self._loadRepoXML(text=self)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1437, in _loadRepoXML
    return self._groupLoadRepoXML(text, self._mdpolicy2mdtypes())
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1412, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1225, in _commonLoadRepoXML
    if self._latestRepoXML(local):
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1194, in _latestRepoXML
    oxml = self._saveOldRepoXML(local)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1053, in _saveOldRepoXML
    xml = self._parseRepoXML(old_local, True)
  File "/usr/lib/python2.6/site-packages/yum/yumRepo.py", line 1036, in _parseRepoXML
    return repoMDObject.RepoMD(self.id, local)
  File "/usr/lib/python2.6/site-packages/yum/repoMDObject.py", line 124, in __init__
    self.parse(srcfile)
  File "/usr/lib/python2.6/site-packages/yum/repoMDObject.py", line 140, in parse
    parser = iterparse(infile)
  File "/usr/lib/python2.6/site-packages/yum/misc.py", line 1169, in cElementTree_iterparse
    _cElementTree_import()
  File "/usr/lib/python2.6/site-packages/yum/misc.py", line 1164, in _cElementTree_import
    import cElementTree
ImportError: No module named cElementTree


You have new mail in /var/spool/mail/root

Daha önce almadığım bir hata , yum çalışmıyor. Biraz araştırma yaptığımda şöyle bir şey ile karşılaştım. (Başka bir çözüm paylaşabilirseniz sevinirim). (Bu sayfada detayı bulabilirsiniz.)

$env |grep LD
LD_LIBRARY_PATH=/home/oracle/app/oracle/product/11.2.0/dbhome_1/lib
[root@jira-db ~]# export LD_LIBRARY_PATH=/usr/lib
[root@jira-db ~]# yum install sshpass
Loaded plugins: refresh-packagekit, security
ol6_UEK_latest                                             | 1.2 kB     00:00
ol6_UEK_latest/primary                                     |  13 MB     00:08
ol6_UEK_latest                                              281/281

...

Hatanın "LD_LIBRARY_PATH" değişkeninden kaynaklı olduğunu söylüyor. Belirtilen değişikliği yapınca yum çalışmaya başladı ancak  bu seferde repolarda sshpass rpm'ini bulamadı. Bu yüzden bu sayfada  sshpass in uygun bir sürümünü bulup indirdim.

"sshpass-1.05-1.el6.rf.x86_64.rpm 23-Nov-2012 21:38 19K RHEL6 and CentOS-6 x86 64bit" OEL 6.3 ile uyumlu olacak , çünkü RHEL 6 ile muadil.


$ rpm -ivh sshpass-1.05-1.el6.rf.x86_64.rpm

ile kuruyoruz.

Daha sonra sshpassin çalıştığını görebilmekteyiz.

Bu aşamadan sonra artık iş iki serverdaki backup dizinlerinin senkron olması. Burada 2 yöntem var arkadaşlar. 

1 - Her oluşan backup dosyasını yollamak

 Export joblarınd aoluşan dosyanın tek olduğunu varsayarsak scriptin sonuna o dosyayı kopyala şeklinde yazmak kolay olabilir.

2 - Backup dizinlerini eşlemek

Bu durumda oluşan yedek dosyasının adını tam olarak bilemiyorsak, örneğin RMAN jobları sonrası oluşan dosyalar, çatı backup dizinini eşlemek daha iyi bir çözüm olabilir.

Burada eğer 2 nolu çözümü kullanırsak, ki bence daha kolay uygulanabilir ve eksik bir nokta bırakmaz, "scp" ile bunu şu şekilde yapabiliriz.

sshpass -p 'password' scp -r $BACKUP_FOLDER user@BACKUP_SERVER:/$BACKUP_DEST 

Bu durumda ise şöyle bir sıkıntı olacak, scp tüm dizini komple atacağı için daha önce atmış olduklarımızı da diğer tarafta ezerek kopyalacak ve gereksiz bir kopyalama yükü networke binecek. Backup dizinimizin boyutunun yüksek olduğunu düşünürsek , bu çözüm uygun olmuyor.

Bu durumda ise "rsync" adında bir tool buldum. (Bu sayfada  örnek ve detay bulabilirsiniz.) Zaten yüklü bir paket olan rsync i kullanmak gayet kolay. Ancak önemli birkaç karşılaştığım hatayı paylaşmak istiyorum.

Kullanım şu şekilde olacak:

sshpass -p 'password' rsync -avuz $BACKUP_FOLDER user@BACKUP_SERVER:/$BACKUP_DEST 

1- Öncelikle karşı tarafta da rsync paketinin yüklü olması gerekiyor. 

Command not found hatası alınır.

2- Eşitlemek istediğimiz klasörlerin doğru yazılması önemli.

Örneğin,
/data/backup_dir ile BACKUP_SERVER altında bir dizin vermemiz gerekiyor ki dosyaları tam olarak karşılaştırabilsin.

3- Karşılaştığım ilginç bir durum ise şöyle:

Eğer scriptde ki rsync kısmda dizin belirtirken "/" koymayı unutursak o dizin altındakileri eşlemek yerine diğer tarafa klasörü komple yolluyor, bu durumda diğer tarafta backupset altında bir backupset klasörü daha oluşuyor ve tekrar gitmesini istemediğimiz yedekler yollanmış olabiliyor.

Hatalı kullanım : 
rsync -avuz /data/backupset user@BACKUP_SERVER:/$BACKUP_DEST 

Doğru kullanım:
rsync -avuz /data/backupset/ user@BACKUP_SERVER:/$BACKUP_DEST 


Son olarak rsync ile ilgili gördüğüm ilginç bir durumdan daha bahsetmek istiyorum.
Kopyalama işlemi sürerken, BACKUP SERVER tarafında "ls" ile dosyaların geldiğini göremiyorsunuz, ancak "du -h $BACKUP_DEST" ile dizin boyutunun arttığını görebiliyorsunuz. Bunun sebebi kopyalama sürerken dosyaları gizli olarak atması, "ls -alh" ile bakarsanız dosyaların orada olduğunu ve boyutlarının arttığını takip edebilirsiniz.

Umarım faydalı bir yazı olmuştur.

İyi çalışmalar.

Erkan





No comments :

Post a Comment