기존에 CentOS에서 piranha-gui를 이용해서 Linux Virtual Server를 구축했었는데, 영 감이 안와서... 검색해서 ipvsadm으로 Virtual Server를 구축했다.

다음의 IP로 가상 서버를 구축한다고 가정한다.
Virutal IP : 192.168.1.10
Real IP : 192.168.1.20
Real IP : 192.168.1.21


일단은, 방금 구축한 경험으로 봤을 때 2대의 실 서버를 로드밸런싱하려면 ipvsadm을 동작시킬 서버까지 포함해서 3대가 있어야 될것 같다.(direct routing 방법 사용시)

Virtual Server
일단은 ipvsadm을 설치한다. 나의 경우는 yum을 이용해서 패키지 설치를 했다.
# yum install ipvsadm
# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
#

요렇게 해서 나오면 정상.

이제 가상 IP를 설정한다. 네트워크 디바이스가 eth0으로 할당되어 있다고할 때, eth0:1의 이름으로 가상 디바이스를 생성한다.
# ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0 up
# ifconfig

이렇게 하면 eth0:1의 이름으로 네트워크 디바이스가 생성되어 있을 것이다. 재부팅되었을 때 자동적으로 올라오게 하기 위해서 다음의 파일을 생성한다.
# vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.10
NETMASK=255.255.255.0


Virtual Server에서는 가상 IP로 접속되는 연결을 실제 서버로 연결해야 하기 때문에 ip_forward 옵션이 활성화 되어 있어야 한다.
수정할 파일 : /etc/sysctl.conf
net.ipv4.ip_forward=1 로 변경한다.
# sysctl -p
혹은
# sysctl -w net.ipv4.ip_forward=1


이제 ipvsadm에 새로운 서비스를 추가한다.
# ipvsadm -A -t 192.168.1.10:80 -s wlc

옵션에 대한 자세한 사항은 ipvsadm --help 명령으로 확인하기 바란다.
위 옵션은 다음의 의미를 갖는다.
-A : 새로운 서비스 추가
-t : tcp 서비스
-s : scheduling. Weighted Least Connection

이제 서비스를 제공하는 실제 서버에 대한 세팅을 수행한다.
필요한 패키지로는 arptables_jf가 있다. 역시 yum으로 설치한다.
# yum install arptables_jf

arptables_jf 패키지를 설치하는 이유는 다음과 같다고 한다(나도 검색해서 찾았음).
Real Server에도 Virtual IP를 설정해 주어야 하는데, 이렇게 되는 경우 클라인트가 가상 IP를 요청했을 때 동일 네트워크에 Virtual IP를 2개 이상 갖고 있기 때문에 경우에 따라서 Real Server에서 응답을 주는 경우가 있다고 한다. 이렇게 되면 로드밸런싱이 되지 않기 때문에 arptables_jf를 이용해서 응답하지 않도록 해줘야 한다.
arptables_jf 설정을 수행한다.
# arptables -A IN -d <virtual_ip> -j DROP
# arptables -A OUT -d <virtual_ip> -j mangle --mangle-ip-s <real_ip>
# service arptables_jf save
# chkconfig arptables_if on

즉, 192.168.1.20에 해당하는 Real Server를 설정한다면,
# arptables -A IN -d 192.168.1.10 -j DROP
# arptables -A OUT -d 192.168.1.10 -j mangle --mangle-ip-s 192.168.1.20

이 된다.

이제, 네트워크 디바이스를 추가한다.
# ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0

이 설정도 부팅시 자동으로 디바이스가 추가되도록 /etc/sysconfig/network-scripts에 파일을 생성한다.
파일 내용은 이미 기록했기때문에 생략한다.

여기가지 설정이 완료되면, 이제 ipvsadm에 real server를 추가해준다.
Virtual Server에서
# ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.20 -g

여기서 -g 옵션은 direct routing으로 추가하겠다는 의미임.

나머지 Real Server도 동일한 작업을 수행한 뒤 마지막으로 ipvsadm 설정을 저장하고, 서비스를 활성화 시켜준다.

# service ipvsadm save
# chkconfig ipvsadm on


이상이다. 근데 꼭 뭘 빼먹은 것 같은 이 기분은 뭘까...
Posted by 봉보리봉봉

댓글을 달아 주세요

  1. 룬룬 2009.08.20 22:07  댓글주소  수정/삭제  댓글쓰기

    오랜만입니다. :)
    여전히 서버 만지시고... 고생 많이 하시네요.

    • 봉봉 2009.08.21 12:09  댓글주소  수정/삭제

      저도 이제 서버 만지기 싫은데 ㅎㅎ 어쩔 수가 없네요.
      밥은 먹고 살아야되니...

      근데, 요즘은 포스팅도 없으시고 많이 바쁘신가봐요?

  2. 룬룬 2009.08.22 01:41  댓글주소  수정/삭제  댓글쓰기

    흐흐, 사실은.
    부끄럽게도 돈을 제때 안내서 도메인이 끊겼습니다. 복구할려니 5만원을 내놓으라길래 그냥 2달 기다리고 완전히 삭제되기를 기다렸어요. 다시 구입한지 이제 3일째네요. ㅎㅎ

    가지고 있는 것들을 조금 정리할까 싶네요. 사진은 따로 사이트(www.sushibar.cc)를 만들었구요. 블로그는 컴퓨터관련과 영화/책, 그리고 단상들을 한꺼번에 잘 모아볼까 싶어요.
    이제는 너무 취미생활에 몰입할 수 있는 여유가 안되어서 차근차근해야할 것 같네요. :)

    계속 찾아뵐게요~

  3. 행인 2009.09.15 21:04  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 봉봉님 블로그보며 lvs를 세팅중인데 궁금한게 있어서 글남깁니다.
    다른 자료를 찾아보면 arptables에 대한 얘기는 없는데 arptables설정을 필수로 해야되는건지요? 그리고 arptables는 가상서버에 설정해 주는것이죠?
    또 두대의 리얼서버가 있다면 mangle --mangle-ip-s를 각각의 리얼서버ip를 대입해야겟고요?
    음 근데 봉봉님의 포스트에보니 가상서버에 # ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0 설정하는게 두번 중복이 되는데 이유가 있나요?

    • 봉봉 2009.09.15 23:11  댓글주소  수정/삭제

      안녕하세요. 반갑습니다.

      일단은 아래 질문부터 답변 드리는 것이 좋을것 같네요.
      ifconfig가 두번 된건... 한번은 virutal server, 한번은 real server에 해주기 때문입니다. 같은 서버에서 2번 수행한 것이 아닙니다. ^^
      만약, Virtual Server 1대, Real Server가 2대가 있다면, 저 명령어는 각각 서버에서 한번씩, 총 3번 설정해줘야 합니다.

      arptables는 위와 같은 이유때문에 Real Server에서 설정해주는 것인데요. 일단 모든 서버의 가상 network device에 ip를 설정해주기 때문에, 동일한 네트웍 상에서 충돌이 나겠죠? 그리고 요청이 가상IP로 들어왔을 때도 문제가 됩니다. 아마 포스트 내용에 포함이 되어 있는 것으로 기억되는데요. Real서버가 가상 IP의 요청을 바로 받아서 처리한다면, LVS가 동작되지 않습니다. 따라서 arptables를 통해서 가상IP를 바로 처리하지 못하도록 설정해 주는 것으로 알고 있습니다. iptables를 이용하는 방법도 있는데, 이런 부분은 redhat이나 centos에 보시면 Linux Virtual Server 매뉴얼이 있을 것입니다. 그 부분을 참조하세요.

  4. 행인 2009.09.15 23:47  댓글주소  수정/삭제  댓글쓰기

    많은 도움이 되었습니다. 감사합니다.

Redhat Linux의 Virtual Server 사용을 하고 있는데, 한가지 문제점이 있다.
Tomcat 환경에서 동작하는 JSP 페이지에서 중간 내용까지 출력 후 버퍼를 flush하는 경우, 버퍼의 내용이 전송되어 클라이언트에 보내지고, 그 부분까지 렌더링이 되어야 하는데(렌더링은 브라우저마다 약간의 차이가 있다. IE/FF의 경우 잘 동작하지만, 크롬에서는 잘 안되는 듯) 웹서버에 직접 접근하여 결과를 보는 경우에는 의도한 대로 동작하지만, Virtual Server를 통해 가상 IP로 접속하는 경우 의도대로 동작되지 않는다.

구성은 LVS 세팅에서 Network 타입은 Direct Routing으로 설정되어 있으며, Real Server는 2개의 노드로 되어 있다.

매뉴얼을 찾아보고, 구글링을 해봐도 Virtual Server에서의 패킷 flush 옵션을 찾을 수 없었으며 결국 LVS 사용을 일단 포기한 상태 ㅠㅠ


버퍼 flush의 경우, 민감하게 생각되지 않을 수 있지만 가능한 부분까지 먼저 출력해줘야 사용자 입장에서는 웹 서비스가 동작하고 있다는 것을 느낄 수 있기에 그냥 넘어갈 수 없는 부분이다.

혹시, 누가 이 문제에 대한 해결책을 줄 수 없을까? ㅠㅠ

관련 포스트 : Apache + Tomcat + mod_jk 연동시 flush 문제

흑... 이 문제가 아닌가보다... Apache 문제인듯 한데... 뭔지 잘 모르겠다 ㅠ.ㅠ
Posted by 봉보리봉봉

댓글을 달아 주세요

  1. chadr 2009.07.08 21:10  댓글주소  수정/삭제  댓글쓰기

    사실 html 렌더링은 웹브라우저 몫이라서 온 데이터까지 렌더링을 할지 안할지는 서버에서 어떻게 할 방법이 없긴 해요.
    하지만 페이지가 꽤나 큰 것이라면 온 만큼 먼저 보여주는 것이 사용자에게는 더 편리하긴 할거 같아요.

    그런데 아예 다르게 생각해보는건 어떨까요? 로딩 메시지를 표시하는거에요.

    일단 간단히 로딩을 출력하는 html을 먼저 보내고 나서 시간이 오래 걸리는 페이지를 후에 한꺼번에 전송하는 것이지요.

    frame이나 iframe을 이용하여 일단 로딩 한다는 메시지를 출력하고 그 안에서 실제로 보여줄 페이지를 백그라운드로 서버에 요청 후 서버에서 연산이 다 끝나면 페이지가 한번에 보이도록 웹브라우저에 한꺼번에 전송하는 것이지요.

    • 봉봉 2009.07.09 15:59  댓글주소  수정/삭제

      내가 보여주고 싶어하는건 메뉴 부분이라서...
      근데, 메뉴 부분을 프레임으로 구성하는 건 좀 아닌것 같고...

      일단은 LVS 안거치고 바로 웹서버로 가게 해놨는데...
      아직 트래픽이 많은건 아니니, 고민해봐야지~~ 의견 고마워~~

RedHat 계열 기준입니다.

Linux에서는 사용자를 id로 확인하기 때문에, 동일한 사용자로 인식시키기 위해서는 user의 id 값이 동일해야 함.
따라서, 사용자 생성시 -u 옵션으로 강제로 uid를 지정하거나 이미 생성된 사용자라면 uid를 강제로 변경해야한다.

사용자 생성
# useradd -u 700 -d /home/bongbong -m bongbong

사용자 수정
# usermod -u 700 bongbong


단, 사용자를 수정한 경우에는 사용자의 home directory를 제외한 나머지 경로들에 대한 uid는 변경되지 않기 때문에 관리자가 직접 변경되지 않은 경로들에 대한 소유권을 다시 변경해 줘야한다.

1. NFS 서버 설정
1) /etc/exports 수정(NFS를 통해서 내보낼 경로를 지정)
# [mount point] [mount option]
/storage    *(rw)

특정, IP만 주려고 하는 경우
/storage    xxx.xxx.xxx.xxx(rw)


rw = read,write       ro = read only

2) /etc/fstab를 수정하여 quota를 줄 partition에 usrquota(혹은 grpquota) 옵션 추가.
만약, /dev/cciss/c0d2p1 파티션에 사용자 쿼터를 주는 경우
/dev/cciss/c0d2p1      /storage       ext3      defaults,usrquota     1 2
와 같이 설정되어야 함.

3) quotacheck
# quotacheck -ugv /storage

를 수행하여 aquota.user 파일 생성(만약, group quota를 설정하였으면 aquota.group, 둘다 설정한 경우 둘다 생성됨)
디스크 용량이 큰 경우 소요 시간이 좀 걸리므로 중단하지 말고 기다려야 함

4) 쿼터 용량 수정(edquota)
# edquota [userid]

여기에서 blocks으로 설정하려고 하는 경우 해당 파티션의 블럭 크기를 알아야 설정하려는 용량대로 설정할 수 있음.

블록 크기를 알아내는 명령은 다음과 같음
# dumpe2fs [device] | grep -i 'Block size'


5) NFS 서비스 시작
# service nfs start(or restart)


2. NFS 클라이언트 설정
# mount -t nfs [ip]:/service/point /mount/point


계정에 대한 쿼타 확인은
# quota [id]

Posted by 봉보리봉봉

댓글을 달아 주세요

  1. 룬룬 2009.02.10 17:12  댓글주소  수정/삭제  댓글쓰기

    /etc/exports 설정 시에
    192.168.0.0/255.255.0.0(rw,.....)
    이런식으로 서브넷을 지정할 수 있답니다. 보안을 위해서~

    더불어, 급기야 GFS를 레드햇 패키지가 아니라 레드햇에서 제공하는 Cluster(CMAN, GFS, GNBD 등등)소스를 가지고 컴파일을 하였습니다. 저걸 하기 위해 커널 컴파일도 직접 해버렸구요. 버젼 차이가 꽤 나던데 과연 효과가 있을런지는 모르겠네요 ^^

    • 봉봉 2009.02.11 09:41  댓글주소  수정/삭제

      네.. 사실 저도 포스트에는 *로 썼지만, 넷마스크 적용해서 옵션을 줬습니다. ㅎㅎ

      GFS를 직접 컴파일 하시다니요~~ 게다가 그걸 하기 위해서 커널 컴파일까지... 요즘은 귀차니즘때문인지 몰라도... 왠만한건 패키지로 설치하는 것을 즐겨하고 있습니다. ㅋ

    • 룬룬 2009.02.11 13:10  댓글주소  수정/삭제

      GFS버젼이 너무 낮아서요. 알고보니 2004년 개발 이후 한번도 안 올린 파일도 있더라구요. 낼름 2008년 개발 소스로 바꾸었습니다. :)
      이렇게까지 했는데 안정성이 떨어지면 그냥 gg치고 NFS를 쓰라고 해야겠네요ㅎㅎ

그동안에 SELinux 설정을 disable시키거나 강제가 아닌 허용 상태로 변경하여 사용하다가 이번에 서버를 다시 설치하고 SELinux 관련 설정을 변경하지 않았더니, 컴파일한 프로그램에서 shared library를 open하지 못하는 현상이 발생했다.
왜 그런지 한참을 해매다가 우연하게 ldd 명령으로 확인하다보니 permission 어쩌고 하는 오류가 발생...
구글링으로 찾아보니, SELinux와 관련된 사항이었다.

이에 기록용으로 shared library에 권한을 주는 명령을 적어본다.

# chcon -t texrel_shlib_t [shared library path]

혹은 다른 자료에서는 이러한 방법이 소개되어 있다. IDL과 관련된 공유 라이브러리에 실행 권한을 주는 방법인데...
# chcon -t texrel_shlib_t /usr/local/rsi/idl_6.3/bin/bin.linux.x86/*.so


하지만, 난 위의 방법을 사용하지 않고, SELinux 모드를 '강제'에서 '허용'으로 변경. 으흐흐
또 다시 수많은 시스템 로그가 쌓이겠지? ㅠ.ㅠ 귀찮다.
Posted by 봉보리봉봉

댓글을 달아 주세요

  1. 룬룬 2008.12.23 21:08  댓글주소  수정/삭제  댓글쓰기

    흐흐 귀찮게요. 그냥 과감히 disable 합시다!

2008.11.22 07:31 일상

개고생...

오늘 저녁부터 완전 개고생 했다.
잦은 정전으로(시스템 입장에서 보면), 결국 리눅스 ext3 파일시스템이 깨졌다.
복구도 안된다. software RAID-1 걸어놓은 것도 하나 소용도 없고, 눈 뜨고 당했다 ㅠ.ㅠ
게다가 2개 정도의 홈페이지가 돌아가고 있었고, 백업도 안되있었다.
홈페이지만 돌아가면 다행인데, 그 서버는 DNS와 Mail 서버까지 깔려있다. 젠장할...
결국 조금 더 좋은 서버로 구성하기로 하고, Windows 2003 Storage 서버 지우고, Cent OS 5.2 설치했다.

겨우 겨우 DNS 설정 끝내고, 집에 자러 들어왔다. 일어나면 또 메일 서버 설치하러 가야대는데... 흑...
날을 꼬박 샜더니, 들어오는 길에 거울 보니깐 얼굴이 쌔까맣게 탔다.

좀 자다가 또 나가야대는데... 자고 일어나면 일하기 싫겠지? 다른 서버였음 쌩까고 날 밝을 때 하는거네... 하필 DNS 있는 날라가서...
더불어, 브릿지 방화벽 서버까지 파일 시스템이 깨지는 바람에 작업이 배가 됐다. 브릿지 방화벽은 대충 이제 설정은 끝난것 같은데.... 살짝 찜찜하네 에휴~~

눈이 감긴다... 이제 자야지...

(근데, 어쩌다 내가 서버 관리를 하게 된거지??)

'일상' 카테고리의 다른 글

단결  (0) 2008.11.26
Mac에 빠지다...  (0) 2008.11.24
개고생...  (2) 2008.11.22
독한놈들...  (0) 2008.11.19
친구  (0) 2008.11.17
뒤늦게 빠진 클래식  (0) 2008.11.17
Posted by 봉보리봉봉

댓글을 달아 주세요

  1. 룬룬 2008.11.22 10:39  댓글주소  수정/삭제  댓글쓰기

    소프트웨어적으로 날아가면 몰라도 전원이 나가면 정말 대책이 없지요. UPS의 축복을 받지 못하셨던 모양이에요. 고생많이하셨습니다. 눈앞이 깜깜하셨던게 절로 느껴지네요.

    • 봉봉 2008.11.22 11:56  댓글주소  수정/삭제

      UPS가 있긴 한데, 서버 수에 비해 UPS가 부족해서 과부하가 났었던 모양입니다. 미러링 했던 시스템은 fsck 몇번 했더니, lost+found하고 이상한 파일 두개만 남게 되더군요... 정말 황당했습니다.

언제부터였는지는 모르겠지만,
/etc/rc.d/init.d/ 에 shell script를 등록한 뒤, chkconfig로 서비스 등록 및 시작을 해도 shutdown(init 0)이나 reboot(init 6)시 시작된 서비스가 중지되지 않는 문제가 생겼다.

영어에 취약한 관계로 정확한 해석은 아니었지만, /var/lock/subsys 위치에 해당 스크립트 이름과 동일한 서비스가 등록되어 있지 않은 경우에 /etc/rc 에서 실행시키지 않는다는 내용을 본것 같다.

따라서, 서비스를 종료시에 꼭 실행시키려면 service 시작시에
/var/lock/subsys/{name} 파일을 만들어줘야 하며,

service 종료시에 해당 파일을 삭제해 줘야한다.

예를 들자면,
#!/bin/bash

start()
{
    [...서비스 시작에 관련된 명령...]
    [ $? -eq 0 ] && touch /var/lock/subsys/{name}
}

stop()
{
    [...서비스 종료에 관련된 명령...]
    [ $? -eq 0 ] && rm -f /var/lock/subsys/{name}
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        exit 1
esac

exit 0

Posted by 봉보리봉봉

댓글을 달아 주세요

이전버튼 1 이전버튼

블로그 이미지
봉보리봉봉

공지사항

Yesterday9
Today7
Total152,037