빅 데이터 환경 에서 의 디스크 스 크 립 트 사고 와 실현

6208 단어 shellcentoshdfsdisk
필요:
hdfs 의 저장 노드 (datanode) 에 필요 한 디스크 와 같은 장면 을 고려 합 니 다. 클 러 스 터 규모 가 커지 면 각 노드 에 20 개의 디스크 가 있 고 클 러 스 터 에 200 개의 노드 가 있다 고 가정 하면 실제 물리 디스크 는 4000 개 입 니 다.디스크 의 연간 고 장 률 이 1% 라 고 가정 하면 우 리 는 매일 1 개의 디스크 가 고장 이 나 면 교체 하거나 복구 해 야 한다 고 생각 할 수 있 습 니까?
현재 생산력 을 해방 시 키 기 위해 구체 적 인 수 요 는 디스크 고장 이 발견 되면 물리 디스크 만 교체 하고 시스템 등급 의 조작 이 모두 자동화 되 어야 한 다 는 것 이다.
몇 가지 문제 에 대해 생각 하 다.
1): fstab 에 기 록 된 고장 난 디스크 정 보 를 삭제 합 니 다.
2): 새 디스크 는 파 티 션 이 필요 없 이 직접 포맷 합 니 다.
3): 고장 난 디스크 를 복구 한 후 다시 놓 습 니 다. 디스크 데이터 가 남아 있 으 면 포맷 할 수 없습니다.
4): 파 티 션 이 있 는 디스크 를 조작 할 수 없습니다.
5): 마 운 트 된 디스크 를 조작 할 수 없습니다. (고장 난 디스크 핫 플러그 의 경우 고려)
6): 디스크 총수 가 불확실 하 다 고 가정 하기 때문에 마 운 트 지점 의 수 는 디스크 수량 과 대응 해 야 합 니 다.
7): 데이터 가 있 는 포맷 작업 을 할 수 없습니다.
8): 디스크 작업 의 전 제 는 이 디스크 가 파 티 션 이 없고 데이터 가 없어 야 합 니 다.
9): 포맷 되 었 으 나 마 운 트 되 지 않 았 으 며 디스크 에 맞 는 마 운 트 작업 을 합 니 다.
10): 데이터 의 안전 을 위해 보충 을 환영 합 니 다...
시스템 환경: CentOS 6.3 x86_64
셸 코드 는 다음 과 같 습 니 다:
#!/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\t"$SDIR"/disk$P\t$Fs\t$Fr\t0 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, 형식:./checkdisk. sh - s, 스 크 립 트 는 첨부 파일 로 다운로드 할 수 있 습 니 다.
글 을 쓰 는 것 이 쉽 지 않 으 니, 그럭저럭 좋다 면 칭찬 을 해라, 고맙다.

좋은 웹페이지 즐겨찾기