当前位置: 首页 > 工具软件 > BORG > 使用案例 >

Linux单点备份,基于Borg的Linux 整机备份的单点集群解决方案

仉臻
2023-12-01

Borg Backup 是目前最受欢迎,用户量最大的一个备份支持程序,支持去重和压缩,同时也支持认证加密。其主要目的是提供一个高效而且安全的方法用于数据备份。数据的去重技术用于每日增量备份。它支持Linux、MacOS和BSD,并遵循BSD许可协议。(地址:https://www.borgbackup.org/)。你也可以通过Windows 10 Linux Subsystem、Cygwin、pip+virtualenv在windows中运行它,但是目前尚属于实验性,未经充分测试。

在通常情况下,我们希望备份应该自动执行、快速部署、稳定可靠、低依赖、统一存储,不需要通过命令行或点击某个按钮来执行,不仅能备份一些常规的静态文件,而且能够对系统盘、数据库、应用系统数据等随时会发生变化的动态数据进行备份,必须能够处理备份过程中的数据一致性问题。这些仅靠BorgBackup自身是不能全部完成的。

针对以上目标,我利用BorgBackup搭建了一个备份支持环境,使用一台Linux服务器提供集中的备份存储,在备份源主机利用LVM的快照功能来解决数据一致性问题,通过一个定制的脚本来进行定时自动操作,并通过电子邮件来记录和跟踪备份完成情况,由此,形成了一个相对可靠、便捷的解决方案

主要方法

使用单一主机(BH)负责管理所有的备份仓库,各客户服务器(CH)通过SSH远程连接备份主机,执行备份操作。

BH挂接存储作为备份仓库存储位置,包括WIndows-SMB 、 NFS 、 RAID等

BH配置一个专用的备份账户,比如 backup。CH和BH间使用SSH Key建立连接,连接BH上的专门账户 backup,  并利用 .ssh/authorized_keys 的配置启用 force command 和  borg serve –restrict-to-path , 以实现各CH间的权限各类和各仓库的隔离

每个CH使用一个单独的仓库,或者直接使用一个独立的目录

CH通过systemd配置备份脚本的定时运行

CH启用LVMs,利用LVMs的快照来实现文件系统的平滑静默,快照在备份前建立,备份后删除

BH配置

1.连接和建立备份存储仓库

#最简单的存储方案,直接建立一个目录即可

mkdir /var/borgs

#其它的方式:选择挂接一个cifs(smb)网络存储作为存储,比如Windows的共享文件夹

#之所以这样做的原因是想搭建一个集中的备份存档库,而这个库既要存储Borg的备份,也要存储Windows的 Server backup 备份,

#从而实现一个机房内部的备份集中解决方案

mount.cifs //10.5.183.126/asb/borgs /mnt/borgs -o user=autobackuper,domain=backup,uid=backup

#或者把验证账号信息放到单一的文件中 (/usr/borg/cifs.creds)

mount.cifs //10.5.183.126/asb/borgs /mnt/borgs -o credentials=/usr/borg/cifs.creds,uid=backup

#不同的主机的备份存储部署,建议使用独立仓库方案,即每个主机的备份存储到一个相应的独立仓库中,如下

# borgs/host1

# /host2

# /host3

#然后,需对每个仓库进行初始化

borg init /var/borgs/host1 .....

2.安装Borg。

注意,borgBackup的服务端实际上不需要任何专门的服务端程序,只需要提供SSH接入,事实上BorgBackup只需要能够读取Repo的文件,就可以进行备份操作。

但是在实际使用中,我们需要一起额外的配置来确保安全。在这里,我们在备份服务前创建一个账号 ‘backup’ 专门用来处理备份请求,并利用 “borg serve –restrict-to-path” 作为SSH连接请求的Shell,来确保备份连接只能在指定路径下进行和Borgbackup 相关的操作。

具体来说:复制客户端的root 账号 SSH Key ( id_rsa.pub的内容),添加到/home/backup/.ssh/authorized_keys文件末尾,并进行相应编辑:

#singl line rsa code

command="cd /mnt/borgs/some-borg-repo-dir; borg serve --restrict-to-path /mnt/borgs/some-borg-repo-dir" ssh-rsa AAA***key string*** root@XXX.com

# "borg serve --restrict-to-path " set restrict ssh server for only borg service and only the path

通过上述配置,在CH上以Root用户权限运行Borg时,将可以免除密码连接到 backup@BH ,并对指定的borg-repo-dir进行操作。

3.初始化Borg Repo ,也可以在连入CH时,逐一创建

CH配置

前置条件:已经配置安装了LVMs,并且VG有空余空间用于创建快照,具备Root权限,可以ssh连接BH

**如果正在运行的系统,没有配置LVMs,比较可行的办法是,安装一台全新系统,安装的过程中配置好LVMs,并且务必预留一些空余空间,用于创建快照,然后把旧系统迁移到新系统,可以使用Brog作为迁移工具,也可以简单的冷Copy。

1.配置ssh免密码连接

检查~/.ssh 目录下有没有已经存在的 id_rsa 和 id_rsa.pub ,如果没有可以使用 ssh-keygen -t rsa 生成密匙对,如果有可以直接使用,关于ssh-key的管理,可以查看相关文档,这里不做详细介绍。

复制id_rsa.pub的内容,添加到BH上的( /home/backup/.ssh/authorized_keys),具体见BH部分相关说明。通过上述配置,在CH上以Root用户权限运行Borg时,将可以免除密码连接到 backup@BH ,并对指定的borg-repo-dir进行操作。

2.安装Borg

Borg 的当前版本是 1.1.5, 查看了一下Debian的 Distribution Package 现在还是1.0.9版本,为了使用最新的版本,建议使用Binary方式安装。

#install borg

wget https://github.com/borgbackup/borg/releases/download/1.1.5/borg-linux64

sudo cp borg-linux64 /usr/local/bin/borg

sudo chown root:root /usr/local/bin/borg

sudo chmod 755 /usr/local/bin/borg

3.准备备份脚本

这里的脚本示例仅仅用了说明工作方式,文件末尾部分提供了一个经过优化完善的脚本包,可以直接使用,并根据需要修改。

主要需要的文件有:

borg-em.sh

borg-em-srv.service

borg-em-srv.timer

均放置在/usr/local/bin,也可根据需要放到任意位置

备份脚本文件 borg-em.sh

#!/usr/bin/env bash

# SETUP

# borg config

# export BORG_REPO='ssh://backup@58.57.39.74:10002/./' #SSH use rsakey and borg root path is seting

export BORG_REPO='/mnt/borgs/bsv-debian' #SSH use rsakey

export BORG_PASSPHRASE='password'

# lvm config

LVM_VG="bsv-deian-app-vg"

LVM_LV_ROOT="root"

BOOT_DEVICE="sda1"

# mail config

MAIL_TO=liflei@163.com

############################################

#### Seme options & Functions ####

ARCHIVE_PREFIX="$HOSTNAME-"

ARCHIVE_CRRENT="$ARCHIVE_PREFIX"`date '+%Y-%m-%d-%H%M'`

LVM_LV_SNAP="sn4backup"

LOG_ECHO=""

ec(){

echo -e "$1"

LOG_ECHO="$LOG_ECHO \n $(date '+%Y-%m-%d-%H:%M:%S') : $1"

}

lmail(){

if [ -n "$MAIL_TO" ];then

LOG_MSG=$( journalctl _PID=$ -u borg-em-srv --since -2h --no-pager --output=cat )

# or LOG_MSG=LOG_ECHO

echo 'sending mail....'

sendmail -t <

To: $MAIL_TO

From: BorgEm

Subject:$1

Content-Transfer-Encoding: 8bit

Content-Type: text/plain; charset=UTF-8

$2

###

$LOG_MSG

MAIL

fi

}

#Clean all temprary vars & seting

lclean(){

ec "#CleanAll : Do cleaning snapshot & mount ... "

export BORG_PASSPHRASE=""

if [ -n "$LVM_LV_SNAP" ];then

umount /mnt/$LVM_LV_SNAP/boot

umount /mnt/$LVM_LV_SNAP

rm /mnt/$LVM_LV_SNAP -r

lvremove -f /dev/$LVM_VG/$LVM_LV_SNAP

fi

}

####Script Start####

ec "-----------------------------------------------"

ec "- Borg Backup Start (By ems) -"

ec "Target: $BORG_REPO::$ARCHIVE_CRRENT"

ec "Source: /dev/$LVM_VG/$LVM_LV"

ec " Boot device : $BOOT_DEVICE "

ec " "

ec "#PREPARE:"

ec " DO Create snapshot..."

lvcreate -s -n $LVM_LV_SNAP -L 1G /dev/$LVM_VG/$LVM_LV_ROOT

mkdir /mnt/$LVM_LV_SNAP

mount /dev/$LVM_VG/$LVM_LV_SNAP /mnt/$LVM_LV_SNAP

if [ -n "$BOOT_DEVICE" ];then

ec " Mount BOOT_DEVIE $BOOT_DEVICE "

mount /dev/$BOOT_DEVICE /mnt/$LVM_LV_SNAP/boot

fi

# Backing up the snapshot of root

# Moving into the Snapshot directory, the relative path will be

# backup as root of archive

# -v verbose -s show stats, -p show process, -x one-file-system

cd /mnt/$LVM_LV_SNAP

ec "#Creating borg backup........."

if [ 1 == 1 ];then

borg create -v -s \

--compression lz4 \

--exclude-caches \

--exclude 'home/*/.cache' \

--exclude 'var/cache' \

--exclude 'var/tmp' \

--exclude 'tmp' \

--exclude 'lost+found' \

--exclude 'mnt' \

--exclude '*.iso' \

::$ARCHIVE_CRRENT \

. \

2>&1 # Route stderr

fi

cd - #return orignal path

# If there is an error backing up, reset password envvar and exit

if [ "$?" == "1" ] ; then

ec "###"

ec "BorgBackup Failed : $BORG_REPO::$ARCHIVE_CRRENT"

lclean

lmail "Borg Failed($HOSTNAME)" "Borg Backup Failed!"

exit 1

fi

# Prune the repo of extra backups

borg prune -v --prefix $ARCHIVE_PREFIX \

--keep-hourly=6 \

--keep-daily=7 \

--keep-weekly=4 \

--keep-monthly=6 \

# Include the remaining device capacity in the log

ec "#Disk usage:"

df -hl | grep --color=never /dev/

ec " "

ec "#Backup archives list:"

borg list --format="{name:36} {time}{NEWLINE}"

ec " "

ec "#BorgBackup DONE : $BORG_REPO::$ARCHIVE_CRRENT"

lclean

lmail "Borg Done($HOSTNAME)" "BorgBackup DONE : $HOSTNAME --> $BORG_REPO::$ARCHIVE_CRRENT"

exit 0

borg-em-srv.service

#borg-em-srv.service

[Unit]

Description=Borg Em Backup Service

[Service]

Type=simple

Nice=19

KillMode=none

ExecStart=/usr/local/bin/borg-em.sh

borg-em-srv.timer

#borg-em-srv.timer

[unit]

Description=Borg Em Backup Timer

[Timer]

WakeSystem=false

OnCalendar=*-*-* 03:00:00

RandomizedDelaySec=10min

[Install]

WantedBy=timers.target

4.配置备份服务(systemd)

这篇文档How I Use Borg: Scripts & SystemD比较清晰的说明了使用SystemD部署Brog的一般方法。

#Setup systemd

cd /usr/local/bin

chmod x borg-em.sh

systemctl enable /usr/local/bin/borg-em-srv.service

systemctl enable /usr/local/bin/borg-em-srv.timer

#other tools

systemctl daemon-reload #reload service

systemctl list-timers --all #check timer

systemctl start borg-em-srv #run it manully

systemctl status borg-em-srv #show status

systemctl status borg-em-srv.timer

新的补充 2020-5-5:

为了方便客户机进行自动化备份,编写了一个自动备份脚本(Borgem),支 一个BorgBackup的自动备份辅助脚本,支持虚拟卷(LVM)、快照(Snapshot)、多源配置、定时运行,可以向指定邮箱发送备份完成情况,基本能够满足一般的服务器自动备份需要了,详细链接:https://github.com/EmericLee/borg-em

 类似资料: