文章详情页 您现在的位置是:网站首页>文章详情

git仓库的大文件处理

图片丢失 Jeyrce.Lu 发表于:2021年4月1日 22:02 分类:【服务器 2494次阅读

在中大型项目安装部署过程中,我们一定会面临将多个服务进行集成,最后生成一整套构建、部署的问题,大文件的处理方法是一件比较头疼的事情。一般有这样一些处理方法

(1)在打包时实时构建,大致需要经历:拉取代码 → 准备构建环境 → 构建可执行文件或链接库。

(2)将大文件存放在git仓库中,每次代码开发完成build一个二进制文件和代码存放在一起。实际上git官方也提供了git-lfs用来解决这个问题,但体验了一下并不好用。

(3)将大文件存放在文件服务器,打包时从文件服务器拉取。实际上和git-lfs的道理是相通的。

在以上方法中,(1)缺点其一是打包平台需要准备好构建环境,可能需要一些依赖问题;其二是项目构建时间可能会比较长,相邻打包行为之间的一些资源无法有效利用。(2)缺点在于git的提交机制将会对数据全量备份副本,而二进制文件的压缩比又非常低,提交量上来之后一个仓库马上会变得十分巨大,同步仓库速度越来越慢,浪费大量空间。方案(3)则是一种更为合适的方式,本文主要介绍通过 `nextcloud` 私有云盘+代码仓库链接记录的最佳实践。

硬件准备

- 3.6 T SATA 盘一块

- 740大盘托架

- DELL440服务器一台

(1)加载磁盘

磁盘插入插槽等亮起之后,我们可以通过qdatamgr media show 查看到磁盘,但是它处于热备状态 `Unconfigured(good), Spun Up ` 并不能直接使用,需要attach一下

qdatamgr  media attach_disk -s P0B00S01
 
# 执行后将看到磁盘状态变为 Online, SPun Up
# 此时通过lsblk也能查看到多了一块 sde盘,划分了sde1、sde2、sde3三个分区

(2)创建pv、vg、lv

# 在sde3分区上创建一个pv
pvcreate  /dev/sde3
 
# 在pv上划出一个名叫Mirrors的vg
vgcreate Mirrors /dev/sde3
 
# 在Mirrors这个vg上占用所有空余空间创建一个名叫mirrors的lv
lvcreate -n mirrors -l 100%FREE Mirrors

(3)将lv挂载到专用目录

# vim /etc/fstable 在文件末尾追加
 
# mirrors 挂载
/dev/mapper/Mirrors-mirrors /mirrors                 ext4   defaults        0 0
 
# 尝试挂载发现文件系统类型不对
mount -a
#mount -a
mount: wrong fs type, bad option, bad superblock on /dev/mapper/Mirrors-mirrors,
       missing codepage or helper program, or other error
 
       In some cases useful info is found in syslog - try
       dmesg | tail or so.
 
# 格式化lv的文件系统
mkfs -t ext4 /dev/mapper/Mirrors-mirrors
 
# 重新moun,成功
mount -a
 
# 已经可以在df中查看到挂载点
df -h
# /dev/mapper/Mirrors-mirrors  3.6T   89M  3.4T   1% /mirrors

安装nextcloud

(1)安装docker、docker-compose(略)

(2)安装配置nextcloud

# 拉取最新镜像
docker pull nextcloud
 
# 编写docker-compose.yml
#cat docker-compose.yml
version: '2.3'
services:
  nextcloud:
    image: nextcloud
    container_name: nextcloud
    restart: always
    volumes:
      - /mirrors/tmp:/tmp
      - /mirrors/file:/var/www/html
    dns_search: .
    logging:
      driver: json-file
      options:
        max-size: 20M
        max-file: "20"
    ports:
      - 9090:80
 
# 启动服务
docker-compose -f docker-compose.yml up -d

(3)初始化

此时打开浏览器查看9090端口发现已经可以看到初始化页面了,创建一个管理员账户即可开始使用。

注意其中支持sqlite、mysql、postgree三种数据库,在docker内部访问mysql需要特殊设置,因此直接使用sqlite。

文件的上传下载

(1)上传

使用上面(3)中创建的用户登录nextcloud后,可以在用户目录下创建文件夹或上传文件,也可直接拖动文件到页面上。

nextclou-upload.png

(2)下载

在nextcloud页面上,我们可以通过下载按钮,或者通过分享来提供一个下载地址,但是通过这样的接口功能来下载,我们需要构造携带有身份信息的请求。而为了更方便的下载,我们可以直接将文件目录挂载到nginx的autoindex索引。

nextcloud-autoindex.png

# 忽略一些干扰文件的索引
fancyindex_ignore nextcloud.db;
fancyindex_ignore nextcloud.log;
fancyindex_ignore index.html.default;
fancyindex_ignore appdata_oce746a3ysjj;
fancyindex_ignore files_external;
fancyindex_ignore cache;
fancyindex_ignore files_trashbin;
fancyindex_ignore Talk;
fancyindex_ignore Documents;
fancyindex_ignore Nextcloud Manual.pdf;
fancyindex_ignore Nextcloud intro.mp4;
fancyindex_ignore Nextcloud.png;
fancyindex_ignore Photos;
fancyindex_ignore Reasons to use Nextcloud.pdf;
 
include fancyindex.conf;     
 
# nginx 文件目录索引
location /download {
        alias /mirrors/file/data/;
        charset utf-8;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
}

(3)引用方法

我们在仓库中并不保存二进制文件本身,而是保留一个名为 {文件名}.link 的文本文件,文本内容简单的记录了二进制文件的下载链接。此外提供了一个nextcloud.sh的shell脚本,用于递归找到当前目录下所有.link文件,并从链接恢复为去除.link后缀的文件。

jeeyshe@jeeyshe-PC:~/Code/go/src/xoo.site/ido.go/file$ tree
.
├── bin
│   ├── prometheus.link
│   └── test
│       └── alertmanager.link
├── nextcloud.sh
├── phoenix.link
└── write.go
 
2 directories, 5 files
 
# 其中 .link 文件的内容如下所示
http://mirrors.woqutech.com/download/qdata/files/bin/phoenix/phoenix-1.3.0-test-x86

nextcloud.sh脚本

#!/usr/bin/env bash
# Created by Jeyrce.Lu 2021-04-01 14:01
 
force=false # 是否覆盖本地文件
clean=false # 是否清理.link文件
count=0
 
while getopts :fc x; do
    case $x in
        f)
            # echo "恢复时强制覆盖本地文件"
            force=true
            ;;
        c)
            # echo "恢复完成后清理.link文件"
            clean=true
            ;;
        *)
          break
          ;;
    esac
done
 
function lookupFile {
    file=$1
    force=$2
    clean=$3
    if test -f ${file}; then
        if [[ $file == *.link ]]; then
            target=${file%.link}
            if ([ ! -f $target ] && [ ! -d $target ]) || [ "$force" = true ]; then
                # 从文件服务器拉取恢复为大文件
                echo [${target##*/}] "从远端恢复文件"
                wget -i $file -O $target --timeout 60 > /dev/null 2>&1
                let count++
            else
                echo [${target##*/}] "文件(夹)已存在"
            fi
            if [ "$clean" = true ]; then
                echo [${file##*/}] "将被清理"
                rm -f $file
            fi
        fi
    elif test -d ${file}; then
        for subfile in $1/*; do
            lookupFile ${subfile} ${force} ${clean} #递归遍历
        done
    fi
}
 
lookupFile `pwd` ${force} ${clean}
 
echo $count "条记录已恢复"
 
exit 0

使用示例:

# 自动查找项目下所有 .link 文件并尝试从远端恢复
# 如果本地已经存在 {name}.link 对应的{name}文件或文件夹,则不从远端恢复
# 恢复完成后保留 .link 文件
bash nextcloud.sh
 
# 无论本地是否已存在,都从远端获取文件覆盖本地
bash nextcloud.sh -f
 
# 从远端恢复完大文件后,删除对应的.link
bash nextclou.sh -c

我们执行nextcloud.sh脚本之后,可以成功获取对应的大文件。后续还可以添加一下例如校验md5值,恢复文件后修改权限等功能(当前恢复出来的文件会丢失rwx权限,需要在正式部署某一步骤赋予权限)。


版权声明 本文属于本站  原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: http://blog.lujianxin.com/x/art/4i8smdx9ijyi

文章评论区

作者名片

图片丢失
  • 作者昵称:Jeyrce.Lu
  • 原创文章:61篇
  • 转载文章:3篇
  • 加入本站:2004天

站点信息

  • 运行天数:2005天
  • 累计访问:164169人次
  • 今日访问:0人次
  • 原创文章:69篇
  • 转载文章:4篇
  • 微信公众号:第一时间获取更新信息