Welcome 微信登录

首页 / 操作系统 / Linux / 大数据环境下的磁盘脚本思考和实现

需求:考虑一种场景,譬如hdfs中的存储节点(datanode)所需的磁盘,当集群规模变大,假设每个节点有20块盘,集群有200个节点,那么实际物理磁盘为4000块;假设磁盘年故障率为1%,那么,我们是不是可以认为每天都有1块盘出现故障需要更换或修复?现在,为了解放生产力,具体需求是:当发现磁盘故障后,仅需更换物理磁盘,系统级别的操作全部自动化。一些问题思考:1):删除其信息写入fstab的故障盘信息2):新磁盘是不需要分区的,直接格式化3):故障盘如果修复后,又放回来,如果磁盘数据还保留,不得对其格式化4):不能对有分区的盘进行操作5):不能对已挂载的盘操作(考虑故障盘热插拔的情况)6):假设磁盘总数是不确定的,因此挂载点的数量,应当和磁盘数量对应7):不能对有数据的可用进行格式化操作8):对磁盘操作的前提必须是该磁盘是没有分区的,没有数据的9):对已格式化但未挂载,并符合的磁盘做挂载操作10):在为了数据的安全的情况下,欢迎补充…系统环境:CentOS 6.3  x86_64shell代码如下:#!/bin/bash
# Script name: check_disk.sh
# Date & Time: 2013-07-08/21:06:08
# Description:
# Author: MOS
Mlog=${Mlog:-/var/log/check_disk.log}
Date="/bin/date +%k:%M:%S/%Y-%m-%d"
NUL=/dev/null
# 挂载点的父目录,会自动创建
SDIR=/mpoint
# Umt函数:卸载无效磁盘
Umt(){
    Ut=(`grep "$SDIR" /etc/fstab|awk "{print $2}"`)
    Ud=(`grep "$SDIR" /etc/fstab|awk -F" "{print $2}"`)
    for d in ${Ut[@]};do
        if [ -d $d ];then
            #Dk=`df $d|awk "{print $1}"|/usr/bin/tail -1`
            Dk=`mount|grep "$d>"|awk "{print $1}"`
            Ud=`/sbin/blkid $Dk|awk -F" "{print $2}"`
            Td=`grep $d /etc/fstab|awk -F" "{print $2}"`
            [ -b "$Dk" ] && Uft=`/sbin/parted $Dk print|/usr/bin/tail -2|/usr/bin/head -1|awk "{print $5}"`
            Tft=`grep $d /etc/fstab|awk "{print $3}"`
            if [[ $Ud != $Td || $Uft != $Tft ]];then
                /bin/umount $d &> $NUL
                /bin/sed -i "/$d/d" /etc/fstab &> $NUL
            fi   
        fi
    done
    for d in ${Ud[@]};do
        Unull=`/sbin/blkid|grep $d`
        if [[ -z $Unull ]];then
            Mpit=`grep $d /etc/fstab|awk "{print $2}"`
            /bin/umount $Mpit &> $NUL
            /bin/sed -i "/$d/d" /etc/fstab &> $NUL
        fi
    done
}
# Mmu函数:挂载有效磁盘
Mmu(){
    declare -i P=1
    Tb=/etc/fstab
    Ftb(){
        Sft=`/sbin/blkid $Fph|awk -F" "{print $2}"`
        Ft=`grep "<disk$P>" $Tb`
        Gud=`grep "<$Sft>" $Tb`
        [[ -n $Ft ]] && /bin/sed -i "/<disk$P>/"d $Tb
        [[ -n $Gud ]] && /bin/sed -i "/<$Sft>/"d $Tb
    }
    Add(){
        Ef=`/sbin/blkid $Fph`
        [[ -z $Ef ]] && /bin/echo y|/sbin/mkfs.ext4 $Fph &> $NUL
        Uuid=`/sbin/blkid -s UUID $Fph|awk "{print $2}"`
        Fs=`/sbin/blkid -s TYPE $Fph|awk -F" "{print $2}"`
        Fr="defaults,noatime"
        echo -en "$Uuid "$SDIR"/disk$P $Fs $Fr 0 0 " >> $Tb
        /bin/mount -a &> $NUL
        break
    }
    Fe(){
        Mtp=`mount|grep ""$SDIR"/disk$P>"`
        if [[ -n "$Mtp" ]];then
            echo "`$Date` $Mp is used." >> $Mlog
        else
            Ftb
            Add
        fi
    }
    while : ;do
        if [[ -d "$SDIR"/disk$P ]];then
            Fe
        else
            /bin/mkdir -p "$SDIR"/disk$P && Ftb
            Add
        fi
                                                                                                   
        P=P+1
    done
}
# Chech_disk函数:区分磁盘的有效性并调用对应的函数处理
Check_disk(){
    [ -x /sbin/partprobe ] && /sbin/partprobe &> $NUL
    Umt
    /bin/mount -a &> $NUL
    for b in ${Exist[@]};do
        Fph="$Dph$b"
        [[ ! -b "$Fph" ]] && echo "`$Date` $Fph is not block device !!!" >> $Mlog && continue
        CTE=`ls "$Fph"*|/usr/bin/wc -l`
        [[ "$CTE" -ne 1 ]] && echo "`$Date` $Fph mismatches." >> $Mlog && continue
        DFM=`mount|awk "{print $1}"|grep "^$Fph$" 2>$NUL`
        [[ -n "$DFM" ]]  && echo "`$Date` $Fph is used." >> $Mlog && continue
        Ugd=`/sbin/parted $Fph print|/usr/bin/wc -l`
        [[ "$Ugd" -ge 8 && -n "$DFM" ]] && echo "`$Date` parted $Fph >= 8 ." >> $Mlog && continue
        Lvm=`/sbin/blkid $Fph|grep -E "LVM2_member|swap"`
        [[ -n "$Lvm" ]] && echo "`$Date` $Fph is LVM or swap." >> $Mlog && continue
        Fgd=`/sbin/fdisk -l $Fph|/usr/bin/wc -l`
        [[ "$Fgd" -ge 10 ]] && echo "`$Date` fdisk -l $Fph >=10 ." >> $Mlog && continue     
        Mmu
    done
}
if [[ "$1" == "-s" && -z "$2" ]];then
    if [[ -b /dev/cciss/c0d0 ]];then
        Ah=hp
        Dph=/dev/cciss/
        Exist=(`ls /dev/cciss/|grep "^<c0d[0-9][0-9]{0,1}>"`)
        Check_disk
    else
        Exist=(`ls /dev/|grep -E "^<sd[a-z]{0,1}>|^<hd[a-z]{0,1}>|^<vd[a-z]{0,1}>"`)
        Dph=/dev/
        Check_disk
    fi
fi使用时记得加-s,格式: ./check_disk.sh -s,脚本可直接附件下载。免费下载地址在 http://linux.linuxidc.com/用户名与密码都是www.linuxidc.com具体下载目录在 /2013年资料/7月/10日/大数据环境下的磁盘脚本思考和实现Ubuntu下Libvirt 禁用 AppArmor的方法Ubuntu 13.04下正确对U盘进行格式化相关资讯      大数据  磁盘脚本 
  • 14个价值10亿美元以上的大数据公司  (05月12日)
  • Hadoop十岁!Doug Cutting成长史+  (02月16日)
  • 针对2016年大数据发展形势的预测  (01月08日)
  • 大数据时代,穷人更难生活  (04月20日)
  • 解读2015之大数据篇:大数据的黄金  (01月08日)
  • 2016年大数据领域预测:Spark淘汰  (01月07日)
本文评论 查看全部评论 (0)
表情: 姓名: 字数