Unraid升级固态硬盘和数据备份方案
最近固态硬盘越来越便宜了,于是打算给我的unraid硬盘升一下级。我目前unraid有6块4T的机械硬盘,其中2块作为校验盘,阵列总容量为16T,已使用7T。某宝上8T的西数企业级固态硬盘价格已经杀到1600左右了,性价比超高,果断入手。
我的规划是将固态硬盘作为一个单独的存储池,将原先阵列里面的数据都迁移到存储池中,同时将所有的共享文件夹存储位置都改为存储池,阵列作为存储池的冷备份,每隔一段时间使用rsync增量备份存储池里面的数据到阵列中。这样既保证了性能又保证了数据安全
上面是我目前的磁盘和共享文件夹状况,除了backup文件夹用于备份数据存放在机械硬盘阵列中,其余的共享文件夹全部都存在固态硬盘存储池里面。将数据迁移到固态硬盘后打开docker管理界面的速度明显提升,系统启动时docker服务的启动速度也非常快,而且由于机械硬盘只作为备份盘使用,平时大部分时候都处于休眠状态,从截图可以看到所有的机械硬盘都在休眠,整个系统非常安静。
数据备份
我这边使用rsync进行数据备份,rsync支持增量备份,通过link-dest参数还可以生成快照,而且因为快照间使用硬链接,所以每次备份时未发生变化的文件不会额外占用空间,但硬链接需要源文件和目标文件处于同一个磁盘分区,所以备份文件夹时需要指定磁盘。下面是我写的备份脚本
#!/bin/bash
SOURCE_BASE="/mnt/sys_cache"
# 第一个参数为目标磁盘 第二个参数为要备份的文件夹 后面的参数为要排除的文件或文件夹
create_snapshot() {
DISK=$1
FOLDER=$2
DEST_BASE="/mnt/$DISK/backup/unraid"
SOURCE="$SOURCE_BASE/$FOLDER"
if [ ! -d "$SOURCE" ]; then
echo "$SOURCE doesn't exist"
return
fi
DEST="$DEST_BASE/$(date +%Y%m%d)/$FOLDER"
echo "try create snapshot,source:$SOURCE target:$DEST"
FOUND=0
CMD="rsync -av"
for latest in $(ls "$DEST_BASE" | grep -E '^[0-9]{8}$' | sort -r); do
LINK_DEST="$DEST_BASE/$latest/$FOLDER"
if [[ "$LINK_DEST" == "$DEST" && -d "$DEST" ]]; then
echo "already sync to $DEST"
return
fi
if [ -d "$LINK_DEST" ]; then
echo "Found older snapshot: $latest"
CMD="$CMD --delete --link-dest=$LINK_DEST"
FOUND=1
break
fi
done
if [ $FOUND -eq 0 ]; then
echo "No older snapshot found,create new one"
fi
shift 2
for exclude in "$@"; do
CMD="$CMD --exclude $exclude"
done
mkdir -p "$DEST"
CMD="$CMD $SOURCE/ $DEST"
echo "$CMD"
eval $CMD
}
# 这里movies 文件夹比较大所以单独备份到disk1 movies之外的其他media文件备份到disk2里面
create_snapshot disk1 media/movies
create_snapshot disk2 media movies
create_snapshot disk3 appdata
create_snapshot disk3 root
create_snapshot disk3 isos
create_snapshot disk3 domains
# docker.img文件内容经常变化,且这个文件比较大(200G),所以最好排除,可针对它单独安排备份计划
create_snapshot disk3 system docker/docker/docker.img
create_snapshot disk4 data
然后通过user script这个插件每周执行脚本一次,这样除非是我的存储池硬盘损坏,同时阵列也损坏2块硬盘以上,否则数据永远不会丢失