我需要每天在「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. 創建一個「雲」。
3. 在「雲」中建立「目錄」。
4. 為「目錄」建立一個「服務帳戶」。
5. 為「服務帳戶」建立金鑰。
6. 保存好鑰匙,以後會需要它們。
7. 為“目錄”建立一個“桶”,檔案將放入其中。
8. 我建議設定一個限制並選擇“冷儲存”。
在伺服器上設定計劃備份
本指南假定您具備基本的管理技能。
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
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