使用 Yandex.Cloud 中 1C-Bitrix 上的站点进行增量 VDS 备份

我有必要每天将站点备份到 2C-Bitrix:站点管理 1 次(文件和 mysql 数据库)并存储 90 天的更改历史记录。

该站点位于运行 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. 为“Catalog”创建一个“Bucket”,文件将落入其中。
使用 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. 第一次运行脚本并检查结果,文件应该出现在存储桶中。

`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。

来源: habr.com

添加评论