Yandex.Disk'e otomatik yedekleme

Yandex.Disk, parçası olduğu birkaç Yandex servisinden biridir. yazılım masaüstü için. Ve en önemli bileşenlerinden biri senkronizasyon algoritmasıdır. yerel dosyalar buluttaki kopyalarıyla. Son zamanlarda tamamen değiştirmek zorunda kaldık. Eski sürüm, on binlerce dosyayı bile zor sindiremezse ve dahası, bazı "karmaşık" kullanıcı eylemlerine yeterince hızlı tepki vermediyse, aynı kaynakları kullanan yeni sürüm yüz binlerce dosyayla başa çıkabilir.

Bu yazıda size bunun neden olduğunu anlatacağım: Yandex.Disk yazılımının ilk sürümünü çıkardığımızda önceden tahmin edemediğimizi ve yenisini nasıl oluşturduğumuzu anlatacağım.

Her şeyden önce, senkronizasyon görevi hakkında. Teknik olarak, kullanıcının bilgisayarındaki ve buluttaki Yandex.Disk klasöründe aynı dosya kümesini tutmaktan ibarettir. Yani dosya yeniden adlandırma, silme, kopyalama, ekleme ve değiştirme gibi kullanıcı eylemleri bulut ile otomatik olarak senkronize edilmelidir.

Neden ilk bakışta göründüğü kadar kolay değil?

Teoride, görev yeterince basit görünebilir, ancak gerçekte çeşitli zor durumlarla karşı karşıyayız. Örneğin, bir kişi bilgisayarındaki bir klasörü yeniden adlandırdı, bunu tespit ettik ve arka uca bir komut gönderdik. Ancak, kullanıcıların hiçbiri yeniden adlandırmanın başarılı olduğunu onaylamak için arka ucu beklemez. Kişi yerel olarak yeniden adlandırılan klasörünü hemen açar, içinde bir alt klasör oluşturur ve örneğin bazı dosyaları ona aktarır. Bulutta gerekli tüm senkronizasyon işlemlerini hemen gerçekleştirmenin imkansız olduğu bir durumdayız. İlk önce ilk işlemin tamamlanmasını beklemeniz gerekir ve ancak o zaman devam edebilirsiniz.

Birkaç kullanıcı aynı anda aynı hesapla çalışıyorsa veya paylaşılan bir klasörleri varsa durum daha da karmaşık hale gelebilir. Ve bu, Yandex.Disk kullanan kuruluşlarda oldukça sık olur. Önceki örnekte, ilk yeniden adlandırma için arka uçtan onay aldığımız anda, başka bir kullanıcının bu klasörü alıp yeniden adlandırdığını hayal edin. Bu durumda yine ilk kullanıcının bilgisayarında yapmış olduğu işlemleri hemen gerçekleştiremezsiniz. Yerel olarak çalıştığı klasör, şu anda arka uçta zaten farklı şekilde adlandırılıyor.

Bir kullanıcının bilgisayarındaki bir dosyanın bulutta çağrıldığı gibi adlandırılamadığı zamanlar vardır. Bu, adında yerel dosya sistemi tarafından kullanılamayan bir karakter varsa veya kullanıcı davet edildiğinde olabilir. paylaşılan klasör, ve bu ada sahip kendi klasörüne sahiptir. Bu gibi durumlarda, yerel takma adlar kullanmalı ve bunların buluttaki nesnelerle ilişkilerini takip etmeliyiz.

Algoritmanın önceki sürümü

Yandex.Disk masaüstü yazılımının önceki sürümünde, değişiklikleri aramak için bir ağaç karşılaştırma algoritması kullanılıyordu. Arka uç benzersiz nesne tanımlayıcılarına sahip olmadığı için, o sırada başka herhangi bir çözüm, yer değiştirme ve yeniden adlandırma aramasının uygulanmasına izin vermiyordu.

Algoritmanın bu versiyonunda üç ana ağaç kullandık: yerel (Yerel Dizin), bulut (Uzak Dizin) ve son senkronize (Kararlı Dizin). Ek olarak, zaten kuyruğa alınmış senkronizasyon işlemlerinin yeniden oluşturulmasını önlemek için iki yardımcı ağaç daha kullanıldı: yerel beklenen ve beklenen bulut (Beklenen Uzak Dizin ve Beklenen Yerel Dizin). Bu yardımcı ağaçlar, yerelin beklenen durumunu sakladı. dosya sistemi ve bulut, zaten kuyruğa alınmış tüm senkronizasyon işlemlerini tamamladıktan sonra.



Eski algoritmadaki ağaç karşılaştırma prosedürü şuna benziyordu:
  1. Yerel bekleyen ağaç ve bulut bekleyen ağaç boşsa, bunları en son senkronize edilmiş ağacı kopyalayarak başlatın;
  2. Yerel ağacı beklenen bulut ağacıyla karşılaştırır ve bireysel düğümleri karşılaştırmanın sonuçlarına dayanarak, buluttaki senkronizasyon işlemlerini kuyruğa ekleriz (koleksiyonlar oluşturma, buluta dosya aktarma, bulutta taşıma ve silme);
  3. Bir önceki adımda kuyruğa alınan tüm işlemler için gelecekteki etkilerini beklenen bulut ağacında sabitleriz;
  4. Bulut ağacını yerel beklenen ile karşılaştırırız ve bireysel düğümleri karşılaştırmanın sonuçlarına dayanarak, yerel dosya sistemiyle eşitleme işlemlerini kuyruğa ekleriz (dizin oluşturma, buluttan dosya indirme, yerel dosya ve dizinleri taşıma ve silme) ;
  5. Önceki adımda kuyruğa alınan tüm işlemler için gelecekteki etkilerini beklenen yerel ağaçta sabitleriz;
  6. Sıra aynı dosya veya dizine sahip eşzamanlı işlemler içeriyorsa (örneğin, bir dosyayı buluta aktarmak ve aynı dosyayı buluttan indirmek), o zaman bir çakışmayı düzeltiriz - dosya iki yerde değişti;
  7. Senkronizasyon işlemi bulutta veya yerel dosya sistemi ile yapıldıktan sonra sonucunu en son senkronize edilen ağaca giriyoruz;
  8. Eşitleme kuyruğu boşaldığında yerel bekleyen ve bulut bekleyen ağacı sileriz. Senkronizasyon tamamlandı ve artık onlara ihtiyacımız olmayacak.

Neden yeni bir algoritma bulmamız gerekiyordu?

Ağaç karşılaştırma algoritmasının ana sorunları, büyük bellek tüketimi ve işlemci üzerinde büyük bir yüke yol açan küçük değişikliklerle bile tüm ağaçları karşılaştırma ihtiyacıydı. Değişiklikleri işlerken, bir dosya bile rasgele erişim belleği yaklaşık %35 arttı. Diyelim ki bir kullanıcının 20.000 dosyası var. Ardından, bir 10Kb dosyanın basit bir yeniden adlandırılmasıyla bellek tüketimi aniden arttı - 116MB'den 167MB'ye.

Biz de artırmak istedik en yüksek miktar kullanıcının sorunsuz çalışabileceği dosyalar. Örneğin, fotoğraf oturumlarının sonuçlarını Yandex.Disk'te saklayan bir fotoğrafçı, onlarca, hatta yüz binlerce dosya olabilir. Bu görev, insanlar Yandex.Disk'te ek alan satın alma fırsatı bulduğunda özellikle acil hale geldi.

Geliştirme aşamasında ben de bir şeyleri değiştirmek istedim. hata ayıklama eski versiyon bir elementin durumları hakkındaki veriler farklı ağaçlarda bulunduğundan zorluklara neden oldu.

Bu zamana kadar, arka uçta nesnelerin kimliği ortaya çıktı, bu sayede hareketleri algılama problemini daha verimli bir şekilde çözmek mümkün oldu - daha önce yolları kullandık.

Yeni algoritma

Veri depolama yapısını değiştirmeye ve üç ağacı (Yerel Dizin, Uzak Dizin, Kararlı Dizin) bir taneyle değiştirmeye karar verdik, bu da ana veri yapısındaki artıklığın azalmasına yol açmalıydı. Ağaçtaki anahtarın dosya sisteminin bir öğesinin yolu olması nedeniyle, birleştirme sonucunda kullanılan RAM miktarı önemli ölçüde azaltılmıştır.



Ayrıca, yeni sürümdeki ağacın her bir öğesi gerekli tüm verileri depoladığı için, senkronizasyon sırasında yardımcı ağaçların kullanımını da bıraktık. Bu yapı değişikliği, kodunuzda hata ayıklamayı çok daha kolay hale getirdi.

Bunun büyük bir değişiklik olduğunu anladığımızdan, yeni çözümün etkinliğini doğrulayan bir prototip oluşturduk. Yeni bir dosyanın senkronizasyonu sırasında ağaçtaki verilerin nasıl değiştiğine dair bir örneğe bakalım.

  1. Kullanıcı Disk klasörüne ekledikten sonra yeni dosya, program onu ​​algıladı ve ağaca yeni bir öğe ekledi. Bu öğenin bilinen tek bir durumu vardır - yerel. Kararlı ve uzak durumlar olmadığından bunlar için bellek ayrılmaz;
  2. Program dosyayı yükler. Buluttan yeni bir dosyanın görünümünü onaylayan bir push gelir ve ağaca bir uzak durum eklenir;
  3. Yerel ve uzak durumlar karşılaştırılır. Aynı oldukları için kararlı bir durum eklenir;
  4. Yerel ve uzak durumlar kaldırılır. Tüm bilgiler sabit olduğu için artık bunlara ihtiyaç yoktur.



Bu örnek, yeni senkronizasyon algoritmasında, daha önce olduğu gibi tüm ağacın değil, dosya sisteminden veya buluttan alınan değişikliklerle ilgili verilerin yalnızca bu öğelerin ve olayların işlendiğini göstermektedir. Gerekirse, üst veya alt düğümler işlenir (örneğin, bir klasörün taşınması durumunda).

Diğer iyileştirmeler

Yeni sürümde, performans üzerinde etkisi olan diğer iyileştirmeler üzerinde çalıştık. Ağacın kaydedilmesi, dosyaya yalnızca en son değişikliklerin yazılmasına izin verecek şekilde artımlı yapılmıştır.

Yandex.Disk, dosya bütünlüğünü kontrol etmek, değişen parçaları tespit etmek ve arka uçtaki dosyaları tekilleştirmek için sha256 ve MD5 özetlerini kullanır. Bu görev CPU'yu yoğun bir şekilde yüklediğinden, yeni sürümde özet hesaplamalarının uygulanması önemli ölçüde optimize edilmiştir. Dosya özeti alma hızı yaklaşık iki kat arttı.

Sayılar

10Kb'lik benzersiz 20.000 dosyanın senkronizasyonu

Her biri 10 kb olan benzersiz 20.000 dosyanın özetlerinin hesaplanması (indeksleme)

20.000 10Kb eşitlenmiş dosyadan çalıştırın

1Gb yükleyin. Wi-Fi bağlantısı 10 MBit
zaman, saniye

Ne oldu

Örnekler gösteriyor ki yeni bir versiyon Yandex.Disk yazılımı yaklaşık 3 kat daha az RAM ve yaklaşık 2 kat daha az CPU yükü kullanır. Küçük değişiklikleri işlemek, kullanılan bellek miktarını artırmaz.

Yapılan değişiklikler sonucunda programın sorunsuz bir şekilde işleyebileceği dosya sayısı önemli ölçüde artmıştır. Windows sürümü 300.000 dosyaya sahiptir ve Mac OS X sürümü 900.000 dosyaya sahiptir.

Neden yedeklemeniz gerektiği bir sır değil. Örneğin, bir web geliştiricisinin, geliştirme sürecinde kendisi tarafından fark edilmeyen bir hata yapması ve birkaç saat sonra hatanın yüzeye "açılması" ve kesinlikle zaman kalmaması durumunda yedekleme yapması uygun olacaktır. Hatayı bulmak ve düzeltmek için. Vscale'in elbette bir yedekleme sistemi var, ancak yalnızca tüm sunucu verilerinin kopyalanmasını sağlıyor. Ve bir yedekten geri yükleme yeteneği yalnızca kopyanın yapıldığı sunucuda mevcuttur. Bu yetenek, koşullu bir web geliştiricisinin ihtiyaçlarını tam olarak karşılamaz. Ancak, artık dünyanın iyi gelişmiş bir "bulut" trendi var: bulut barındırma, bulut VPS, Bulut depolama veriler vb. Bu kılavuzda, size bulut yedekleme depolamasını nasıl kuracağınızı göstereceğiz. Yandex.Disk bu konuda bize yardımcı olacaktır.

Teknik gereksinimler

  • Ubuntu 16.04
  • Yandex'deki hesap (Ya.Pochta, Ya.Deneg ve Ya.Disk için ortaktır)

Adım 1. Yandex konsol istemcisinin kurulması ve yapılandırılması

Anahtar bileşeni yüklemeye başlayalım - Ya.Disk istemcisi. Standart havuz listesinde Ya.Disk istemcisi ile birlikte bir paket bulunmadığından, havuzu manuel olarak eklemeniz, ardından paket dizinini güncellemeniz ve ancak ondan sonra paketi istemciyle birlikte kurmanız gerekecektir. Ya.Disk'in web sitesinde bir liste var gerekli ekipler tek satırda:

Eko "deb http://repo.yandex.ru/yandex-disk/deb/ kararlı ana"| sudo tee -a /etc/apt/sources.list .d / yandex.list> / dev / null && wget http: //repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG -O- | sudo apt-key add - && sudo apt-get güncelleme && sudo apt-get install -y yandex-disk

Yandex istemcisi başarıyla kuruldu ve onu yapılandırmaya başlayabilirsiniz. Yandex, istemcinin yapılandırma dosyalarıyla minimum düzeyde çalıştığından emin oldu ve her şeyi tek bir komutla yapılandırma yeteneği ekledi:

Yandex disk kurulumu

Yukarıdaki komutun çalışma sırası:

  1. Bir proxy sunucusu kullanmalı mıyım? (y / n)
  2. Hesabınıza giriş yapın (giriş ve şifre)
  3. Dosyalarımı yerel olarak depolamak için hangi klasörü kullanmalıyım? (Alanı boş bırakın, program bir klasör oluşturacaktır. Yandex.Disk ana dizinde (Ubuntu için bu / kök /). İşlemi onayladıktan sonra, istemcinin buluttaki veya sunucudaki dosyaları senkronize etmesinin biraz zaman alacağını lütfen unutmayın)
  4. Ya.Disk'i sistem başlangıcında başlatmak istiyor musunuz? (y / n)

Ya.Disk'i otomatik çalıştırmayı etkinleştirdiğinizden emin olun ve geri kalan öğeleri kendi takdirinize göre özelleştirebilirsiniz. Bu noktada, ayar tamamlanmış sayılabilir.

Adım 2. Bir yedekleme oluşturun ve yapılandırın

Yaratmak için destek olmak, kullanılacak birçok komut var. Python veya Perl bu konuda yardımcı olabilir, ancak bunu bash kullanarak yapmak en uygunudur. Basit ve kullanımı kolaydır ve doğrudan konsolla etkileşime girer. Bir bash betiği oluşturun:

Nano /var/backup.sh

İçine aşağıdaki kodu yapıştırın:

SERVER_PATH = "/ var / www / html"
cur_date = `tarih +% Y-% m-% d`
dosyaadı = "yedekleme -" $ cur_date ".tar.bz2"

tar -cjf $ dosya adı $ SERVER_PATH

if [-f $ dosya adı]; Daha sonra
mv $ dosya adı /root/Yandex.Disk/backup/
yandex-disk senkronizasyonu
fi

Dosyayı klavye kısayoluyla kaydedin Ctrl + O, tuşu ile işlemi onaylayın Girmek ve dosyayı klavye kısayoluyla kapatın Ctrl + X... Sistem komutlarına (klasör oluştur ve taşı, dizinlere erişim) erişebilmesi için dosyaya izinler atadığınızdan emin olun:

CD / var
chmod -R 755 * backup.sh

Komut dosyasının ne yaptığı hakkında kısaca:

  1. Komut dosyasının bulunduğu klasörde / var / www / html / klasörünün içeriğiyle bir arşiv oluşturur;
  2. Yedekleme arşivine şöyle bir ad verir: backup-2015-11-25.tar.bz2;
  3. Ya.Disk'e bir yedeği bir klasöre yükler / destek olmak /.

Komut dosyasının aşağıdaki komutla çalışıp çalışmadığını kontrol edebilirsiniz:

Cd / var && ./backup.sh

Komutun yürütülmesinin bir sonucu olarak, arşiv şuraya yüklenecektir: Bulut depolama.

Adım 3. Yedekleme oluşturmayı otomatikleştirin

Sonraki ve son adım, komut dosyasını görev zamanlayıcıya eklemektir. Bu crontab ile bize yardımcı olacak. Zamanlanmış görevler listesini açın:

Crontab -e

En sonuna şu satırı ekleyin:

0 0 * * * /var/backup.sh

Şimdi Crontab betiği her gün gece yarısı çalıştıracak. Bu, otomatik yedekleme yapılandırmasını tamamlar.

Çözüm

Başarıyla yapılandırdınız otomatik oluşturma web sitenizin dizini için bir yedek. Bu, sunucunun kendisinde depolanmışsa bir yedeği kaybetmemek için çok kullanışlı bir algoritmadır. Aynı prensibe göre, yapılandırma dosyalarının yedek kopyalarını oluşturabilirsiniz. Genel olarak bulut teknolojileri iyi çünkü kişisel verilerin yüksek düzeyde kullanılabilirliğini ve depolanmasını sağlıyorlar. Bulutu seçmek iyi bir seçimdir.

Projelerin (sitelerin) yedeklerini, örneğin sunucuda yer olmaması (hosting, VDS, VPS) veya yedeklerin saklanmasının güvenliğini artırmak (sunucu olması durumunda) gibi çeşitli nedenlerle Yandex.Disk'e yüklemeniz gerekebilir. baskınsız ve binayı terk ediyor).

Bu bağlamda, kendim için yazdım ve başkaları için Yandex.Disk'te yedekleme için küçük bir bash betiği göndermeye karar verdim. Komut dosyası işlevleri:
- Sunucuda yedekleme projelerinin oluşturulması (dosyalar + MySQL veritabanları);
- Uygulama olarak Yandex.Disk'te yetkilendirme (belirteçle, kullanıcı adı ve şifre kullanmaktan daha güvenli bir yol);
- Sunucudan Yandex.Disk'e yedek gönderme;
- Yer kazanmak için eski yedekleri Yandex.Disk'ten kaldırma (yapılandırılabilir maksimum yedek sayısı);
- Bir günlüğü kaydetme ve e-postaya gönderme (yapılandırılabilir).

Komut dosyasını kullanmak için öncelikle Yandex.Disk'ten bir jeton almalısınız. Başlayalım.

1. Yedekleyeceğimiz hesap altında Yandex'e giriş yapın, oauth.yandex.ru adresine gidin ve "Yeni bir uygulama kaydet" e tıklayın.

2. Uygulamanın adını girin (örneğin, "yedekleme") ve "Yandex.Disk REST API" bölümünde gerekli hakları verin, yani: "Disk hakkındaki bilgilere erişim" ve "Uygulama klasörüne erişim" Diskte".


Aynı sayfanın altında, "Geri Arama URL'si" alanının altındaki "URL'yi geliştirme için gönder"i ve "Kaydet"i tıklayın:


3. Uygulama ayarlarını kaydettikten sonra, uygulama verilerinin bulunduğu sayfaya yönlendirileceğiz:


4. Şimdi jetonun kendisini alıyoruz (isterseniz, bununla ilgili daha fazla bilgiyi Yandex kılavuzunda okuyabilirsiniz), bunun için kimliği kopyalıyoruz, URL'nin sonunda değiştiriyoruz https://oauth.yandex.ru/ Authorize?response_type=token&client_id=, sonuçtaki adrese gidin ve uygulamaya izin verildiğini onaylayın:


Sonuç olarak, en az 1 yıl süreyle verilen sayfada bir jeton görüntülenecektir, böylece yedekleme komut dosyası aniden çalışmayı durdurursa, yeni bir jeton alabilir ve onu komut dosyasına değiştirebiliriz. Alınan jetonu kullanarak Yandex.Disk ile çalışma yeteneklerini özel bir test alanında test edebilirsiniz.

Ve şimdi Yandex.Disk'te bir yedekleme için bash betiğinin kendisi:

#! / bin / bash # # Sergey Lukonin tarafından Yandex.Disk yedekleme komut dosyası v1.0 (neblog.info) # # # # # # # # # # # YEDEKLEME AYARLARI MYSQL # # # # # # # # # # # Sunucu DB MYSQL_SERVER = mysql.some-server.ru # Mevcut veritabanlarını yedekleyeceğimiz kullanıcı, mysql kökü genellikle tüm veritabanlarına erişilebilir, bireysel kullanıcı genellikle belirli bir projenin veritabanına erişebilir MYSQL_USER = bazı kullanıcı # Veritabanı kullanıcı şifresi (Sunucu kökünden şifre ve mysql kökünden farklı olanları karıştırmayın) MYSQL_PASSWORD = bir şifre # # # # # # # # # # GENEL AYARLAR # # # # # # # # # # # Dizin Yandex'e gönderildikten sonra silinen yedeklerin geçici olarak saklanması için .. Disk yedekleri (0 - tüm yedekleri sakla): MAX_BACKUPS = "14" # Arşiv adlarında kullanılan tarih DATE = `date" +% Y-% m-% d "` # Tek bir arşive yerleştirilecek ve Yandex.Disk'e gönderilecek olan (bir boşlukla ayrılmış) arşivleme dizinleri DIRS = "/ home / www / projeler / neblog" # Yandex.Disk belirteci (için neblog.info'ya bakın) nasıl edinilir) TOKEN = "" # Geyik içinde saklanan günlük dosyasının adı $ BACKUP_DIR LOGFILE = "backup.log" içinde belirtilen dizine # Script yürütme sonucunun gönderileceği e-posta. Sonuç göndermek istemiyorsanız boş bırakın. sendLog = " [e-posta korumalı] "# Yalnızca hataları gönder (doğru). Komut dosyasının yürütülmesinin herhangi bir sonucu için günlük göndermek istiyorsanız false belirtin. SendLogErrorsOnly =" false "# # # # # # # # # # AYARLARIN SONU # # # # # # # # # # # # # # # # # # # # HİÇBİR ŞEYİ DEĞİŞTİRMEYİN! sendLogErrorsOnly" == true ]; o zaman echo "$ 1" | grep -q "error" ise echo "$ 2" | mail -s "$ 1" $ sendLog> / dev / null fi else echo "$ 2" | mail -s "$ 1" $ sendLog> / dev / null fi fi) işlev günlüğü () (echo "[" `date" +% Y-% m-% d% H:% M:% S "` "] Dosya $ BACKUP_DIR: $ 1" >> $ BACKUP_DIR / $ LOGFILE) function parseJson () (yerel çıktı normal ifadesi = "(\" $ 1 \ ": [\"]?) ([^ \ ", \)] +) ([\"]?) "[[$ 2 = ~ $ normal ifade]] && çıktı = $ (BASH_REMATCH) echo $ çıktı) function checkError () (echo $ (parseJson "error" "$ 1")) function getUploadUrl ( ) (json_out = `curl -s -H" Yetkilendirme: OAuth $ TOKEN "https: //cloud-api.yandex.net: 443 / v1 / disk / kaynaklar / yükleme /? Yol = uygulama: / $ backupName & üzerine yazma = doğru' json _error = $ (checkError "$ json_out") if [[$ json_error! = ""]]; ardından "$ PROJECT - Yandex.Disk hatası: $ json_error" postalama "$ PROJECT - Yandex.Disk yedekleme hatası" "$ FILENAME dosyasını kopyalarken HATA. Yandex.Disk hatası: $ json_error" echo "" else çıktı = $ (parseJson " href "$ json_out) echo $ output fi) function uploadFile (local json_out local uploadUrl local json_error uploadUrl = $ (getUploadUrl) if [[$ uploadUrl! =" "]]; sonra echo $ UploadUrl json_out =` curl -s -T $ 1 -H "Yetkilendirme: OAuth $ TOKEN" $ uploadUrl` json_error = $ (checkError "$ json_out") eğer [[$ json_error! = ""]]; Ardından "$ PROJECT - Yandex.Disk hatası: $ json_error" postalama günlüğü " $ PROJECT - Yandex.Disk yedekleme hatası "" HATA $ FILENAME dosyası kopyalama. Yandex.Disk hatası: $ json_error "else logger" $ PROJECT - Dosya Yandex.Disk'e kopyalanıyor "mailing" $ PROJECT - Yandex.Disk yedekleme başarılı " " BAŞARILI dosya kopyası $ FILENAME "fi else echo" Bazı hatalar oluştu. Ayrıntılı bilgi için günlük dosyasını kontrol edin "fi) function backups_list () (# Uygulama dizinindeki tüm yedekleme dosyalarını arayın ve adlarını görüntüleyin : curl -s -H "Yetkilendirme: OAuth $ TOKEN" "https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/&sort=created&limit=100" | tr "()," "\ n" | grep "isim [[: grafik:]] *.tar.gz" | kesme -d: -f 2 | tr -d "" ") function backups_count() (local bkps = $ (backups_list | wc -l) # Hem dosyaları hem de veritabanını yedeklersek 1 yedekte 2 dosyamız olur.Dolayısıyla yedekleme sayısı = dosya sayısı / 2: ifade $ bkps / 2) function remove_old_backups () (bkps = $ (backups_count) old_bkps = $ ((bkps - MAX_BACKUPS)) eğer ["$ old_bkps" -gt "0"]; o zaman günlükçü " Yandex'den eski yedekleri kaldırın ... Disk "# Eski yedekleri silme döngüsü: # Listedeki ilk dosyayı silme 2 * old_bkps kez i in` eval echo (1 .. $ ((old_bkps * 2))) `; do curl -X DELETE -s - H" Yetkilendirme: OAuth $ TOKEN "" https://cloud-api.yandex.net:443/v1/disk/resources?path=app:/$(backups_list | awk "(NR == 1)") & kalıcı olarak = true " bitti fi) günlükçü "--- $ PROJE BAŞLAT YEDEKLEME $ TARİH ---" günlükçü "Veritabanı dökümlerini boşaltma" mkdir $ BACKUP_DIR / $ DATE for `mysql -h $ MYSQL_SERVER -u $ MYSQL_USER -p $ MYSQL_PASSWORD -e" veritabanlarını göster; "| grep -v bilgi_şema | grep -v Veritabanı`; mysqldump yap -h $ MYSQL_SERVER -u $ MYSQL_USER -p $ MYSQL_PASSWORD $ i> $ BACKUP_DIR / $ DATE / $ i.sql; günlükçü yapıldı" Bir mysql arşivi oluşturun $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz "tar -czf $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz $ BACKUP_DIR / $ DATE rm -rf $ BACKUP_DIR / $ DATE logger " Bir dizin arşivi oluşturun $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz "tar -czf $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz $ DIRS DOSYA ADI = $ DATE-mysql- $ PROJECT.tar .gz kaydedici" Yandex.Disk mysql arşivine tıklayın $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz "backupName = $ DATE-mysql- $ PROJECT.tar.gz uploadDosyası $ BACKUP_DIR / $ DATE-mysql- $ PROJECT.tar.gz DOSYA ADI = $ DATE-files- $ PROJECT.tar.gz logger "Arşivi $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz ile Yandex.Disk'e yükleyin" backupName = $ DATE-files- $ PROJECT.tar. gz uploadFile $ BACKUP_DIR / $ DATE-files- $ PROJECT.tar.gz logger "Arşivleri diskten sil" find $ BACKUP_DIR -type f -name "* .gz" -exec rm "()" \; # Eski yedekleri Yandex.Disk'ten kaldırın (MAX_BACKUPS> 0 ise) [$ MAX_BACKUPS -gt 0] ise, kaldır_old_backups; fi logger "Yedekleme komut dosyasını sonlandır"

Ayrıca hazır bir tane indirebilirsiniz. Komut dosyası sunucuda bulunmalı, içindeki parametreleri kendinizle değiştirmeli, çalıştırma izni vermeli (chmod + x) ve cron'da günlük olarak yürütülecek şekilde ayarlanmalıdır. Bu tür birkaç görevi gerçekleştirmeyi planlıyorsanız, başlangıçları arasındaki süreyi (5-10 dakika) ayarlayın.

İÇİNDE modern dünya bilgi giderek daha fazla değer kazanıyor ve bunun kaybı ciddi finansal maliyetlere neden olabilir. Site, bir yedek kopyası veya sadece bir yedeği olan değerli bilgilerdir, bu makalede örnek olarak wordpress kullanarak yapacağız ve Yandex diskine yerleştireceğiz. İhtiyaçlarım için ortaya koyduğum ve uzun süredir başarılı bir şekilde kullanmakta olduğum süreci otomatikleştirme seçeneğini değerlendireceğim.

Aşamalar halinde hareket edeceğiz. İlk olarak, site ve veritabanı dosyalarını doğrudan yedekleme seçeneğini ele alalım. Ardından sitenizin wordpress'te düzenli yedeğini nasıl alacağınız sorusuna tam olarak cevap vereceğiz.

Arşiv sitesi dosyaları için komut dosyası

Burada tekerleği yeniden icat etmedim ama bundan faydalandım. standart bir şekilde dosyaları arşivleme - arşivleyici katran... Tüm yorumları ve açıklamaları hemen senaryoya yazacağım:

#! / bin / sh # Değişkenleri ayarlayın # Şu formatta geçerli tarih 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Yedeklemeyi nereye yerleştiriyoruz bk_dir = "/ mnt / backup / site1.ru "# Dosyaların bulunduğundan bir seviye daha yüksek dizin inf_dir =" / web / siteler / site1.ru / "# Dosyaların bulunduğu doğrudan dizinin adı dir_to_bk =" www "# Bir arşiv oluştur / usr / bin / tar -czvf $ bk_dir / www_ $ date_time.tar.gz -C $ inf_dir $ dir_to_bk

Çıkışta script çalıştıktan sonra www_2015-09-29_04-10.tar.gz adında bir klasörümüz var ve bunun içinde tüm içeriğin bulunduğu bir www klasörü olacak. Başlangıçta, bu klasör /web/sites/site1.ru/www adresinde bulunuyordu. Burada parametre ile tar uyguladım -İLE BİRLİKTE böylece arşivin tam yolu /web/sites/site1.ru değil, yalnızca www klasörü vardır. Sadece benim için daha uygun.

Bu betiği, mutlaka site değil, dosya arşivleri oluşturmak için ayrı olarak kullanabilirsiniz. onu koyduk cron ve düzenli arşivleme alıyoruz.

Veritabanı yedekleme komut dosyası

Şimdi bir veritabanı yedeklemesi için bir komut dosyası oluşturalım. Burada da özel bir şey yok, standart bir araç kullanıyorum mysqldamp:

#! / bin / sh # Değişkenleri ayarlayın # Şu formatta geçerli tarih 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Yedeklemeyi nereye yerleştiriyoruz bk_dir = "/ mnt / backup / site1.ru "# Database user user =" user1 "# User password password =" pass1 "# Yedekleme için veritabanı adı bd_name =" bd1 "# Veritabanını kaldırın / usr / bin / mysqldump -- opt -v - -databases $ bd_name -u $ kullanıcı -p $ şifre | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz

Çıktıda, mysql_2015-09-29_04-10.sql.gz veritabanının dökümünü içeren bir dosyamız var. Döküm şurada saklanır: Metin formatı, herhangi bir düzenleyici tarafından açılabilir ve düzenlenebilir.

Webdav aracılığıyla CentOS 7'de bir Yandex diski bağlama

Oldukça uygun ve ücretsiz servis Ben bir indeksim, herkesin kullanabileceği bir disk. Ücretsiz olarak çok fazla alan verilmez, ancak bir siteyi wordpress'te yedeklemek için yeterlidir. Bu arada, her türlü promosyonun yardımıyla ücretsiz olarak 368 GB'ım var:

Ben ndeks.Disk webdav kullanılarak bağlanabilir. Sunucum CentOS 7, ona nasıl mount edeceğinizi anlatacağım. Öncelikle bağlanıyoruz. Ardından paketi kurun davfs2:

# yum -y davfs2'yi kurun

Şimdi diski monte etmeye çalışıyoruz:

# mkdir / mnt / yadisk # mount -t davfs https://webdav.yandex.ru / mnt / yadisk / Lütfen https://webdav.yandex.ru sunucusuyla kimlik doğrulaması yapmak için kullanıcı adını girin veya hiçbiri için enter tuşuna basın. Kullanıcı adı: Lütfen kullanıcının kimliğini doğrulamak için şifreyi girin [e-posta korumalı] https://webdav.yandex.ru sunucusuyla veya hiçbiri için enter tuşuna basın. Şifre: /sbin/mount.davfs: Uyarı: mtab'a giriş yazılamaz, ancak yine de dosya sistemini bağlar

ndex'im var.Disk / mnt / yadisk klasörüne monte edilmiştir.

Arşivleme işlemini otomatikleştirmek ve her seferinde kullanıcı adı ve şifre girmemek için, sonuna kullanıcı adı ve şifre ile yeni bir satır ekleyerek / etc / davfs2 / secrets dosyasını düzenleyin:

# mcedit / etc / davfs2 / sırlar / mnt / yadisk / [e-posta korumalı] parola

Artık diski monte ederken hiçbir soru sorulmayacak. Bir Yandex disk bağlantısı ekleyebilirsiniz. fstab böylece açılışta otomatik olarak bağlanır, ancak gereksiz buluyorum. Sürücüyü yedekleme komut dosyasına bağlarım ve bağlantısını keserim. Otomatik olarak monte etmek istiyorsanız, fstab'a ekleyin:

Https://webdav.yandex.ru / mnt / yadisk davfs rw, kullanıcı, _netdev 0 0

Web sitesi arşivleme otomasyonu

Ayrı olarak, sitenin yedek bir kopyasını oluşturmanın tüm unsurlarını demonte ettik, şimdi tüm bunları tek bir yerde toplamanın zamanı geldi. Aşağıdaki site yedekleme şemasını kullanıyorum:

  • Dosya gün son 7 gün için 7 site arşivini saklayan .
  • Dosya hafta son 4 hafta için 4 yedeklemenin depolandığı yer.
  • Dosya ay, tüm zaman boyunca tüm site yedeklerinin depolandığı yerde, bu klasörü otomatik olarak temizlemiyorum.

Böyle bir şema ile, her ihtimale karşı en son 7 arşivi, içinde bulunulan ayın haftalık arşivini ve her ay için bir arşivi her zaman elimizin altında bulunduruyoruz. Örneğin, bir hafta önce bir yedekten bir şey almam gerektiğinde bu şema birkaç kez bana yardımcı oldu.

İşte bir wordpress sitesinin yedek kopyasını oluşturmak için 3 tam komut dosyası, bu benim en sık kullandığım motor, ancak gerçekte herhangi bir siteyi yedekleyebilirsiniz - joomla, drupal, modx, vb. Cms veya çerçeve çok önemli değil .

Web sitesi günlük yedekleme komut dosyası backup-day.sh:

gün"# Arşiv için dizin inf_dir =" / web / siteler / site1.ru / "# Dosyaların bulunduğu doğrudan dizinin adı dir_to_bk =" www "# Veritabanı kullanıcısı kullanıcı =" kullanıcı1 "# Kullanıcı şifresi şifresi =" pass1 "# Yedekleme için veritabanı adı bd_name = "bd1" # Yandex.disk montajı mount -t davfs https://webdav.yandex.ru / mnt / yadisk / # Kaynak arşiv oluştur / usr / bin / tar -czvf $ bk_dir / www_ $ date_time.tar.gz -C $ inf_dir $ dir_to_bk # Veritabanını boşaltın / usr / bin / mysqldump --opt -v --databases $ bd_name -u $ kullanıcı -p $ şifre | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz # 7 günden eski arşivleri sil / usr / bin / find $ bk_dir -type f - zaman +7

Haftalık site yedekleme komut dosyası backup-week.sh:

#! / bin / sh # Değişkenleri ayarlayın # Şu formatta geçerli tarih 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Yedeklemeyi nereye yerleştiriyoruz bk_dir = "/ mnt / yadisk / site1.ru / hafta"# Arşiv için dizin inf_dir =" / web / siteler / site1.ru / "# Dosyaların bulunduğu doğrudan dizinin adı dir_to_bk =" www "# Veritabanı kullanıcısı kullanıcı =" kullanıcı1 "# Kullanıcı şifresi şifresi =" pass1 "# Yedekleme için veritabanı adı bd_name = "bd1" # Yandex.disk montajı mount -t davfs https://webdav.yandex.ru / mnt / yadisk / # Kaynak arşiv oluştur / usr / bin / tar -czvf $ bk_dir / www_ $ date_time.tar.gz -C $ inf_dir $ dir_to_bk # Veritabanını boşaltın / usr / bin / mysqldump --opt -v --databases $ bd_name -u $ kullanıcı -p $ şifre | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz # 30 günden eski arşivleri sil / usr / bin / find $ bk_dir -type f -mzaman +30-exec rm() \; # Yandex.Disk umount / mnt / yadisk'i devre dışı bırakın

Aylık web sitesi yedekleme komut dosyası yedekleme-ay.sh:

#! / bin / sh # Değişkenleri ayarlayın # Şu formatta geçerli tarih 2015-09-29_04-10 date_time = `date +"% Y-% m-% d_% H-% M "` # Yedeklemeyi nereye yerleştiriyoruz bk_dir = "/ mnt / yadisk / site1.ru / ay"# Arşiv için dizin inf_dir =" / web / siteler / site1.ru / "# Dosyaların bulunduğu doğrudan dizinin adı dir_to_bk =" www "# Veritabanı kullanıcısı kullanıcı =" kullanıcı1 "# Kullanıcı şifresi şifresi =" pass1 "# Yedekleme için veritabanı adı bd_name = "bd1" # Yandex.disk montajı mount -t davfs https://webdav.yandex.ru / mnt / yadisk / # Kaynak arşiv oluştur / usr / bin / tar -czvf $ bk_dir / www_ $ date_time.tar.gz -C $ inf_dir $ dir_to_bk # Veritabanını boşaltın / usr / bin / mysqldump --opt -v --databases $ bd_name -u $ kullanıcı -p $ şifre | / usr / bin / gzip -c> $ bk_dir / mysql_ $ date_time.sql.gz # Yandex.disk'i devre dışı bırak umount / mnt / yadisk

/mnt/yadisk/site1.ru dizini oluşturmayı unutmayın bir Yandex diskinde ve içinde 3 klasör daha var: gün, hafta, ay:# cd /mnt/yadisk/site1.ru && mkdir gün hafta ay

Şimdi, otomasyon için bu 3 dosyayı şuraya ekleyin: cron:

# mcedit / etc / crontab # yandex.disk'e site yedeklemesi # her gün 04:10 am 10 4 * * * root /root/bin/backup-day.sh> / dev / null 2> & 1 # haftalık 4: 20 am Pazar 20 4 * * 0 root /root/bin/backup-week.sh> / dev / null 2> & 1 # aylık 4:30'da ayın 1'inde 30 4 1 * * root / root / bin / yedekleme ayı .sh> / dev / null 2> & 1

İşte bu, wordpress'imiz güvenilir bir şekilde yedekleniyor. Teorik olarak, burada postaya bir bildirim eklemeniz gerekiyor, ancak bunu yapacak zamanım yok. Ve birkaç aylık kullanım için tek bir başarısızlık yaşamadım.

Bir wordpress sitesini bir yedekten geri yükleme

Şimdi bir siteyi bir yedekten geri yüklemeniz gerektiğinde seçeneği düşünelim. Bunun için her iki arşive de ihtiyacımız var: kaynaklar ve bir veritabanı. Prensip olarak, herhangi bir yerde açabilirsiniz. Pencerelerde, ücretsiz 7zip arşivleyici ile arşivler açılır. Düz metin biçimindeki veritabanı dökümü, not defteri ile açılabilir, kopyalanıp phpmyadmin'e yapıştırılabilir.


Bu yüzden birçok kurtarma seçeneği olabilir ve bu yaklaşımı sevdiğim şey bu. Tüm dosyalar açık formdadır, elinizdeki herhangi bir yolla onlarla çalışabilirsiniz.

Burada, sunucu konsolundaki bir arşivden dosyaların nasıl çıkarılacağına dair bir örnek verilmiştir. www dizinini yedekten çıkarın:

# tar -xzvf www_2015-10-01_04-10.tar.gz

Dosyalar www klasörüne çıkarılır. Artık site klasörüne kopyalanabilirler.

Veritabanını geri yüklemek için aşağıdaki gibi ilerliyoruz. İlk olarak, arşivi açın:

# gunzip mysql_2015-10-01_04-10.sql.gz

Şimdi dökümü veritabanına dolduralım:

# mysql --host = localhost --user = user1 --password = pass1 bd1; MariaDB [(none)]> kaynak mysql_2015-10-01_04-10.sql;

İşte bu, veritabanı geri yüklendi.

Lütfen veritabanının orijinal adıyla veritabanına geri yükleneceğini ve sunucuda varsa içeriğini değiştireceğini unutmayın. Bir veritabanını diğerine geri yüklemek için, dökümün başlangıcını düzenlemeniz ve oradaki veritabanının adını yenisiyle değiştirmeniz gerekir. Kurtarma farklı bir sunucuda gerçekleşirse, önemli değil.

Çözüm

Bu yüzden wordpress motorunu kullanarak site ve veritabanı yedekleri oluşturma seçeneklerini örnek olarak inceledik. Bu durumda, sadece standart araçlar sunucu. Örnek olarak, Index.Disk'in kopyalarını depolamak için bir alıcı kullandık, ancak hiçbir şey onu diğerine uyarlamamızı engelleyemez. Ayrı bir sert olabilir veya Harici Sürücü, bir sunucuya bağlanabilen başka bir bulut depolama alanı.

Yedek oluşturma şeması, neredeyse süresiz olarak geri dönmenize izin verir. Parametreyi değiştirerek arşivlerin derinliğini kendiniz ayarlayabilirsiniz. zaman senaryoda. Örneğin günlük bir arşivi benim yaptığım gibi 7 gün değil, böyle bir ihtiyacınız varsa 30 gün saklayabilirsiniz. Öyleyse dene, kendine göre uyarla. Çalışma hakkında yorumlarınız, hatalarınız veya işlevselliği geliştirmek için önerileriniz varsa, düşüncelerinizi yorumlarda paylaşın, bunları duymaktan memnuniyet duyacağım.

Merhabalar, blogumun sevgili okuyucuları. Dosyaları Yandex sunucusunda saklamanıza izin veren bir program duymuşsunuzdur. Değilse, soft.yandex.ru'ya hoş geldiniz - orada.

İşte bu kadar. Birkaç gün önce sitelere göz atarken, sitenin yedek bir kopyasını Yandex diskine kaydetmenizi sağlayan bir komut dosyasının yayınlandığı bir bloga girdim. Bu yazıda detaylı olarak bahsedeceğim.

Neye ihtiyacımız var

  • 1. MySQL veritabanının sunucusu, oturum açma adı, şifresi ve adı, elbette siteniz bu veritabanıyla çalışıyorsa;
  • 2. Diskin kökünden sitenize giden yol (barındırma destek servisine sorun);
  • 3. Yandex'e giriş yapmak için kullandığınız e-posta ve şifre (bu aynı zamanda Yandex diskindeki verilerdir).

Yandex diskinde bir site yedekleme dosyasıyla çalışma

İlk önce mysql sunucusunun adresini değiştirmeniz gerekir. Çoğu durumda, bu localhost'tur, bu yüzden onu orada bıraktım, eğer farklıysa, onu kendimiz ile değiştiririz.

$ dbhost = "localhost"; // MySQL sunucu adresi.

Aşağıdaki satırda, "database_user" ifadesini mysql veritabanı kullanıcı adı değerinizle değiştirin.

"database_name", mysql veritabanının adıdır.

"site_dear_hear" yerine diskin kökünden siteye giden yolumuzu ekliyoruz.

Bundan sonra Yandex diskini kurmaya devam edin:

  • 1. "[e-posta korumalı]"adresimizle değiştiriyoruz E-posta Yandex'de;
  • 2. Yandex postasından gelen şifre için "yandex_password";
  • 3. Yandex diskinin kök klasöründe bir "yedekleme" dizini oluşturun (yedeklemeleriniz oraya kaydedilir).

Her şey. Dosyayı kaydedip sunucuya yüklüyoruz.

Sitenin kök dizinine yüklemenizi önermiyorum, çünkü her türlü robot sürekli olarak onunla iletişim kuracak ve bu da Yandex diskinin gereksiz yedek kopyalarla dolmasına neden olacaktır. Bir klasör oluşturmak daha iyidir, örneğin "a3hd7siq8a7s9xeeewwwerw-0-032-_2", böylece sizden ve cran'dan başka kimse nerede olduğunu bilmez.

Cran bir iş planlayıcıdır: özel program, bir programa göre komut dosyalarının başlatılmasını ayarlayabilirsiniz, ancak nasıl kullanılacağını bilmiyorum, bu yüzden burada yardımcı olamam.

Birden fazla site varsa ne yapmalı

Muhtemelen zaten beş sitem olduğunu biliyorsunuzdur. Doğal olarak, bunları ayrı ayrı çalıştırmaktan yorulursunuz, ancak aynı makalede, sırayla diğer tüm komut dosyalarını başlatan ikinci bir komut dosyasının yayınlanmış olması iyi bir şeydir.

  • 1. ;
  • 2. site1.ru, site2.ru vb. adreslerini sitelerinizin adresleriyle değiştirin. Ayrıca bu scriptin bulunduğu klasörü de arkasına eklemeyi unutmayınız;
  • 3. Değişiklikleri kaydedin ve site kök klasöründen mümkün olduğunca uzağa yerleştirerek sunucuya yükleyin.

Beşten az siteniz varsa, şuna benzeyen satırları kaldırmanız yeterlidir:

Eko ""; $ yanıtı = file_get_contents ("http://site5.ru/beckup.php"); echo iconv ("Windows-1251", "utf-8", $ yanıtı);

.рф bölgesinde bir siteniz varsa, adresi kaydetmeden önce Panycode'a çevirmeniz gerekecektir.

Umarım bu makale size yardımcı olmuştur.

Yorumlarınızı bekliyorum.

gastroguru 2017