数据分散存储

前端之家收集整理的这篇文章主要介绍了数据分散存储前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

将 /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* 分区的个数

猜你在找的Bash相关文章