使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

我需要每天在「2C-Bitrix:網站管理」(檔案和 mysql 資料庫)上備份網站兩次,並儲存 1 天的變更歷史記錄。

該網站位於運行 CentOS 7 作業系統並安裝了 1C-Bitrix:Web 環境的 VDS 上。 此外,請備份作業系統設定。

要求:

  • 頻率 - 每天 2 次;
  • 保留過去 90 天內的副本;
  • 如有必要,能夠取得特定日期的個人文件;
  • 備份必須儲存在VDS以外的資料中心;
  • 能夠從任何地方(另一台伺服器、本機電腦等)存取備份。

重要的一點是能夠以最少的額外空間和系統資源消耗快速建立備份。

這不是關於快速恢復整個系統的快照,而是關於文件和資料庫以及更改歷史記錄。

初始數據:

  • XEN 虛擬化上的 VDS;
  • 操作系統 CentOS 7;
  • 1C-Bitrix:Web環境;
  • 基於「1C-Bitrix:網站管理」的網站,標準版;
  • 檔案大小為 50 GB,並且會不斷成長;
  • 資料庫大小為 3 GB,並且會持續成長。

我立即排除了 1C-Bitrix 內建的標準備份。 它僅適用於小型站點,因為:

  • 它每次都會製作網站的完整副本,因此每個副本將佔用與文件佔用的空間相同的空間,在我的例子中為 50 GB。
  • 備份是使用 PHP 完成的,對於如此大的檔案量來說這是不可能的,它會使伺服器超載並且永遠無法完成。
  • 當然,儲存完整副本時不可能有 90 天。

託管商提供的解決方案是使用與 VDS 位於相同資料中心但位於不同伺服器上的備份磁碟。 您可以透過 FTP 操作磁碟並使用您自己的腳本,或者如果 ISPManager 安裝在 VDS 上,則可以透過其備份模組進行操作。 由於使用相同資料中心,此選項不適合。

綜上所述,對我來說最好的選擇是在 Yandex.Cloud(物件儲存)或 Amazon S3(Amazon Simple Storage Service)中使用我自己的腳本進行增量備份。

這需要:

  • 對 VDS 的 root 存取權;
  • 安裝口是心非的實用程式;
  • Yandex.Cloud 中的帳戶。

增量備份 — 一種僅存檔自上次備份以來發生更改的資料的方法。

表裡不一 — 一種使用 rsync 演算法並可與 Amazon S3 搭配使用的備份公用程式。

Yandex.Cloud 與 Amazon S3

在這種情況下,Yandex.Cloud 和 Amazon S3 對我來說沒有區別。 Yandex 支援大部分 Amazon S3 API,因此您可以使用現有的 S3 解決方案來使用它。 就我而言,這就是口是心非的效用。

Yandex的主要優勢可能是用盧布支付;如果數據很多,就不會和匯率有聯繫。 就速度而言,亞馬遜的歐洲資料中心與 Yandex 的俄羅斯資料中心相當;例如,您可以使用法蘭克福。 我之前使用 Amazon S3 來完成類似的任務,現在我決定嘗試 Yandex。

設定 Yandex.Cloud

1. 您需要在 Yandex.Cloud 中建立一個付款帳戶。 為此,您需要透過 Yandex 帳戶登入 Yandex.Cloud 或建立一個新帳戶。

2. 創建一個「雲」。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

3. 在「雲」中建立「目錄」。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

4. 為「目錄」建立一個「服務帳戶」。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

5. 為「服務帳戶」建立金鑰。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

6. 保存好鑰匙,以後會需要它們。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

7. 為“目錄”建立一個“桶”,檔案將放入其中。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

8. 我建議設定一個限制並選擇“冷儲存”。
使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

在伺服器上設定計劃備份

本指南假定您具備基本的管理技能。

1. 在 VDS 上安裝口是心非實用程序

yum install duplicity

2. 為 mysql 轉儲建立一個資料夾,在我的例子中是 VDS 根目錄中的 /backup_db

3. 為 bash 腳本 /backup_scripts 建立一個資料夾,並建立將執行備份的第一個腳本 /backup_scripts/backup.sh

腳本內容:

#!`which bash`


# /backup_scripts/backup.sh

# Это условие проверяет не идёт ли в данный момент процесс резервного копирования, если идёт, то на email отправляется сообщение об ошибке (этот блок можно не использовать)
if [ -f /home/backup_check.mark ];
then

DATE_TIME=`date +"%d.%m.%Y %T"`;

/usr/sbin/sendmail -t <<EOF
From:backup@$HOSTNAME
To:<Ваш EMAIL>
Subject:Error backup to YANDEX.CLOUD
Content-Type:text/plain; charset=utf-8
Error backup to YANDEX.CLOUD

$DATE_TIME
EOF

else

# Основной блок отвечающий за резервное копирование
# Если нет ощибки ставим метку и запускаем backup

echo '' > /home/backup_check.mark;


# Удаляем файлы с дампами базы оставшиеся от предыдущего backup

/bin/rm -f /backup_db/*


# Делаем дамп всех mysql баз, предполагается что доступ добавлен в файле /root/.my.cnf

DATETIME=`date +%Y-%m-%d_%H-%M-%S`;

`which mysqldump` --quote-names --all-databases | `which gzip` > /backup_db/DB_$DATETIME.sql.gz


# Добавляем данные для отправки в Яндекс.

export PASSPHRASE=<Придумайте пароль для шифрования архива>
export AWS_ACCESS_KEY_ID=<Идентификатор ключа полученный у Яндекса>
export AWS_SECRET_ACCESS_KEY=<Секретный ключ полученный у Яндекса>


# Запускаем duplicity для резервирования необходимых папок на сервере.
# Данная команда будет создавать полный backup раз в месяц и до следующего месяца добавлять инкрементальные к нему
# -- exclude это папки, которые нужно исключить, я исключаю все папки с кешем битрикса
# --include папки которые нужно резервировать в моём случае это:
# - /backup_db
# - /home
# - /etc
# s3://storage.yandexcloud.net/backup , backup это имя созданного выше бакета

# Техническая особенность и значения некоторых параметров:
# Две строки "--exclude='**'" и "/" нужны, чтобы можно было выше оперировать --include и --exclude для разных папок. Эти две строчки сначала добавляют в бэкап весь сервер "/", потом исключают его "--exclude='**'"
# --full-if-older-than='1M' - создавать полную копию каждый месяц
# --volsize='512' - максимальный размер каждого из файлов в бэкапе в мегабайтах
# --log-file='/var/log/duplicity.log' - куда писать лог файл

`which duplicity` 
    --s3-use-ia --s3-european-buckets 
    --s3-use-new-style 
    --s3-use-multiprocessing 
    --s3-multipart-chunk-size='128' 
    --volsize='512' 
    --no-print-statistics 
    --verbosity=0 
    --full-if-older-than='1M' 
    --log-file='/var/log/duplicity.log' 
    --exclude='**/www/bitrix/backup/**' 
    --exclude='**/www/bitrix/cache/**' 
    --exclude='**/www/bitrix/cache_image/**' 
    --exclude='**/www/bitrix/managed_cache/**' 
    --exclude='**/www/bitrix/managed_flags/**' 
    --exclude='**/www/bitrix/stack_cache/**' 
    --exclude='**/www/bitrix/html_pages/*/**' 
    --exclude='**/www/bitrix/tmp/**' 
    --exclude='**/www/upload/tmp/**' 
    --exclude='**/www/upload/resize_cache/**' 
    --include='/backup_db' 
    --include='/home' 
    --include='/etc' 
    --exclude='**' 
    / 
    s3://storage.yandexcloud.net/backup



# Данная команда нужна для чистки.
# Она оставляет 3 последних полных backup и ассоциированных с ними инкрементальных backup.
# Т.о. у меня остаются backup за 3 месяца, т.к. первая команда каждый месяц делает новый полный backup

`which duplicity` remove-all-but-n-full 3 --s3-use-ia --s3-european-buckets --s3-use-new-style --verbosity=0 --force s3://storage.yandexcloud.net/backup



unset PASSPHRASE
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY

# Удаляем метку об идущем backup

/bin/rm -f /home/backup_check.mark;

fi

4. 第一次執行腳本並檢查結果,檔案應該會出現在「Bucket」中。

`which bash` /backup_scripts/backup.sh

使用 Yandex.Cloud 中 1C-Bitrix 上的站點進行增量 VDS 備份

5. 在 cron 中新增一個腳本,讓 root 使用者每天執行 2 次,或依照您需要的頻率執行。

10 4,16 * * * `which bash` /backup_scripts/backup.sh

從 Yandex.Cloud 恢復數據

1. 建立復原資料夾/backup_restore

2. 製作用於復原的 bash 腳本 /backup_scripts/restore.sh

我舉一個最受歡迎的恢復特定文件的例子:

#!`which bash`

export PASSPHRASE=<Пароль для шифрования архива используемый при бэкапе>
export AWS_ACCESS_KEY_ID=<Идентификатор ключа полученный у Яндекса>
export AWS_SECRET_ACCESS_KEY=<Секретный ключ полученный у Яндекса>

# 3 примера, раскомментировать нужный

# Получить статус backup
#`which duplicity` collection-status s3://storage.yandexcloud.net/backup

# Восстановить index.php из корня сайта
#`which duplicity` --file-to-restore='home/bitrix/www/index.php' s3://storage.yandexcloud.net/backup /backup_restore/index.php

# Восстановить index.php из корня сайта 3х дневной давности
#`which duplicity` --time='3D' --file-to-restore='home/bitrix/www/index.php' s3://storage.yandexcloud.net/backup /backup_restore/index.php

unset PASSPHRASE
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY

3. 運行腳本並等待結果。

`which bash` /backup_scripts/backup.sh

在/backup_restore/資料夾中,您將找到先前備份的index.php檔案。

您可以進行更精細的調整以滿足您的需求。

減去重複

口是心非有一個缺點-無法設定頻道使用限制。 對於常規通道,這不會產生問題,但是當使用每天快速充電的受 DDoS 保護的通道時,我希望能夠設定 1-2 兆位元的限制。

作為結論

Yandex.Cloud 或 Amazon S3 中的備份提供了網站和作業系統設定的獨立副本,可從任何其他伺服器或本機進行存取。 此外,此副本在託管控制面板或 Bitrix 管理面板中都不可見,這提供了額外的安全性。

在最壞的情況下,您可以隨時組裝新伺服器並部署網站。 儘管最受歡迎的功能是存取特定日期的文件的能力。

您可以將此技術用於任何引擎上的任何 VDS 或專用伺服器和站點,而不僅僅是 1C-Bitrix。 作業系統也可能不是 CentOS,例如 Ubuntu 或 Debian。

來源: www.habr.com

添加評論