PHP ile Sunucuda Yedek Almak

Başlatan yazilimci_adam, 29 Ekim 2016 - 12:05:23

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

yazilimci_adam

Arkadaşlar selam.

PHP'de sunucuda bulunan dosyaların yedeğini bir başka sunucuya almak istiyoruz. Bu daily ve monthly olarak ayarlandı.

Ancak boyutlar min 42 GB olduğundan sıkıntılı olabiliyor bu süreçler.

Şimdi diyoruz ki yedekleri sunucumuzda tutmak yerine Google Cloud Storage üzerine direkt yönlendirebilir miyiz?

Fiyatlandırmalara baktık eğer sadece outbound'a sanırım ücret istiyorlar. Bu uzaktan indirilenlere galiba para almayacakları anlamına geliyor.

Daha önce Cloud Storage API ile bu tarz bir işlem yapan oldu mu?

bugra9

Merhaba,

Bağlantı burada. https://cloud.google.com/storage/pricing
Yedekleme yani arşiv amaçlı kullanacağına göre hesap yapalım. Diyelim ki son 30 gün için her gün yedek aldığını ve her ay yedek almak üzere 1 yıllık yedek tuttuğunu düşünelim. Toplam boyut (30*42 + 11*42) = 1722 GB olacaktır. Bu depolama için aylık ödeyeceğiniz miktar => (1722 * $0.007) =  $12

Ayrıca arşivden her dosya çıkardığınızda ($0.05 per GB) ve bu dosyaları indirdiğinizde ($0.12 per GB) ayrı ayrı ücretlendirilirsiniz. Yedekleme amaçlı olacağı için bu işlemlerin pek gerçekleşeceğini sanmıyorum.

Bir de Amazon'un bu iş için servisi var ve ücretlendirmesi Google ile hemen hemen aynıdır.
https://aws.amazon.com/glacier/pricing/

yazilimci_adam

@bugra9 Teşekkürler. Bu sunucularda(cloud storage) bash script çalıştırabiliyor muyuz?

mevcut_eskileri_sil.sh

dosyalari_clouda_cek.sh

Öncelik ilk SH dosyasında olacak. İçeriği boşaltacak ve sonradan belirli klasör altındakileri silecek.

PHP kısmında da dosyalar cloud'a çekilirse o bash script en son aşamada yedekteki dosyaları silebilsin diye uzak bağlantı ile istek yollatılabilir. curl site.com/yedeklerisil.php gibi

bugra9

Rica ederim. Hayır çalıştıramazsın. Sadece api ile ya da web arayüzü ile iletişim kurabileceğin bir servis gibi düşün. En azından ben öyle biliyorum.

Ben Amazon'un servisini kullanıyordum. Kodlar hem kabuk hem php tarafında ve cron ile tetikletiyorum. Niye tüm işlemi kabuk ile halletmeyip php kullandığımı bilmiyorum. Yardımcı olması açısından zamanında yazdığım kodları paylaşayım. Silme işlemini nerede yaptığımı bulamadım, onu yapan kodlar uçmuş.

backup.sh içeriği

#!/bin/bash
DAY=`date +'%d-%m-%y_%H-%M'`

sudo rm -rf /vol/backup/*
tar -cvpzf /vol/backup/kullanici_$DAY.tar.gz /vol/kullanici
tar -cvpzf /vol/backup/redis_$DAY.tar.gz /var/redis/6379/dump.rdb

mongo --eval "printjson(db.fsyncLock())"
tar -cvpzf /vol/backup/mongodb_$DAY.tar.gz --exclude=/var/lib/mongodb/journal /var/lib/mongodb
mongo --eval "printjson(db.fsyncUnlock())"

/usr/bin/php /home/server/cekirdek/cron.php password glacier $DAY


cron.php içeriğinin ilgili kısmı

require('eklenti/aws/aws.phar');
use Aws\Glacier\GlacierClient;

if(isset($argv) && count($argv) > 2) {
$pass = $argv[1];
if($pass != 'buraya kendi belirleyeceğin bir şifre')
exit;

switch ($argv[2]) {
case 'redisBgSave':
veritabanina_baglan2();
$redis->bgSave();
break;
case 'glacier':
glacierCreateVault($argv[3]);
copyToGlacier('/vol/backup/kullanici_'.$argv[3].'.tar.gz', $argv[3]);
copyToGlacier('/vol/backup/redis_'.$argv[3].'.tar.gz', $argv[3]);
copyToGlacier('/vol/backup/mongodb_'.$argv[3].'.tar.gz', $argv[3]);
epostaGonder('y', '...@gmail.com', 'Dosyalar Başarıyla yedeklendi', 'Dosyalar Başarıyla yedeklendi');
break;
default:
# code...
break;
}

exit;
}

function glacierCreateVault($vaultName) {
glacierSetup();global $glacier;

$result = $glacier['client']->createVault(array(
    'vaultName' => $vaultName,
    'accountId' => '-'
));
return $result->get('location');
}

function copyToGlacier($fileName, $vaultName) {
glacierSetup();
global $glacier;

$result = $glacier['client']->uploadArchive(array(
    'vaultName' => $vaultName,
    'body'      => fopen($fileName, 'r')
));
return $result->get('archiveId');
}
function glacierSetup() {
global $glacier;

if(empty($glacier)) {
$glacier['client'] = GlacierClient::factory(array(
    'key'    => '...',
    'secret' => '...',
    'region' => 'us-east-1', // (e.g., us-west-2)
));
}
}