加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数据分散存储

发布时间:2020-12-15 16:23:43 所属栏目:安全 来源:网络整理
导读:将 /data/invoice/1~n/{1..1000} 均衡分部数据到其他的 /dataN 分区 假设有 /data/invoice/1/{1..1000} // 1 千个文件夹 另有分区目录/data1 /data2 那么脚本设计的数据存放为: /data/invoice/1/{1..333} 实际存放数据在 /data/invoice/1/{1..333} /data/inv

将 /data/invoice/1~n/{1..1000} 均衡分部数据到其他的 /dataN 分区

假设有 /data/invoice/1/{1..1000} // 1 千个文件夹

另有分区目录/data1 /data2

那么脚本设计的数据存放为:

/data/invoice/1/{1..333} 实际存放数据在 /data/invoice/1/{1..333}

/data/invoice/1/{334..666} 实际存放数据在 /data1/invoice/1/{334..666}

/data/invoice/1/{667..999} 实际存放数据在 /data2/invoice/1/{667..999}

#!/bin/sh

arr=()

#创建目录 /data?/id/1..1000
function credir()
{
   dir=$1    #/data* 目录
   bappid=$2 #开始的appid
   eappid=$3 #结束的appid

   while [ $bappid -le $eappid ]
   do
     mkdir -p $dir/invoice/$bappid/
     mkdir -p $dir/invoice/$bappid/{1..1000}    
     bappid=$(( $bappid + 1 ))
   done
}

#拆分(打散目录)
function dsplit()
{
   bappid=$1 #开始的appid
   eappid=$2 #结束的appid

   dat_num=$3      #/data* 挂载点数 
   uin_num=1000     #appid 目录下的子目录数[1..999]
   lns_num=`expr $uin_num / $dat_num`  #子目录的平均软链接数
    
   echo ${arr[*]:1}

   while [ $bappid -le $eappid ]
   do
        buin=$lns_num
        for var in ${arr[*]:1}
        do
            k=1
            while [ $k -le $lns_num ]
            do
                if [ $buin -lt $uin_num ]; then
                    rm /data/invoice/$bappid/$buin -f -r
                    ln -s $var/invoice/$bappid/$buin /data/invoice/$bappid/$buin
                    buin=$(( $buin + 1 ))
                fi
                k=$(( $k + 1 ))
            done
        done
        bappid=$(( $bappid + 1 ))
    done
}

#获取所有的 /data? 挂载点
function StartInit()
{
    f=0
    mt=`df -h | awk '{print $6}'`
    for d in ${mt}
    do
        if [[ $d =~ "data" ]]  
        then
            arr[$f]=$d
            f=$(( $f + 1 ))
        fi
    done
}

# 1. 参数检查
if [ "$#" != "2" ]; then
    echo "Usage: $0 begin_appid end_appid"
    echo "e.g. : $0 1 15"
    exit 1;
fi

# 2. 入口开始,获取所有的 /data* 挂载点,#   并且保存在 arr 数组内
StartInit

#测试数据
#arr[1]=/data1
#arr[2]=/data2

#获取arr数组长度
len=${#arr[@]}

#3. 开始在各个 /data* 下面创建目录结构
for var in ${arr[*]}
do
    credir $var $1 $2 #参数1 分区目录,参数2 开始的appid,参数3 结束的appid
done

#4. 开启拆分处理
dsplit $1 $2 $len #参数1 开始的appid,参数2 结束的appid,参数3 /data* 分区的个数

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读