Unraid升级固态硬盘和数据备份方案

最近固态硬盘越来越便宜了,于是打算给我的unraid硬盘升一下级。我目前unraid有6块4T的机械硬盘,其中2块作为校验盘,阵列总容量为16T,已使用7T。某宝上8T的西数企业级固态硬盘价格已经杀到1600左右了,性价比超高,果断入手。

我的规划是将固态硬盘作为一个单独的存储池,将原先阵列里面的数据都迁移到存储池中,同时将所有的共享文件夹存储位置都改为存储池,阵列作为存储池的冷备份,每隔一段时间使用rsync增量备份存储池里面的数据到阵列中。这样既保证了性能又保证了数据安全

img.png img.png 上面是我目前的磁盘和共享文件夹状况,除了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块硬盘以上,否则数据永远不会丢失