数据分散存储

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

将 /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}

  1. #!/bin/sh
  2.  
  3. arr=()
  4.  
  5. #创建目录 /data?/id/1..1000
  6. function credir()
  7. {
  8. dir=$1 #/data* 目录
  9. bappid=$2 #开始的appid
  10. eappid=$3 #结束的appid
  11.  
  12. while [ $bappid -le $eappid ]
  13. do
  14. mkdir -p $dir/invoice/$bappid/
  15. mkdir -p $dir/invoice/$bappid/{1..1000}
  16. bappid=$(( $bappid + 1 ))
  17. done
  18. }
  19.  
  20. #拆分(打散目录)
  21. function dsplit()
  22. {
  23. bappid=$1 #开始的appid
  24. eappid=$2 #结束的appid
  25.  
  26. dat_num=$3 #/data* 挂载点数
  27. uin_num=1000 #appid 目录下的子目录数[1..999]
  28. lns_num=`expr $uin_num / $dat_num` #子目录的平均软链接
  29. echo ${arr[*]:1}
  30.  
  31. while [ $bappid -le $eappid ]
  32. do
  33. buin=$lns_num
  34. for var in ${arr[*]:1}
  35. do
  36. k=1
  37. while [ $k -le $lns_num ]
  38. do
  39. if [ $buin -lt $uin_num ]; then
  40. rm /data/invoice/$bappid/$buin -f -r
  41. ln -s $var/invoice/$bappid/$buin /data/invoice/$bappid/$buin
  42. buin=$(( $buin + 1 ))
  43. fi
  44. k=$(( $k + 1 ))
  45. done
  46. done
  47. bappid=$(( $bappid + 1 ))
  48. done
  49. }
  50.  
  51. #获取所有的 /data? 挂载点
  52. function StartInit()
  53. {
  54. f=0
  55. mt=`df -h | awk '{print $6}'`
  56. for d in ${mt}
  57. do
  58. if [[ $d =~ "data" ]]
  59. then
  60. arr[$f]=$d
  61. f=$(( $f + 1 ))
  62. fi
  63. done
  64. }
  65.  
  66. # 1. 参数检查
  67. if [ "$#" != "2" ]; then
  68. echo "Usage: $0 begin_appid end_appid"
  69. echo "e.g. : $0 1 15"
  70. exit 1;
  71. fi
  72.  
  73. # 2. 入口开始,获取所有的 /data* 挂载点,# 并且保存在 arr 数组内
  74. StartInit
  75.  
  76. #测试数据
  77. #arr[1]=/data1
  78. #arr[2]=/data2
  79.  
  80. #获取arr数组长度
  81. len=${#arr[@]}
  82.  
  83. #3. 开始在各个 /data* 下面创建目录结构
  84. for var in ${arr[*]}
  85. do
  86. credir $var $1 $2 #参数1 分区目录,参数2 开始的appid,参数3 结束的appid
  87. done
  88.  
  89. #4. 开启拆分处理
  90. dsplit $1 $2 $len #参数1 开始的appid,参数2 结束的appid,参数3 /data* 分区的个数

猜你在找的Bash相关文章