数据分散存储

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

 

转载于:https://my.oschina.net/tsh/blog/1528867

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值