Reminiscence

ZFS on Centos6

Linux2013.04.19 11:37

약 30TB 정도의 데이터 백업을 위해 백업 서버를 한대 구성하고 XFS로 포맷하고 데이터를 저장..

파일 개수가 약 1억개 정도 되다보니.. 데이터를 백업 하는 과정에서 계속 XFS 파티션이 깨지는 현상이 발생..

거기다 설상가상으로 서버이전이다 뭐다 해서 용량이 갑자기 10TB가 추가되어버린..

ㅠ_ㅠ 아.. 서버 재구성해야 하나.. 했는데..

 

이번기회에 ZFS로 가보자 하고 결정..

아래 내용은 Onenote에 정리해둔 내용을 옮겨적음..

 

[기본환경]

  • OS : CentOS release 6.3 (Final) 64Bit
  • Kernel : 2.6.32-279.19.1.el6.x86_64

 

[설치]

  • Linux 시스템에서 ZFS 사용하기 위해서는 Native ZFS 이용하는 방법과 ZFS-FUSE 이용하는 방법이 있으며, 각각의 방법에 따라 ZFS 버전이 달라질 있습니다.

 

  1. 먼저 ZFS 구성을 위해 기본적으로 필요한 항목들을 설치 합니다.

Shell > yum install kernel-devel zlib-devel libuuid-devel libblkid-devel libselinux-devel parted lsscsi

Native ZFS Kernel 모듈 방식으로 동작 하기 때문에 위와 같이 kernel-devel 반드시 설치해 주어야 합니다.

 

  1. ZFS패키지인 SPL ZFS 패키지를 다운로드 합니다.

다운로드는 http://www.zfsonlinux.org 에서 받을 있습니다.

 

  1. 다운로드한 패키지의 압축을 해제 설치를 진행 합니다.

# spl install

Shell > tar xvfz spl-0.6.0-rc13.tar.gz

Shell > cd spl-0.6.0-rc13

Shell > ./configure && make rpm

Shell > rpm -Uvh *.x86_64.rpm

Shell > cd ..

 

# zfs install

Shell > tar xvfz zfs-0.6.0-rc13.tar.gz

Shell > cd zfs-0.6.0-rc13

Shell > ./configure && make rpm

Shell> rpm -Uvh *.x86_64.rpm

Shell > cd ..

 

  1. 설치된 zfs 커널 모듈을 인식시켜 줍니다.

Shell > modprobe zfs

Shell > lsmod | grep -i zfs

 

  1. ZFS Spool 생성 합니다.

여기서 ZFS Spool 만들때 단일 디스크를 사용할 것인지 아니면 여러 개의 단일 디스크를 소프트웨어 레이드 방식으로 구성 것인지를 결정 있습니다. ZFS Spool 생성할 때에는 zpool 명령어를 사용하며, 해당 명령어에는 다양한 기능들이 포함되어 있으므로 자세한 내용은 공식 Document 참조하시기 바랍니다.

아래에서는 단일 디스크와 2 디스크를 미러링 하는 방법, 그리고 4 이상의 디스크를 Raid5 구성하는 방법을 설명 하겠습니다.

# EX : zpool [명령어] [옵션] spool

# CREATE EX : zpool create [-f|-n] [-o property=value] [-m mountpoint] pool vdev

 

# /dev/sdb 디스크를 backup 스풀로 생성하며, compress option 기본설정 하도록 한다.

Shell > zpool create -o compress=on backup disk /dev/sdb

 

# /dev/sdb 디스크와 /dev/sdc 디스크를 Backup 스풀로 생성하며, Raid1 구성 Compress option 설정 하도록 한다.

Shell > zpool create -o compress=on backup mirror /dev/sdb /dev/sdc

 

# /dev/sd[b-f] 디스크( 5) 4개를 Raid5 (Parity Disk 1)구성하고 나머지 1개의 디스크는 Hot Spare 구성을 Backup 스풀을 구성하고 /backup_spool 이라는 디렉토리에 마운트 되도록 한다.

Shell > zpool create -m /backup_spool backup raidz1 /dev/sdb /dev/sdc /dev/sdd /dev/sde spare /dev/sdf

 

  1. ZFS Spool ZFS 파일 시스템을 생성 합니다.

ZFS Spool 공간을 이용하여 파일시스템을 생성할 있으며, 각각의 파일시스템은 Spool 적용된 property Option 상속하게 됩니다.

# EX : zfs [명령어] [옵션]

# CREATE EX : zfs create [-p] [-o] filesystem

 

# backup 스풀의 공간을 이용하여 maildata 라는 파일시스템을 생성하고 자동 압축되지 않도록 구성 한다.

Shell > zfs create -o compress=off backup/maildata

 

# Backup 스풀의 공간을 이용하여 mysql 라는 파일시스템을 생성하고 자동압축되지 않으며, /data/mysql 마운트 되도록 한다.

Shell > zfs create -o compress=off -o mountpoint=/data/mysql backup/mysql

 

# Backup 스풀의 공간을 이용하여 user 라는 파일시스템을 생성하고 자동압축되며, 500GB 쿼터를 설정하고 /home/user 디렉토리에 마운트 되도록 한다.

Shell > zfs create -o compress=on -o mountpoint=/home/user -o quota=500GB backup/user

 

ZFS로 구성한 후 Compression 옵션 덕분에 실제 8TB 정도 되는 데이터는 5.6TB 정도로 압축되어 저장되었다는 후문이...

 

ZFS 사랑해요~!

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

Centos 6.4로 OS를 올리고나서 Dell의 OMSA를 설치하고 실행하니 아래와 같이 실패하는 메세지가 나온다..

 # srvadmin-services.sh start 

 Starting Systems Management Device Drivers: 

 Starting dell_rbu:                     [ OK ] 

 Starting ipmi driver:                   [FAILED] 

 Starting Systems Management Device Drivers: 

 Starting dell_rbu: Already started             [ OK ] 

 Starting ipmi driver:                   [FAILED] 

 Starting DSM SA Shared Services:              [ OK ] 

 /var/log/messages reports :  

 instsvcdrv: /etc/rc.d/init.d//dsm_sa_ipmi start command failed with status 1 

 

알고 보니 사전 패키지 설치 과정에서 OpenIPMI가 빠져서 그렇다고 하네...

해결 방법은

# yum -y install OpenIPMI

 

설치하고 재시작 하면 깔끔하게 동작한다.

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

관리중인 10대의 서버중 4대의 서버에서 아래와 같은 에러가 발생하였다. 

/usr/local/bin/rsync: symbol lookup error: /usr/local/bin/rsync: undefined symbol: locale_charset


구글신님께 문의한 결과 일본 블로그중에 유사한 문제를 해결한 내용이 있어 여기에도 기록한다. 

위와 같은 문제가 발생한 경우 Make시 locale_charset에 대한 부분을 참조 할 수 있도록 Makefile에서 아래와 같이 수정 한다. 

Shell# cd /root/rsync-3.0.9

Shell# vi Makefile

------

# Makefile


prefix=/usr/local

datarootdir=${prefix}/share

exec_prefix=${prefix}

bindir=${exec_prefix}/bin

mandir=${datarootdir}/man


#LIBS=-lacl -lpopt -liconv

LIBS=-lacl -lpopt -lcharset -liconv

CC=gcc -std=gnu99

CFLAGS=-g -O2 -DHAVE_CONFIG_H -Wall -W

CPPFLAGS=

EXEEXT=

LDFLAGS=

-------
Shell# make clean
Shell# make && make install


 위와 같이 처리 하니 잘 된다. 


#참조 : http://jptrans.naver.net/webtrans.php/korean/blog.heartofsword.net/archives/562

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

 

multidump.zip

 

제목은 거창한데.. 내용은 별거 없네요.. ^^;

우리 회사에서 운영중인 특정 시스템의 경우 하나의 MySQL DB 서버에 약 2천여개의 DB를 가지고 있습니다.

뭐.. 용량은 서버마다 각각 다르지만, 대략 300GB ~ 500GB 사이를 왔다갔다 하는 서버죠

그런데 이 DB 엔진이 MyISAM으로 되어 있고, 이걸 InnoDB로 변경하면서 서버 교체까지 한번에 진행해야 하는 문제가 생깁니다.

이에 mysqldump로 힘들게 덤프 떠보니 속도가 너무 꽝이네요 .. -ㅠ - ;;

그래서 만들었습니다. 멀티쓰레드 덤프 ㅡ.,ㅡ;;

 

내용은 별거 없고 기본적인 흐름은 다음과 같습니다.

1. 현재 DB 서버 내 전체 데이터베이스 목록을 파일로 만든다.

2. 각 데이터베이스 이름마다 child process를 생성한다.

3. 각 child process에서 백업 작업이 끝나면, 목록에서 자신의 DB 명을 지우고 종료 한다.

 

간단한 스크립트라 공개하기에도 민망한데 필요하신 분들이 혹(?) 계실지도 모르니.. ^^;

 

###############

## multidump.sh  #

###############

## 4core MULTIDUMP SCRIPT

#!/bin/bash

 

remove_list() {

        sed -e "/^${DBNAME}$/d" $DB_LIST_FILE >> TMPFILE1;

        rm -f $DB_LIST_FILE;

        mv TMPFILE1 $DB_LIST_FILE;

echo "$DBNAME" >> RESTORE_LIST;

}

 

export c_black='\033[0m'

export c_boldblack='\033[1;0m'

export c_red='\033[31m'

export c_boldred='\033[1;31m'

export c_green='\033[32m'

export c_boldgreen='\033[1;32m'

export c_yellow='\033[33m'

export c_boldyellow='\033[1;33m'

export c_blue='\033[34m'

export c_boldblue='\033[1;34m'

export c_magenta='\033[35m'

export c_boldmagenta='\033[1;35m'

export c_cyan='\033[36m'

export c_boldcyan='\033[1;36m'

export c_white='\033[37m'

export c_boldwhite='\033[1;37m'

export c_colorend='\033[0m'

 

cecho ()

{

        local default_msg="No Message Passed."

 

        message=${1:-$default_msg}

        color=${2:-black}

 

        case $color in

                black)

                         printf "$c_black" ;;

                boldblack)

                         printf "$c_boldblack" ;;

                green)

                         printf "$c_green" ;;

                boldgreen)

                         printf "$c_boldgreen" ;;

                red)

                         printf "$c_red" ;;

                boldred)

                         printf "$c_boldred" ;;

                yellow)

                         printf "$c_yellow" ;;

                boldyellow)

                         printf "$c_boldyellow" ;;

                blue)

                         printf "$c_blue" ;;

                boldblue)

                         printf "$c_boldblue" ;;

                magenta)

                         printf "$c_magenta" ;;

                boldmagenta)

                         printf "$c_boldmagenta" ;;

                cyan)

                         printf "$c_cyan" ;;

                boldcyan)

                         printf "$c_boldcyan" ;;

                white)

                         printf "$c_white" ;;

                boldwhite)

                        printf "$c_boldwhite" ;;

        esac

        printf "%s$c_colorend\n" "$message"

}

 

dump_list(){

 

DISABLE_DB_LIST="information_schema mysql performance_schema sysbench test vsftp webmail webmail_admin wordlist";

 

mysql -h $DUMP_HOST -Ne "show databases" >> db_list;

for INF in $DISABLE_DB_LIST;do

        sed -e "/^${INF}$/d" db_list >> tmp_list

        rm -f db_list;

        mv tmp_list db_list;

done;

 

}

 

# 임시 파일 생성

cecho "==== Temporary file create ====" boldgreen

echo "1" >> PROC_TMP1;

echo "1" >> PROC_TMP2;

echo "1" >> PROC_TMP3;

echo "1" >> PROC_TMP4;

 

CNT="0"

DB_LIST_FILE="./db_list"

CHILD_BIN="./multidump_child.sh"

DUMP_HOST="192.168.1.15"

S_DATE=`date +"%Y-%m-%d %H:%M:%S"`

 

# DB LIST OUTPUT

cecho "==== START TIME : ${S_DATE} ====" boldgreen

cecho "==== Backup target listing ====" boldgreen

dump_list;

TOTAL_RUN=`cat $DB_LIST_FILE | wc -l`

sleep 1;

 

 

while (( `cat $DB_LIST_FILE | wc -l` ))

do

        sleep 1;

 

        DBNAME=`tail -n 1 $DB_LIST_FILE`;

 

        if [ -s PROC_TMP1 ]

        then

                cat /dev/null > PROC_TMP1;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP1 $DUMP_HOST &

                remove_list

        elif [ -s PROC_TMP2 ]

        then

                cat /dev/null > PROC_TMP2;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP2 $DUMP_HOST &

                remove_list

        elif [ -s PROC_TMP3 ]

        then

                cat /dev/null > PROC_TMP3;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP3 $DUMP_HOST &

                remove_list

        elif [ -s PROC_TMP4 ]

        then

                cat /dev/null > PROC_TMP4;

                CNT=`expr $CNT + 1`

                cecho "  * ($CNT/$TOTAL_RUN) : $DBNAME DUMP 실행 " boldblue

                $CHILD_BIN $DBNAME PROC_TMP4 $DUMP_HOST &

                remove_list

        else

                cecho "==== 현재 모든 프로세스가 처리 중입니다. ====" boldwhite

        fi

done

 

rm -f PROC_TMP*;

 

cecho "==== START TIME : ${S_DATE} ====" boldgreen

S_DATE=`date +"%Y-%m-%d %H:%M:%S"`

cecho "==== END TIME : ${S_DATE} ====" boldgreen

 

여기까지가 메인 스크립트이구요.. 아래는 multidump_child.sh 스크립트 입니다.

####################

## multidump_child.sh ##

####################

## MULTIDUMP CHILD SCRIPT

## Dump 하면서 sed를 이용해 백업되는 데이터의 Engine Type을 InnoDB로 변경한다.

 

#!/bin/bash

/usr/local/mysql/bin/mysqldump -h $3 --force -c $1 | sed "s/ENGINE=MyISAM/ENGINE=InnoDB/g" >> /backup/MULTI_DUMP/${1}_dump.sql

echo "$1" >> $2;

 

지금도 가끔 쓰는 스크립트지만, 그때 그때 수정해서 필요한 부분에 맞게 맞춰서 쓰고 있구요..

그냥 mysqldump로 뜨는것보단 한 2배에서 2.5배 정도 빠르네요..

Sed로 치환처리 안하면 좀 더 빠릅니다. ;;

 

위에는 4개 스레드를 기본으로 한건데 8개로 하면 쪼~~~~끔 더 빨라지니.. 필요에 따라.. =_=;;;

저작자 표시
신고

댓글 0개가 달렸습니다.

Centos6를 설치 하고 나서 ifconfig 명령어를 실행하니 Ethernet Device가 흔히 보던 eth0 또는 eth1이 아닌 경우가 있을 수 있습니다. Centos 5 까지는 이러한 문제가 없었는데 갑자기 6로 올라와서 이러한 문제가 생기니 당황스럽기도하고 막막한 느낌이 듭니다. 하하.. =ㅠ = ..


특히 회사에서 개발한 솔루션에는 Ethernet Device를 체크하는 솔루션이 있는데 이게 동작을 안하네요 허허.. -ㅠ - 


그럼 처리 방법을 보죠.. 


먼저 아래 명령어를 실행해서 biosdevname 이라는 패키지가 설치되어 있는지 확인 합니다. 


Shell > rpm -qa | grep biosdevname

biosdevname-0.3.11-1.el6.x86_64


오오.. 하나 깔려 있네요 -ㅠ- 

이놈이 하는 역활은 Bios상에 지정되어 있는 각 Device들에 대한 명칭을 그대로 OS 상에서 쓸 수 있도록 처리하는 놈입니다. 뭐.. 환경에 따라 또는 사람들에 따라 필요로 하는 기능일 수 있겠지만, 익숙하지 않은걸 받아들이는건 쉽지 않군요.. =ㅠ = 


이제 biosdevname 이라는 패키지를 삭제 하고 /etc/udev/rules.d 로 넘어가서 70-persistent-net.rules 파일이 있는지 확인 합니다. 

Shell > rpm -e biosdevname-0.3.11-1.el6.x86_64

Shell > cd /etc/udev/rules.d/

Shell > ls -al 70-persistent-net.rules

Shell >

네.. 그렇군요. 아무것도 없네요 -ㅠ - .. 


70-persistent-net.rules  파일이 있다면, 해당 파일을 열어서 수정하면 되지만, 없다면, 새로 만들어 주세요. 전 파일이 없었기 때문에 아래와 같이 파일을 만들었습니다. 


SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:19:a1:80:df", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"


SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:22:19:a1:80:e1", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"


여기서 값에 대한 부분은 간단 합니다. ATTR{address}== 라고 되어 있는 부분 뒤에 해당 Ethernet Device의 Mac 주소를 적어주시고, Mac 주소에 해당하는 디바이스가 어떤 이름으로 지정 될 것인지 NAME= 다음에 넣어 주시면 됩니다. 위의 내용을 풀자면


MAC Address가 00:22:19:a1:80:df 인 Ethernet Device는 eth0로 설정 한 것이고, 

MAC Address가 00:22:19:a1:80:e1 인 Ethernet Device는 eth1로 설정 한 것 입니다.


위와 같이 설정을 끝냈다면, 저장 한 후 이더넷 디바이스 설정 파일을 열어야 하지만, 우리는 귀찮으니까 이미 생성되어 있는 파일을 쓰도록 하죠.  

Shell > cd /etc/sysconfig/network-scripts

Shell > mv ifcfg-em1 ifcfg-eth0

Shell > mv ifcfg-em2 ifcfg-eth1

Shell > vi ifcfg-eth0

Shell > vi ifcfg-eth1

위와 같이 ifcfg-eth0, ifcfg-eth1 파일을 열어 DEVICE=em1 이라고 되어 있는 부분을 DEVICE=eth0 과 같이 수정 합니다. 물론 자신의 서버에 맞는 설정을 해야겠죠? =ㅠ = 


모든 설정이 완료 되었으면, 서버 재부팅 한번 시원하게 해주시고, 로그인 하셔서 ifconfig를 실행해 보세요. 

그럼 익숙했던 eth0과 eth1이 나를 반기고 있을것입니다. 


참고로 제가 겪은 서버는 Dell 서버에서 위와 같은 현상을 겪었습니다..


[참고]

http://fedoraproject.org/wiki/Features/ConsistentNetworkDeviceNaming

https://www.centos.org/modules/newbb/viewtopic.php?topic_id=35597

http://linux.dell.com/files/whitepapers/consistent_network_device_naming_in_linux.pdf

http://grokbase.com/t/centos/centos/12149ksj15/no-eth0-on-centos-6-2

저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

 

가끔씩 fstab 잘못된 Block Device 정보를 등록하거나, 디스크가 Lable 또는 정보가 변경되어 정상적인 부팅이 되지 않고 Repair Filesystem 모드로 들어가는 경우가 생긴다.

물론 fstab 수정하고 재부팅하면 빠르게 처리가 되지만, Repair Filesystem 상태에서는 Read Only 상태로 마운트가 되기 때문에 수정이 불가능 하다.


이때
아래와 같이 최상위 Root 파티션인 / Read/Write 모드로 다시 마운트 하면 쉽게 수정하여 재부팅을 진행 있다.

 

Repair filesystem # mount -w -o remount /
Repair filesystem
# vi /etc/fstab
--- fstab 내용 수정 후 ---
Repair filesystem
# reboot
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

- 사건 개요 
  > Centos 6 설치 이후 lftp를 사용하려 하자, 아래와 같은 에러메세지가 출력되면서 동작을 하지 않음.
/usr/lib64/libgnutls.so.26: symbol gcry_cipher_setkey, version GCRYPT_1.2 not defined in file libgcrypt.so.11 with link time reference

     구글이랑 여러군데 검색을 해본 결과 gcrypt 설치 이후 라이브러리 경로가 /usr/lib으로 되어 있을 수 있으나, ldconfig에 해당 내용을 추가하면 될 것이라는 내용을 확인.
이에 아래와 같이 /etc/ld.so.conf에 추가
/usr/lib
/usr/lib64
추가 후 lftp 실행 결과 정상 동작...

이거 하나 해결하려고 2시간 삽질.... 아놔...
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

회사에서 운영중인 서버중 MySQL을 사용하는 DB 서버만 대략 100여대 가량이다 보니(다 제각각이에요 ㅠ_ㅠ) 가끔씩 오류로 인해 서버가 다운되거나 MySQL 데몬이 죽었을때 테이블이 깨지는 경우가 발생 하곤 합니다. ㅠ _ㅠ

하나하나 찾아서 Repair 하기도 어렵기도 하고 귀찮기도 하고.. 그냥 간단하게 스크립트로 Check 해서 결과를 리턴하는 형식의 스크립트를 짰는데..

결과를 보는게 조금 엉성 하네요.. =ㅠ = ;; 꾸미는데에는 재주가 없어서;; ㅎㅎ

필요하신 분들은 가져가셔서 사용하시고.. 퍼가실때에는 출처만 밝혀주세요 +_+ ㅎㅎ

더보기



이게.. VI에서 탭으로 구분해 놓은걸 그대로 가져왔더니 이렇게 올라가네요;; =ㅠ=;;
저작자 표시 비영리
신고

댓글 0개가 달렸습니다.

잘 동작하던 메일 스팸서버의 DB가 갑자기 데이터가 쌓이지 않기 시작 했다..
원인은 알 수 없었고.. 이리 저리 뒤져보았더니 MySQL의 경우 Linux 시스템에 따라 MyISAM 엔진이 저장할 수 있는 최대 데테이블 데이터 사이즈가 지정되어 있다고 한다.

Operating System File-size Limit
Win32 w/ FAT/FAT32 2GB/4GB
Win32 w/ NTFS 2TB (possibly larger)
Linux 2.2-Intel 32-bit 2GB (LFS: 4GB)
Linux 2.4+ (using ext3 file system) 4TB
Solaris 9/10 16TB
MacOS X w/ HFS+ 2TB
NetWare w/NSS file system 8TB

- 관련 문서 : http://dev.mysql.com/doc/refman/5.0/en/full-table.html

우선 서버에서 해당 테이블의 상태를 확인하기 위해 아래와 같이 명령어를 실행..
mysql> show table status like 'mail_content' \G
*************************** 1. row ***************************
           Name: mail_content
         Engine: MyISAM
        Version: 9
     Row_format: Dynamic
           Rows: 548249
 Avg_row_length: 7833
    Data_length: 4294967280
Max_data_length: 4294967295
   Index_length: 40935424
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2008-04-24 11:31:01
    Update_time: 2010-07-27 11:53:13
     Check_time: 2010-05-12 09:50:03
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

상태를 보니 이미 MAX_data_Length값인 4G까지 모두 사용중이네요..
20G 까지 테이블 사이즈를 늘리기 위해 다음 명령어를 실행...하였습니다.

 alter table mail_content MAX_ROWS=1000000 AVG_ROW_LENGTH=21474;

위의 내용을 보면 최대 행(Row)는 1,000,000개 까지 저장 가능하도록 하였고, 각 행의 평균 길이는 21474 Byte로 지정 하였습니다.
이 명령어는 다음 내용을 참조하여 생성 하였습니다.

MySQL의 MyISAM 스토리지 엔진의 데이터 테이블의 전체 크기는 [SHOW variables]명령을 통해 확인 할 수 있는 myisam_data_pointer_size 라는 값에 의하여 결정 된다고 합니다.

이 myisam_data_pointer_size는 최소 2부터 최대 7까지 값을 가지고 있으며, 이 값을 참조하여 다음 공식에 의해 테이블 사이즈의 최대 크기를 지정 할 수 있습니다.

[ 2 ^ ( myisam_data_pointer_size * 8 ) - 1 byte ]

위의 공식을 따라 기본값인 4를 대입하면 4Gbyte까지 생성 할 수 있음을 알 수 있습니다.
문제는 이 값을 임의로 수정하는 것이 아닌 Alter Table 또는 Create Table 명령을 사용할 때 MAX_ROWS 와 AVG_ROW_LENGTH 값을 변경 하면 myisam_data_pointer_size 값이 자동으로 변경 된다는 것 입니다.

그럼 제가 원하는 20G 사이즈의 테이블을 생성하기 위해서는 어떻게 해야 할까요?
다음의 3가지 방식의 명령 모두 20G 사이즈의 테이블로 수정하는 명령입니다.

명령 1 : ALTER TABLE mail_content MAX_ROWS=1 AVG_ROW_LENGTH=21474836480
명령 2 : ALTER TABLE mail_content MAX_ROWS=20971520 AVG_ROW_LENGTH=1024
명령 3 : ALTER TABLE mail_content MAX_ROWS=1000000 AVG_ROW_LENGTH=21474

위의 3가지 방식의 명령 모두 20G 사이즈의 테이블을 생성하는 명령어 입니다.
자신이 원하는 방식을 이용하면 되겠지만, 테이블의 내용에 따라서 이 명령어를 다르게 적용하여 주는 것이 더 좋습니다.

예를 들어 테이블의 데이터 타입이 BLOB 또는 TEXT 일 경우에는 MAX_ROWS를 일정 수치이하로 줄이고 AVG_ROW_LENGTH 값을 늘려주는 것이 좋습니다.
다른 예로 테이블의 데이터 타입이 Integer 또는 Boolean과 같은 데이터 사이즈가 작은 경우라면 MAX_ROWS값을 늘리고 AVG_ROW_LENGTH값을 줄이는 것이 더 효과적입니다.


결론을 내리자면, 테이블의 사이즈를 변경하는 것은 ALTER TABLE 또는 CREATE TABLE 명령을 이용하여 MAX_ROWS값과 AVG_ROW_LENGTH값을 주게되면 myisam_data_pointer_size 값이 변경되면서 자연적으로 적용되게 됩니다.

만약 ALTER TABLE을 사용하는 경우라면 테이블 사이즈에 따라 또는 테이블 내 행의 개수에 따라 작업 시간을 조율 하시기 바랍니다.

저같은 경우 4G의 데이터 파일을 ALTER TABLE로 수정하는데 약 12분 가량 소요되었고, 그 시간동안에는 해당 테이블에 Lock이 걸리게 되므로, 약간의 장애 유사한 현상이 발생했었습니다. ^^*

참고 하세요~ =ㅁ=

신고

댓글 0개가 달렸습니다.

OMSA란?
Dell 에서 제공하는 서버 관리용 오픈 매니저 프로그램 입니다. Dell 서버의 경우 OMSA 를 설치하여 현재 하드웨어 자원의 상태를 모니터링 할 수 있으며, SNMP와 연계하여 상세 정보들을 가져올 수가 있습니다. 특히, Perc 카드를 이용하여 Raid구성을 하였다면, 구성한 Raid에 문제는 없는지를 한눈에 쉽게 알아 볼 수 있기 때문에 서버 관리자에게는 특히나 유용 합니다.

기존의 OMSA는 소스 다운로드 후 컴파일 및 기타 여러 프로그램을 추가적으로 설치해야 하며, Centos의 경우 RHEL에 해당하는 Release 네임이 아닐경우 정상적인 설치가 되지 않는 경우가 발생하여, 설치가 굉장히 까다롭고 힘들었었습니다.

하지만, 여기서 소개할 방법은 Yum을 이용해 Dell의 repository 내용을 다운로드 받아 설치하는 방식으로 위의 참조 URL을 통해 내용을 확인 할 수 있습니다.

- Quick Install -

1. Root 계정 로그인
2. 명령어 실행 : $wget -q -O - http://linux.dell.com/repo/hardware/latest/bootstrap.cgi | bash
3. 명령어 실행 : $yum install srvadmin-all
4. 접속 계정 설정 : vi /etc/osarolemap
5. Root 로그인 할 경우 접속 계정에 대한 수정 없이 다음 명령어 실행
$/opt/dell/srvadmin/omil/supportscripts/srvadmin-services.sh start
6. IPTABLE 사용시 IPTABLE에 1311 포트 오픈
7. https://IP_ADDRESS:1311/ 접속

- Truble Shooting -

Q : yum install svradmin-all을 했는데 아무런 패키지도 다운받지 않고, 실행도 되지 않습니다.
A : Yum의 Cache로 인해 막혀 있어서 그렇습니다. 다음 명령어를 실행하면 정상적으로 처리가 가능 합니다.
    $yum clean all
    $vi /etc/yum.conf
    파일의 내용중 plugins=1이 있는지 확인, 없으면, 추가
    $yum install svradmin-all

Q : Centos 3.x버전이라 yum 버전이 낮습니다. 어떻게 해야 하나요?
A : Yum 버전을 2.4.x버전이상 사용하시면 가능 합니다. yum 데몬을 업데이트 하시거나, Rpm으로 받으셔서 재설치 하세요.

Q : Centos가 아닌 SLES, RHEL3 또는 4입니다 어떻게 해야 하나요?
A : 참조 URL을 보시면, 각 OS별 설치법이 나와 있습니다. 참고하여 설치하시면 됩니다.

참조 URL : http://linux.dell.com/wiki/index.php/Repository/hardware

신고

댓글 0개가 달렸습니다.

고객 서버에 mod_jk를 설치...

내 서버와 테스트 서버에서는 아무런 문제 없이 설치가 되길래..
그냥 스크립트 만들어서 당직자한테 실행하라고 했는데..

새벽2시.. 에러난다는 전화..
컴파일을 아무리 해도 문제 발생... 확인해 보니 mod_jk.so 파일 생성이 안됨..
make시 에러는

Warning! dlname not found in /usr/local/apache/modules/mod_jk.la

라고 출력..
make install해도.. mod_jk.so파일이 없으므로, 당연 인스톨 안됨..

이럴때는 2가지 방법으로 해결.
1. tomcat.apache.org에 들어가서 jk_connector를 바이너리버전으로 다운로드
 > 이미 so파일로 되어 있으므로, 각 플랫폼에 맞는놈으로 다운받은뒤, mod_jk.so로 파일명 변경 후 apache의 module 폴더에 그대로 옮겨줌..

2. 난 죽어도 컴파일 해서 해야 겠다.
 > libtool의 버전 확인 필요.
 $ /usr/local/apache/build/libtool --version  ( Apache 경로는 각자 경로대로 )
 위와 같이 명령어 실행해서 출력되는 버전이 1.5.22 이면 정상 컴파일 가능하지만, 만약 1.5.20 이면..
 컴파일 안되고, 위와 같은 에러 출력함...
 $ rpm -qa | grep libtool 실행
 설치된 패키지가 1.5.22면 /usr/bin/libtool 의 버전이 1.5.22 이므로, /usr/local/apache/build/libtool을 지우고 심볼릭 링크 연결.
 $ rm -f /usr/local/apache/build/libtool
 $ ln -s /usr/bin/libtool /usr/local/apache/build/libtool
 이후 다시 make 실행하면 정상적으로 컴파일 가능.

설치는 다 되었는데.. 문제는 mod_jk.so를 연동했음에도 불구하고 소스가 출력되는 문제 발생...
아놔.. 사람 갖고 장난치나.. ;; -_-..;
결국은 내 실수로 삽질을 한 꼴이 되어버린...

문제 해결을 위해 다음과 같이 접근.

phpinfo();로 apache Handler 및 Module Load 상태 확인.
mod_jk.so가 보인다면, 모듈은 로드 된 것이므로, 설정 내용 확인.
설정 내용중 worker를 woker라고 오타 내진 않았는지.. 사소한 오타로 인해 안될 수 있으므로, 재 확인 필요.
properties 파일과 mod_jk.conf 파일을 따로 만들어서 Include 함..

== mod_jk.conf ==
LoadModule jk_module          modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /jsp-examples/*.jsp default
JkMount /servlets-examples/* default
JkMount /*.jsp default

Alias /jsp-examples "/usr/local/tomcat/webapps/examples/jsp"
<Directory "/usr/local/tomcat/webapps/examples/jsp">
        Options Indexes +FollowSymLinks
        AllowOverride None
        Allow From all
</Directory>

Alias /servlets-examples "/usr/local/tomcat/webapps/examples/servlets"
<Directory "/usr/local/tomcat/webapps/examples/servlets">
        Options Indexes +FollowSymLinks
        AllowOverride None
        Allow from all
</Directory>

== worker.properties ==
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/java

worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13

파일 생성이 완료되면, httpd.conf를 열어 include함..
> Include conf/mod_jk.conf

VirtualHost 설정을 한 경우에는 해당 VirtualHost 안에 JkMount 설정.
Ex)
<VirtualHost *:80>
DocumentRoot /usr/local/tomcat/webapps/ROOT/
ServerName test.lovetonight.net
JkMount /*.jsp ajp13
JkMount /webapps/*.jsp ajp13
JkMount /ROOT/* ajp13
</VirtualHost>

위와 같이 했는데도 안된다면....
역시 방법은 구글링뿐..

5시간 삽질 종료.. 아흐..

신고

'Linux > Apache' 카테고리의 다른 글

mod_jk 컴파일 에러 처리... -_-  (0) 2009.04.11
apache - Suexec 와 Cgi 파일간의 관  (0) 2006.11.13
[Kisa] Mod_Security Manual  (0) 2006.10.09

댓글 0개가 달렸습니다.

mount시 nfs 화일 시스템 타입에 대한 옵션

텍스트 옵션을 쓰지 않고 nfs 화일 시스템은 struct nfs_mount_data 자료형의 바이너리 옵션을 필요로 한다. mount 프로그램은 `tag=value'라는 형식으로 처리하고 위에서 말한 구조체에 값을 설정한다. rsize=n, wsize=n, timeo=n, retrans=n, acregmin=n, acregmax=n, acdirmin=n, acdirmax=n, actimeo=n, retry=n, port=n, mountport=n, mounthost=name, mountprog=n, mountvers=n, nfsprog=n, nfsvers=n, namlen=n. The option addr=n 을 쓸 수는 있으나 무시된다. 다음의 논리적 참거짓(Boolean) 옵션 앞에는 no 를 붙일 수 있다: bg, fg, soft, hard, intr, posix, cto, ac, tcp, udp. 세부 사항은 nfs(5) 을 보기 바란다.

특별히 유용한 옵션으로는 다음이 있다.

rsize=8192,wsize=8192
기본 버터 사이트 1024 보다는 더 빠른 접속 속도를 위해 필요하다.
soft
이 옵션을 주면 일정 시간 동안 반응하지 않는 nfs 서버에 대해서는 타임아웃이 걸리도록 하며 그렇지 않은 경우 계속 마운트하고 있는다. 시간 설정은 timeo=time 을 사용한다. 이 옵션은 때때로 여러분의 nfs 서버
가 반응하지 않거나 서버로부터 화일을 받는 도중 리부팅할 때 사용된다



출처 : KLDP Man 한글화 페이지 (http://man.kldp.org/wiki/ManPage/mount.8)
신고

댓글 0개가 달렸습니다.

서버 관리를 해주다보면.. 참 어처구니 없는 일들이 많이 일어난다.

오늘의 문제는 다음과 같은 에러가 뜨는것.....

/usr/bin/perl: relocation error: /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/DBD/mysql/mysql.so: symbol mysql_init, version libmysqlclient_15 not defined in file libmysqlclient.so.15 with link time reference

구글을 찾아보고 이것 저것 해봤는데..
고객 서버의 구성이 참 독특하기도 하고, 서비스가 죽으면 안된다는 이야기...
원인은 perl에서 MySQL커넥션을 위한 라이브러리를 찾을때 MySQL의 라이브러리를 찾지 못한다는 이야기 인데..

머 에러야 그렇다고 치자..

원인을 찾아 /usr/lib/mysql을 찾았는데..
엥?? 폴더가 없다.. -_-;;;;;;

어쩌라는거지;;;

ldd /usr/bin/mysqlbinlog를 해보니 libmysqlclient.so.15의 경로가 들어가 있어야 할 자리에.. 아무런 내용이 없다.

쩝.. 그냥 mysql을 재설치 하면 간단하게 해결이 되겠지만..
고객은 MySQL서버가 단 1초라도 죽으면 안된단다 ..

그래서 내린 특단의 야매 조치..

동일한 OS를 Virtual Box를 이용해 설치 한 뒤 동일한 버전의 MySQL을 설치.
그리고 /usr/lib에 있는 mysql 폴더를 통째로 압축.
문제의 서버로 압축파일 전송 후 압축 해제.

perl 에러가 발생한 파일을 다시 확인해 보니 정상 동작.

후...... /usr/lib/mysql을 왜 지웠을까.. '_' ?
신고

댓글 0개가 달렸습니다.

Updating RedHat/CentOS Kickstart with new drivers

At work, we have a kickstart setup we have been using for a couple years now, with probably 150 servers out in the field based on this install. Our distro of choice is CentOS, a RedHat clone, and we are at version 4.4. This is out of date now, but it still works great for our needs, as security fixes are regularly back-ported. It would also be a major pain to upgrade our existing installations, and/or support multiple OS versions.

On to the issue at hand: we recently received some new server models that we’ll be supporting, both which have hardware not supported in CentOS 4.4. One machine has a RealTek RTL-8110 ethernet chip, and the other as a 3Ware 9650SE Raid controller. As I later discovered, this presented two unique problems with the kickstart - without the proper storage controller driver, one server didn’t find any disk to install on, and without the proper network driver, the other server couldn’t even connect to our kickstart server at all.

So, as you might guess, there are two different solutions here. The more elegant is for the storage controller, we can create a driver disk with the proper drivers, and make it available on the network during the kickstart. The network driver is more difficult - we need to insert it into the initrd image we provide for PXE boot, and then somehow copy it over after installation (this is an updated driver, r8169.ko, that exists in CentOS 4.4 but doesn’t support our newer card).

Adding a RAID/Storage Card Driver to the Kickstart:
For the driver disk, things are especially easy, as 3Ware provides a driver-disk compatible download, although not yet in the correct format to share over the network.

The driver provided by 3ware (http://www.3ware.com/KB/article.aspx?id=14546 ) includes the following:

-rwxr-xr-x 1 stever stever 66B Oct 10 2007 modinfo*
-rwxr-xr-x 1 stever stever 249B Oct 10 2007 modules.alias*
-rw-r--r-- 1 stever stever 377K Oct 10 2007 modules.cgz
-rwxr-xr-x 1 stever stever 28B Oct 10 2007 modules.dep*
-rwxr-xr-x 1 stever stever 463B Oct 10 2007 modules.pcimap*
-rwxr-xr-x 1 stever stever 192B Oct 10 2007 pci.ids*
-rwxr-xr-x 1 stever stever 339B Oct 10 2007 pcitable*
-rwxr-xr-x 1 stever stever 37B Oct 10 2007 rhdd*

This is all you need on a driver disk, so all you need to do is create a disk image, and copy these files over:

#Create a blank, 20MB image
dd if=/dev/zero of=/root/driverdisk.img bs=1M count=2
#Format the image with ext2
mkfs -t ext2 -q /root/driverdisk.img
#mount it and copy the files over
mount -o loop /root/driverdisk.img /mnt/tmp
cp /root/3ware/* /mnt/tmp/
umount /mnt/tmp

Now, copy the image over to somewhere accesible on kickstart, and update your ks.cfg with the following:
driverdisk --source=nfs:servername:/vol/kickstart/CentOS-4.4-x86/drivers/driverdisk.img

On network kickstart, anaconda should grab the driver, load it, and proceed normally. This should work for any non-network-card driver you need.

Adding a Network Card Driver to the Kickstart:
This is considerably more arduous, but not too difficult with the magic commands. Much of the information here comes from my friend Steve, www.kehlet.cx.

There is no nicely package/built driver provided by RealTek, just some source code with instructions for compiling.

I downloaded the driver here:
http://wiki.centos.org/HardwareList/RealTekr1000
After untar’ing unzip’ing, I ran make with the default settings, and manually changed the kernel version to build a smp driver as well (assuming you’re building on a single-cpu system):

[root@lb4 ~]# cd r8169-6.006.00/
[root@lb4 ~]# make
[root@lb4 ~]# mv src/r8169.ko r8169.ko.2.6.9-42.EL
[root@lb4 ~]# make clean
(edit src/Makefile, change the line “KVER := $(shell uname -r)” to “KVER := 2.6.9-42.ELsmp”
[root@lb4 ~]# make
[root@lb4 ~]# mv src/r8169.ko r8169.ko.2.6.9-42.ELsmp

Now you should have two .ko module files compatible with the different kernels - we need to get these inserted into the initrd image. An initrd is basically a disk image that holds various drivers and programs needed to pre-boot your system. It is usually a gzipped disk image file, so its nothing too special. Basically, you need to unzip & mount the initrd image, gunzip/cpio the modules.cgz file in the initrd, make the required changes, and package everything back up.

Here’s those steps in gory detail:

mkdir /mnt/tmp
mkdir /mnt/initrd
mkdir /var/tmp/work
mkdir /var/tmp/work/bootnet
mkdir /var/tmp/work/drvnet
gunzip < /root/tftpboot/initrd.img > /var/tmp/work/bootnet/initrd.img.ungzipped
cd /var/tmp/work/bootnet/
mount -o loop initrd.img.ungzipped /mnt/tmp2
cd /mnt/tmp2/modules
gunzip < modules.cgz | (cd /var/tmp/work/bootnet && cpio -idv)
cd /var/tmp/work/bootnet/2.6.9-42.EL/i686
cp /root/r8169-6.006.00/r8169.ko.2.6.9-42.EL r8169.ko
cd /var/tmp/work/bootnet/2.6.9-42.ELsmp/i686
cp /root/r8169-6.006.00/r8169.ko.2.6.9-42.ELsmp r8169.ko
cd /var/tmp/work/bootnet/
find 2.6.9-42.EL | cpio -ov -H crc | gzip > /mnt/tmp2/modules/modules.cgz
#edit /mnt/initrd/modules/pcitable
#add this:
0×10ec 0×8167 “r8169″ “Realtek|RTL-8110 Gigabit Ethernet”
umount /mnt/initrd
gzip < initrd.img.ungzipped > initrd.r8169.img

I had to boot up DSL, run lspci & lspci -n, to get the ID to put in here - third column has 10ec:8167, which is what we need
https://lists.sdsc.edu/pipermail/npaci-rocks-discussion/2007-September/027142.html

So now you can replace your initrd.img with the one you just created. The kickstart should work fine now, but upon reboot, the system will not be able to find the right driver. After the kickstart, you need to copy over the .ko files to the appropriate directories - we added a line in our post-install script to do this for us, it simply copies the .ko file to the appropriate directory (/lib/modules/`uname -r`/kernel/drivers/net/)

Hopefully this is useful to someone, I couldn’t find a good, comprehensive guide on how to do this, I had to pull data from a bunch of different sources.


Source : http://www.ruizs.org/archives/49     thx~ : ) steve~

신고

댓글 0개가 달렸습니다.

Open Storage란?

Linux2009.02.15 04:01
오픈스토리지가 무엇인가에 대해 사장님께서 내주신 질문..

아무리 뒤져봐도 오픈 스토리지가 무엇인가에 대한 정의는 없고... 단시 Sun에서 Open Solaris를 이용한 OpenStorage를 내놓았고, 이 시스템이 주목받고 있다는 내용만 가득..

NetAPPs와 Sun의 오픈스토리지 커뮤니티, 구글링등을 통해 결론지은 내용은 아래의 내용이었다..

오픈 스토리지는 개방형 아키텍쳐를 이용하여 저렴한 비용으로 네트워크 파일 시스템을 구성하고, 정교한 오픈 소스 스토리지 소프트웨어를 사용 할 수 있는 시스템을 이야기 합니다.

예전의 스토리지 시장은 각 벤더사들의 독점적 지배구조로 구성되어 왔으며, 이는 폐쇄적인 소트리지 구성에 따라, 자신들의 디스크, 메모리, CPU가 아니면 적용 할 수 없도록 하였었습니다.

이를 오픈 스토리지가 나오게 되면서, 각 벤더사에서는 오픈소스기반인 리눅스 또는 솔라리스의 기반하에 오픈 소스 스토리지 소프트웨어를 개발 및 지원하였고, 이를 이용해 OSN과 같은 형식의 스토리지 망을 구성 할 수 있게 되었습니다.

정리하자면, 각 벤더사에서 내놓는 컴포넌트와 관리 프로그램이 아닌 오픈 소스기반의 시스템위에 오픈 소스 기반의 소프트웨어를 올려 스토리지 시스템을 저렴한 비용으로 구축하는게 아닐까 합니다.

오픈형 소프트웨어로는 openfiler같은 소프트웨어가 있을 수 있으며, 오픈형 OS는 리눅스와 오픈 솔라리스가 있고, 현재는 Sun의 오픈 솔라리스를 이용한 오픈 스토리지가 주목을 받고 있습니다.


예를들어 설명하자면, Dell 의 이퀄로직 이라는 스토리지는 수천만원을 호가 하는 고급형 스토리지 이다.
이 스토리지는 자체적으로 리플리케이션, 자동화된 복구 기능, 여러가지 관리의 편의성을 중시한 매니지먼트 툴을 제공한다.

이 스토리지가 다른 저가 스토리지와 하드웨어적으로 약간의 차이는 있겠지만, 그 차이가 수천만원의 가격을 좌지우지 할 만큼의 값어치가 있지는 않다.

그렇다는건 결국 스토리지를 관리하는 소프트웨어의 지원여부에 따라 가격이 달라 질 수 있다는 것이다.

이를 오픈 소스 소프트웨어를 이용한 오픈 스토리지 구성을 한다면, 저렴한 비용으로, 고가의 스토리지 못지 않은 네트워크 저장소를 구성 할 수 있는 것 이다.

-------------------------------------------------------------------------

실제 정의된 내용과 내가 알고 있는 내용이 다를 수 있습니다.
정확한 정의에 대해 아시는 분께서는 알려주시면 감사하겠습니다. (^^) (__) (^^)
 
신고

댓글 0개가 달렸습니다.