본문 바로가기
운영체제 (LNX,WIN)

리눅스 클러스터링 (LVS)

by 날으는물고기 2009. 2. 2.

리눅스 클러스터링 (LVS)

1  [리눅스클러스터링]LVS강좌시작에 앞서

 

lvs 란 무엇인가..
lvs 란 Linux Virtual Server 의 약자 입니다.
이 강좌에서는 lvs 의 기본적인 개념에 대해서는 다루지 않고 있습니다. 기본적으로 리눅스클러스터링에 대한 개념을 이해하시고 싶으시면

인용:
http://kldp.org/Translations/html/Virtual_Server-KLDP/index.htm


로 접속하셔서 자세한 내용을 찾아 보시기 바랍니다.

이곳의 강좌는 lvs 에 대한 기본적인 개념이 있다는 전제하에 실제적인 설치에 관하여 강좌를 하게됩니다.
  
강좌의 순서는 아래와 같습니다.

인용:
1. Install Mon
Mon 은 lvs 클러스터 설정시 일정 시간마다 실제 각 리얼노드들의 상태를 파악하여 마스터노드에 보고하는 역할을 합니다.

1)설치하기 전에 [ 2000. 12. 29 ]
2)perl 모듈 설치하기 [ 2000. 12. 29 ]
3)mon 서버 설치하고 테스트 하기 [ 2000. 12. 30 ]


인용:
2. ipvsadm
ipvsadm 은 버츄얼IP 로 오는 모든 패킷의 할로를 실제서버에게로 보내주는 역할을 합니다. 실질적인 라우팅을 해 주는 프로그램이죠.

1)설치하기 [ 2000. 12. 30]
2)명령어 사용 방법 [ 2000. 12. 30 ]



인용:
3. 로드발란싱
지금 한것만 가지고 로드발랑(?)신에 도전해 봅시다!

1)시스템을 로드발란서로 설정하기 [ 2001. 1. 3 ]
2)테스트 하기 [ 2001. 1. 5 ]


의 순서로 진행될것입니다.

 

 

2  [리눅스클러스터링]LVS강좌 1.Install Mon

 

1. 설치하기 전에..

길지도 않고 짧지도 않은 여정을 함게 하실 순간이 얼마 남지 않았네요. 지금부터 클러스터링을 위한 프로그램들을 하나하나 설치해 나갈것 입니다.
   기본적으로 필요한 프로그램 몇가지를 가지고 말이죠. 우선 아래 나열된 프로그램들을 좀 구해 주세요.


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


Mon 프로그램.
   http://www.kernel.org/software/mon/ 에서 mon 최신 버전을 다운로드 받습니다.이 글을 쓰는 현재 0.38.20 이 최신 버전 일겁니다.


Mon 프로그램 설치를 위한 perl 모듈
   우선 중요한건 mon 데몬은 perl 버전 5.005_01 보다 높은 버전이어야지 작동이 된다는 것입니다.
   확인되고 난 후에는 아래와 같은 모듈들을 다운 받아 주세요. perl 모듈은 가깝게는 ftp://ftp.bora.net 의 /pub/CPAN 디렉토리 에서 다운 받으실 수 있습니다.


-Time::Period
-Time::HiRes
-Convert::BER
-Mon::*


아참...fping 정도는 기본으로 깔아 두시면 나중에 유용하게 쓰입니다. ^_^


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


ipvsadm
    
http://www.linuxvirtualserver.org/ 에 가셔서 ipvsdm 의 최신 커널 패치와 ipvsadm 소스를 받아 오세요. 커널의 버전에 따라 패치가 틀립니다.



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


kernel 2.2.12 이상.
   저는 커널 버전 2.2.16 으로 했습니다. 굳이 옛날버전에서 테스트 해 볼 필요가 있겠는가 싶어 레드햇 7.0 을 설치 했더니 커널패치는 기본적으로 되어 있더군요.
%참고 .. 몇몇 분들은 이 위의 말에 대해 잘못 이해하시는것 같아 알려드립니다. 커널패치가 되어 있다는 말은 ipvsadm 모듈의 패치가 되어 있다는 말입니다. 커널 컴파일을 안해도 된다는 말이 아닙니다.(2001. 5. 30)

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


Linux OS
전 레뎃 7.0 가지고 했습니다. 다른거는 테스트 안 해 봤는데 혹 해보신 분들 있으면 자료좀 공유 하지여...^^, 레뎃 7.0 은 ipvsadm 을 위한 커널 패치가 되어 있습니다.


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


시스템 ( 이것저것 해보고 싶으면 기본 4대 정도 - 여기선 4대를 기본으로 해서 강좌를 합니다. 그러나 시스템 사정이 아쉬운 분들께서는 두대만 가지고 따라 하셔도 무방합니다.)
   기본적으로 이더넷 카드는 두개를 꽂아 주세요.
   허브 1개
   리얼 아이피 5개


   아이피는 아래처럼 할당 해 주세요.

   리얼 아이피 할당이 123.123.123.1~5 번 까지 일때 (1번은 VIP 로 남겨 두세요. 나중에 사용 합니다.)

master node
slave node
이더넷 0번 : 123.123.123.2 이더넷 0번 : 123.123.123.3
이더넷 1번 : 192.168.0.1 이더넷 1번 : 192.168.0.2
real node1
real node2
이더넷 0번 : 123.123.123.4 이더넷 0번 : 123.123.123.5
이더넷 1번 : 192.168.0.3 이더넷 1번 : 192.168.0.4


자아..여기까지 준비가 되셨다면 다음장에서는 설치를 시작하도록 하겠습니다.

 

 

3  [리눅스클러스터링]LVS강좌 2.Perl 모듈 설치하기

 

2. perl 모듈 설치하기

perl 모듈을 설치하기에 앞서 우선 리눅스박스에 깔려 있는 C 헤더 파일들을 이용해 perl 에 대응하는 헤더화일을 생성해야 합니다.


아래와 같이 해 주세요.


인용:
#cd /usr/include
#h2ph *.h sys/*.h asm/*.h



그러면 xxx.h -> xxx.ph 등의 리스트가 주루륵 떨어 지면서 변환되는것이 보입니다.


되셨으면 이제는 진짜로 펄 모듈들을 설치할 차례 입니다.
모든 펄 모듈의 설치법은 동일합니다.
예로 Time-Hires의 설치는 아래와 같습니다.


인용:
#tar xvfz Time-Hires-xx.xx.tar.gz <--상응하는 버전
#cd Time-Hires-xx.xx
#perl Makefile.PL
#make
#make test
#make install



별다른 에러 메세지 없이 설치가 되었을 것입니다.
간혹 설치가 되지 않을 수도 있는데 에러 메세지를 잘 보시면 의존성을 얘기해주는 메세지가 있습니다. 이 모듈을 설치하기 위해선 우선 이 모듈이 필요하다..라는등의..

같은 방법으로 Time::Period , Convert::BER, Mon::* 도 설치 하시기 바랍니다.

perl 모듈은 ftp 서버의 modules/by-authors/id/T/TR/TROCKIJ/ 로 가면 모두 있다고 설치 메뉴얼에 나와 있군요...

지금까지 설치한 모듈들은 Mon 이 기본적으로 가동되기 위해 필수적인 패키지 들입니다.
차 후 mon 을 이용한 모니터링을 위해 상황에 따라 아래와 같은 모듈이 필요합니다. 지금 당장 아래의 것들을 설치하실 필요는 없습니다.


인용:

[ 모니터링 데몬의 종류 및 필요 모듈 ]

freespace.monitor : 디스크의 용량을 파악하는 모니터링 데몬입니다. 필요한 모듈은 Filesys::DiskSpace 입니다.

fping.monitor : 상대의 서버가 ping 에 응답하는지 확인하는 툴이죠. 특별한 모듈은 필요 없습니다.

telnet.monitor : 텔넷접속상태를 확인하는 모니터링 데몬입니다. Net::Telnet 모듈이 필요합니다.

reboot.monitor
asyncreboot.monitor
netappfree.monitor
process.monitor
hpnp.monitor

ldap.monitor : Net:LDAPapi 모듈을 필요로 합니다.

dialin.monitor : 전화 걸어보는 건가..? Perl Expect 모듈이 필요하다네요...모지 이건..

dns.monitor : dns 를 검사하는 모니터링 데몬인가 봅니다. 안써봤습니다. 모듈은 Net:DNS 를 필요로 합니다.

msql-mysql.monitor : msql 이나 mysql 의 가동여부를 조사하는 모양이네요. MSQL/MySQL DBD 모듈과 DBI 모듈이 필요합니다.


기본적으로 위의 4가지 모듈을 모두 문제없이 설치하셨다면 이제야 말로 정말로 mon데몬을 설치 할 차례입니다.

자 이제야 말로 mon을 설치하러 가겠습니다.

 

 

4  [리눅스클러스터링]LVS강좌 3. Mon 설치하고 테스트 하기

mon 은 압축만 풀면 바로 사용할 수 있는 perl 프로그램입니다.
아래와 같이 하세요.

인용:
cd /usr/local
tar xvfz mon-0.38.20.tar.gz
mv mon-0.38.20 mon


위가 mon 의 압축을 풀고 이름을 변경하는 단계입니다.

압축이 풀린 mon 의 디렉토리 구조는 아래와 같습니다.


인용:
mon--|-- alert.d  (각종 alert 데몬이 들어 있는 디렉토리)
     |-- cgi-bin    ( mon.cgi 를 사용하는 디렉토리 )
     |-- clients ( mon 클라이언트 데몬이 있는 디렉토리)
     | `-- skymon
     |-- doc (메뉴얼이 있는 디렉토리)
     |-- etc (설정화일이 들어 있는 디렉토리)
     |-- mon.d (모니터 프로그램이 있는 디렉토리)
     |-- muxpect (멀티플렉스 TCP 라는 기능을 위해 개발되어 지고 있는 프로그램이라 한다. 현재 완전하지 않다.)
     |-- state.d (pid 가 들어갈 자리려나...)
     |-- utils ( mon 용 유틸리티가 들은 자리 )



일단 사용할것은 etc 디렉토리의 설장화일과 alert 데몬 및 monitor 데몬입니다.
alert 데몬과 monitor 데몬의 용도는 이렇습니다.

(1)초기에 mon 데몬이 가동되어 지면서 설정화일에 명시한 설정을 읽는다. -> (2)각종 monitor 프로그램으로 지정된 서버를 모니터링 한다 -> (3)정상적인 동작이 되고있지 않은것을 확인한 후에는 설정화일에서 명시한 alert 프로그램을 실행시켜 처리한다.<끝>

여기까지가 mon 프로그램의 간략한 동작 방식이다. 다음은 설정화일을 편집해야 합니다.
우선 설정화일을 /etc 디렉토리 이하로 옮기기 위해 (차후 관리가 편하니깐..)

인용:
mkdir /etc/mon


하고 mon 아래 etc 디렉토리에 있는 example.cf 파일을 /etc/mon/mon.cf 파일로 복사하세요.

인용:
cp etc/example.cf /etc/mon/mon.cf


만약 당신의 시스템이 m4 를 사용하고 있다면 example.m4 를 /etc/mon 디렉토리에 카피해야 합니다.

그리고 나서 메뉴얼에는 auth.cf 파일을 수정하라고 나와있지만 지금은 잘 작동하는지 테스트만 할 것이므로 그대로 사용해도 무방합니다.

인용:
cp etc/auth.cf /etc/mon/auth.cf


카피 했으면 그다음엔 /etc/services 파일 맨 아래에 아래의 항목을 입력하도록 하지요.


                
인용:
mon                2583/tcp                #MON
mon                2583/udp                #MON traps

                


다 되었으면 이제 /etc/mon/mon.cf 파일을 편집합니다.
간단하게 만드세요. mon.cf 파일에 있는 내용을 모두 지우기 바랍니다.. 예제가 들어있지만 처음부터 다시 구성 할 것입니다.
처음부터 너무 복잡하면 개념잡기가 힘이듭니다. 자세한 내용은 언제나 그렇듯이 RTFM! ^^

소스코드:
##  mon.cf 파일 만들기 ############################################# cfbasedir = /etc/mon                 alertdir  = /usr/local/bin/alert.d mondir          = /usr/local/mon/mon.d maxprocs  = 20 histlength = 100 randstart  = 30s authtype   = getpwnam # # 그룹을 선언하는 위치 입니다. 호스트네임이나 IP 를 적어야 합니다. # # #  ex) hostgroup      master_server    123.123.123.2 #      ^^^^^^^^^     ^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^ #     그룹 선언문     그룹의 이름        해당 서버의 IP나 호스트네임 (여러개를 적을때는 한칸씩 띄워서 쓰면 된다.) # hostgroup master_server        123.123.123.2 # # 선언한 그룹에 대하여 적용할 모니터링 데몬및 설정을 입력한다. #         watch master_server # watch 는 선언문이며 master_server 는 위에서 지정한 그룹의 이름이다.         service        ping         description        ping to master_server group         interval 10s         monitor fping.monitor         period wd {Sun-Sat}         alert echo.alert "master server is down!!"         upalert echo.alert "master server is live!!"




echo.alert 파일은 없습니다. 그러나 테스트를 하기 위함이므로 아래와 같이 만들죠.
echo.alert 는 test.alert 와 같은 내용입니다. 제가 왜 바꿨었는지 모르겠네요..--a..

소스코드:
## /usr/local/mon/alert.d/echo.alert #!/bin/sh echo "`date`$*" >> /var/log/echo.alert.log;


퍼미션은 755 로 놓습니다.

접속이 되지 않는 ip를 mon.cf 파일에 입력한 후 mon을 실행시켜 보세요.

인용:
/usr/local/mon -f -c /etc/mon/mon.cf


그러면 잠시후 터미널에 이런 비스므리한 메세지가 뜰것입니다.

인용:
<daemon.crit>mon[1995]: failure for master_Server echo 2314823742 123.123.123.2


안떠도 너무 놀라진 마십시오. 버전마다 틀린경우가 있을 수도 있습니다. 일단 중요하게 생각지 마시고..언제나 마지막에만 잘 되면 됩니다..

일단 /var/log 디렉토리로 가서 echo.alert.log 라는 파일이 있는지 찾아보세요.
생성이 되어 있고 모라고모라고 써 있다면 일단 제대로 작동되는것은 확인한 것이다.

mon 의 설치도 대충은 된것 같네요. 쉽죠?


 

5  [리눅스클러스터링]ipvsadm 설치와 간단한 명령어 사용방법

 

1. 설치하기
ipvsadm 의 설치는 커널 패치만 하면 문제가 아닙니다.( 물론 커널을 패치 했다는말은 곧 패치 후 컴파일을 했다는 말이됩니다. 이것 제대로 말씀 안드렸더니 컴파일 안해도 되는것처럼 얘기했다고 설치나 해 봤냐고 따지시는 분들이 가끔 계시더군요..네..맞습니다..컴파일 해야 합니다..전 당연한거라고 생각해서 안썼었습니다..--a.. )

그럼 커널 패치를 했다는 전제하에 ipvsadm 을 설치하도록 하겠습니다.. 저는 커널 2.2.16 바탕인 레뎃 7.0 에 ipvsadm-1.12.tar.gz 으로 설치를 했습니다.

인용:
tar xvfz ipvsadm-1.22.tar.gz
cd ipvsadm-1.22
make
make install



별다른 무리 없이 위와 같이 하면 설치는 완료 됩니다.. 테스트를 해 보도록 하세요.
쉘 상에서 아래와 같이 입력해 보도록 하죠.


인용:
[root@master/root]ipvsadm
IP Virtual Server version 0.9.14 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port         Forward Weight ActiveConn InActConn


  
위와 같이 나온다면 설치가 잘 된것입니다.

그럼 명령어 사용방법을 알아보도록 하죠.



2. 명령어 사용방법

초반에도 이야기 했지만 이 강좌에서는 다이렉트 라우팅에 대한것만을 가지고 강좌를 합니다.. NAT, 나 터널링은 약간의 응용이므로 이것만 제대로 숙지하면 바로 사용이 가능할것입니다.

명령어 사용밥법 숙지에 들어가기 전에 마스터 노드를 제외한 (test의 결과를 제대로 확인하기 위하여)설정한 모든 시스템들의 웹데몬을 가동시켜 놓도록 합니다. 웹서버에 접속하는 것을 테스트로 할테니깐..

자 이제 마스터 노드의 ipvsadm 을 가동시켜 보도록 하겠습니다.
아래와 같이 합니다.

우선 마스터 노드를 제외한 각 서버에서 아래와 같은 명령어를 입력 합니다.


인용:
echo 1> /proc/sys/net/ipv4/conf/all/hidden
echo 1> /proc/sys/net/ipv4/conf/lo/hidden
ifconfig lo:0 123.123.123.1 netmask 255.255.255.255 broadcast 123.123.123.1 up
route add -host 123.123.123.1 dev lo:0



인터넷은 tcp/ip 기반으로 되어 있지만 한번 접속된 서버의 ip 주로에 대한 arp 캐쉬라는것이 얼마간 남게 됩니다.
그래서 그 캐시가 지워지기 전까지는 한번 ip 로 접속한 후 arp 캐쉬를 다라서 접속하게 되죠.
그래서 클라이언트에 arp 캐쉬가 저장이 되지 않고 매번 IP 를 찾도록 하드웨어 주소는 arp 캐쉬를 감추는 것입니다.

그리고 마스터 노드엔 아래의 명령을 입력 합니다.


인용:
echo 1> /proc/sys/net/ipv4/conf/all/hidden
echo 1> /proc/sys/net/ipv4/conf/eth0/hidden
ifconfig eth0:0 123.123.123.1 netmask 255.255.255.255 broadcast 123.123.123.1 up
route add -host 123.123.123.1 dev eth0:0




그리고 나서 이제부터 ipvsadm 을 설정합니다.

인용:
ipvsadm -A -t 123.123.123.1:80 -s wlc



-A 라는 옵션은 서비스를 추가 하겠다는 뜻의 add-service 로서 새로이 하나의 설정을 시작하겠다는 뜻입니다.
-t 라는 옵션은 tcp 서비스를 추가하겠다는 뜻입니다. -t , -u , -f 옵션을 쓸 수 있습니다. -u는 udp 를 의미하며 -f 는 파이어월 서비스를 추가하겠다는 의미로 NAT 방식에서 사용합니다.

-t 옵션 다음에는 VIP 라고 하여 외부에서 접속 하고자 하는 IP 번호를 입력합니다. 아까 쓰지않고 남겨뒀던 1 번이 여기서 쓰입니다.
-s 옵션은 스케듈러 방식을 선택 하겠다는 이야기이고 그 뒤에 오는 wlc 라는 말은 weigth least connection scheduling 이라 하여 서버마다 성능의 가중치를 부여하여 그 가중치 만큼씩 분배를 하겠다는 이야기가 됩니다.

스케쥴러 방식은 4가지가 있습니다.아시는 분은 넘어가세요..


인용:
rr (round robin) 그냥 순서대로 돌린다.
wrr (weight round robin) 서버의 용량에 따라 가중치를 둔다. 연결된 커넥션 수는 신경쓰지 않는다.
lc (least connection) 현재 서버상태에서 가장 커넥션 수가 적은것을 우선 서비스 한다.
wlc ( weight least connection) 위에 이야기 한대로 설정시 가중치를 부여할 수 있다.





자, 아직 까지는 변화가 있을 수가 없습니다. 이제 한줄 입력했으니까요....

그러면 두번째 명령을 주르륵 입력 해 보겠습니다.

인용:
ipvsadm -a -t 123.123.123.1:80 -R 192.168.0.2 -g w 1
ipvsadm -a -t 123.123.123.1:80 -R 192.168.0.3 -g w 2
ipvsadm -a -t 123.123.123.1:80 -R 192.168.0.4 -g w 3



자 또 다시 명령어의 숙지 시간 입니다.
소문자 -a 는 add-server 의 약자 입니다. -a 대신 -e 또는 -d 가 올수 있고 e는 edit 의 약자, -d 는 delete 의 약자입니다.
-t 는 아까도 이야기 드렸다 시피 tcp 를 이야기 하고요...VIP(123.123.123.1) 뒤에 :80 은 80번 포트(웹포트입니다.)를 돌리겠다는 말이 됩니다.
-R 는 실제로 서비스를 할 서버를 의미하고 -g 는 다이렉트 라우팅을 의미 합니다. w 와 뒤의 숫자는 가중치 설정과 값의 부여가 되겠죠.
아마 이거는 아래와 비슷하게 동작 할껍니다.

인용:
1st connection -> 192.168.0.2 (1번)
2st connection -> 192.168.0.3
3st connection -> 192.168.0.3 (2번)
4st connection -> 192.168.0.4
5st connection -> 192.168.0.4
6st connection -> 192.168.0.4 (3번)
7st connection -> 192.168.0.2 (1번)



이제 설정은 끝났습니다.

웹상에서 http://123.123.123.1/ 을 입력하고 접속해 보시면 계속해서 다른 서버로 넘어 간다는것을 아실 수 있습니다.(만약 html 문서를 똑같이 만드셨다면 알아 볼 수가 없겠죠...^^)

ipvsadm 명령어 사용법 끝.

 

 

6  [리눅스클러스터링]로드발란싱 도전

 

1. 시스템을 로드발란서로 세팅하기

이번 항목은 조금 길것 같습니다.
지금까지 한것을 다시한번 요약하구요 그 다음 실제 가동을 위한 스크립트를 생성 할 것입니다.

실제로 작동 되는것 까지 확인 하셨으면 그 다음엔 실제 업무에 사용할 수 있나 확인 해 보아야 겠지요.

자 우선 ipvsadm 을 마음대로 제어할 수 있게 lvs.alert 라는 파일을 만듭니다.

/usr/local/mon/alert.d/lvs.alert 의 내용

소스코드:
#!/usr/bin/perl # # lvs.alert - Linux Virtual Server alert for mon # # It can be activated by mon to remove a real server when the # service is down, or add the server when the service is up. # # use Getopt::Std; getopts ("s:g:h:t:l:P:V:R:W:F:u"); $ipvsadm = "/sbin/ipvsadm"; $protocol = $opt_P; $virtual_service = $opt_V; $remote = $opt_R; if ($opt_u) {     $weight = $opt_W;     if ($opt_F eq "nat") {         $forwarding = "-m";     } elsif ($opt_F eq "tun") {         $forwarding = "-i";     } else {          $forwarding = "-g";     }     if ($protocol eq "tcp") {         system("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding");     } else {         system("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");     } } else {     if ($protocol eq "tcp") {         system("$ipvsadm -d -t $virtual_service -r $remote");     } else {         system("$ipvsadm -d -u $virtual_service -r $remote");     } };


위의 스크립트는 www.linuxvirtualserver.org 에 있는 스크립트 입니다. 그런데 쓰고 보니 이 스크립트를 바로 사용하기에는 문제가 있더군요.
제 경우엔 alert 와 upalert 의 구분이 모호 해지는 현상이 있었습니다.
그래서 아래처럼 바꿨습니다. 윗 부분만 고쳐서 아래의 udp 부분은 그냥 두었네요..udp 를 사용하시려면 윗 부분에서 프로토콜 체크를 한번 더 하셔야 합니다.


소스코드:
#!/usr/bin/perl # # lvs.alert - Linux Virtual Server alert for mon # # It can be activated by mon to remove a real server when the # service is down, or add the server when the service is up. # # use Getopt::Std;     getopts ("s:g:h:t:l:P:V:R:W:F:X:u");        $ipvsadm = "/sbin/ipvsadm";        $protocol = $opt_P;        $virtual_service = $opt_V;        $remote = $opt_R;        $status = $opt_X; if ($status eq "down"){ # <"udp 를 사용 하시려면 이 부분에 프로토콜 체크를 한번 더 하셔야 합니다.">         system("$ipvsadm -d -t $virtual_service -r $remote");         exit 0;         } else {         $weight = $opt_W;                 if ($opt_F eq "nat") {                         $forwarding = "-m";                         }                 elsif ($opt_F eq "tun") {                         $forwarding = "-i";                         }                 else {                         $forwarding = "-g";                         }                 if ($protocol eq "tcp") {                 system("$ipvsadm -a -t $virtual_service -r $remote -w $weight $forwarding"); exit 0;                 }                 else {                 system("$ipvsadm -a -u $virtual_service -r $remote -w $weight $forwarding");      exit 0;                 } exit 0; };


보시는 바와 같이 -X 라는 옵션을 하나 추가하여 시각적으로 명확히 구분되게 하였습니다.

이 파일을 mon 이 설치된 디렉토리 (여기서는 /usr/local/mon 입니다.)의 alert.d 디렉토리에 생성 합니다. 그리고 퍼미션은 755로 놓습니다.
그리고 /etc/mon/mon.cf 파일을 아래와 같이 수정 합니다. 여기서는 ping 으로 서버의 생존유무를 파악하지 않고 웹서버의 포트를 이용한 생존여부를 파악하겠습니다.
실제로 네트웍이 끊어져도 arp 의 캐쉬때문인지 http의 접속을 계속 확인하고 있는 경우가 있었습니다.


/etc/mon/mon.cf 파일의 내용
소스코드:
cfbasedir  = /etc/mon alertdir   = /usr/local/mon/alert.d mondir     = /usr/local/mon/mon.d maxprocs   = 20 histlength = 100 randstart = 30s authtype = getpwnam # # group definitions (hostnames or IP addresses) #         hostgroup node_1st 123.123.123.3                                  hostgroup node_2st 123.123.123.4                                          hostgroup node_3st 123.123.123.5 # # Web server 1 # watch node_1st         service http         interval 5s         monitor http.monitor         period wd {Sun-Sat}         alert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.3 -W 1 -F dr -X down         upalert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.3 -W 1 -F dr # #web3 Server 2 # watch node_2st         service http         interval 3s         monitor http.monitor         period wd {Sun-Sat}         alert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.4 -W 1 -F dr -X down         upalert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.4 -W 1 -F dr # #web4 Server 3 # watch node_3st         service http         interval 3s         monitor http.monitor         period wd {Sun-Sat}         alert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.5 -W 1 -F dr -X down         upalert lvs.alert -P tcp -V 123.123.123.1:80 -R 123.123.123.5 -W 1 -F dr



위의 예처럼 호스트그룹과 호스트그룹의 선언 사이는 반드시 한줄 이상 띄워 주셔야 합니다.
그렇지 않을 경우 매우 황당한 상황을 맞이하게 됩니다. 맨 마지막에 있는 시스템이 리얼노드에서 탈퇴를 하고말죠.
이것은 mon 의 제작자의 메뉴얼에 있는 내용으로서 반드시 강조를 하고 있는 부분입니다. 일어나는 문제는 아래와 같습니다.
서버의 커넥션을 확인하는 데몬이 입력값을 두개를 받게 되어, 있지도 않은 서버의 상태를 조사하게 됩니다. 궁금하시면 호스트그룹의 입력을 다닥다닥 예쁘게 왼쪽졍렬로 붙여서 입력 해 보세요.^^

여기까지 되셨으면 이제는 이 데몬들을 전부 한번에 실행 할 수 있는 init 파일을 한개 맹글어야겠지여.. 그럼 아래에 맹글어 보겠습니다.

----/etc/rc.d/init.d/punk.init  파일 내용(파일 이름은 아무래도 상관 없습니다.)

소스코드:
#!/bin/sh # # load balancer daemon scripts # PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH IPVSADM=/sbin/ipvsadm MON=/usr/local/mon/mon RETVAL=0 #Source function library. . /etc/rc.d/init.d/functions case "" in         start)         if [ -x $IPVSADM ]         then         echo 1 > /proc/sys/net/ipv4/ip_forward         ifconfig eth0:0 123.123.123.1 netmask 255.255.255.255 broadcast 123.123.123.1 up         route add -host 123.123.123.1 dev eth0:0         echo 1 > /proc/sys/net/ipv4/conf/all/hidden         echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden         $IPVSADM -A -t 123.123.123.1:80 -s wlc         $IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.3 -g -w 1         $IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.4 -g -w 1         $IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.5 -g -w 1         echo -n "started loadbalancer daemon:"         daemon  $MON -f -c /etc/mon/mon.cf         RETVAL=$?         echo         [ $RETVAL = 0 ] && touch /var/lock/subsys/punk         echo         fi         ;;         stop)         if [ -x $IPVSADM ]                 then                 echo -n "punk daemon stopping..."                 $IPVSADM -C                 ifconfig eth0:0 down                 killproc mon                 rm -f /var/lock/subsys/punk                 killall http.monitor                 echo -n "punk daemon killed"                 echo         fi         ;;         *)         echo "Usage : punk {start|stop}"                 exit 1 esac exit 0



다 하셨으면 역시 퍼미션은 755로 변환 해 주시구요...
자..이제 정리하고 가동해보는 일만 남았군요.
짧게 정리해 보겠습니다. 시스템 설정 및 구동 순서 입니다.

1. 시스템을 적게는 2대, 많게는 4대 정도를 준비한다.
2. 각 시스템에 ip를 할당하고 웹서버를 설치하고 실행한다.

실제로 일어나는 변화를 확실히 하기위하여 웹서버에서 KeepAlive 를 off 로 설정하고 MaxKeepAliveRequest 값을 1로 변환한다.

인터넷 익스플로러의 도구->인터넷옵션->임시 인터넷파일->페이지를 열때마다로 체크해 놓는다.

시각적으로 구분하기 위하여 각 노드들마다 인덱스 페이지를 틀리게 한다.
3. 마스터 서버에 mon 을 설치한다.
4. 마스터 노드에 ipvsadm 을 설치할 수 있는 커널을 설치하고 필요시 컴파일한다.
5. mon의 설정화일을 편집하고 전체 프로그램을 가동시키고 종료시킬 init 데몬 스크립트를 만든다.
6. 마스터를 제외한 서버들에 arp 캐쉬를 감추고 lo:0 디바이스에다가 VIP 를 추가한다.
7. 마스터 서버를 구동한다.
8. 잘 된다.

..이상 입니다.
마스터 서버의 캐쉬를 감추고 이더넷을 추가하는 스크립트는 init 스크립트에 들어 있습니다. 그럼 마스터 서버를 가동해 보도록 하겠습니다.

/etc/rc.d/init.d/punk start

그리고 익스플로러로 123.123.123.1 로 접속해 봅니다. 할당된 도메인이 있다면 더더욱 좋습니다. 되셨나요..? 축하드립니다. 아시겠지만 여기는 마스터 노드의 웹 서버에 대한 내용은 나와있지 않습니다. 그것은 마스터 서버가 받을 부하를 위하여 그런건데요...
만약을 위하여 마스터 노드는 많은 여유을 가지고 있어야 하기 때문입니다. 마스터가 죽으면 죽도밥도 안되니까요...
그렇지만 마스터 노드도 웹서비스를 함께 하실 원하신다면 그냥 웹서버 띄우고 ipvsadm 에 한줄 더 추가해 주시면 그냥 됩니다.
흔히 말하는 두대짜리 active-active 서버가 한개는 마스터겸 웹서버고 한대는 백업겸 웹서버랍니다. 나중에 heartbeat 할때 해보겠습니다.


7  [리눅스클러스터링]heartbeat (심장박동)의 설치

 

1. 설치하기
1. http://www.linux-ha.org/ 에서 heartbeat 최신버전을 다운 받습니다. 가급적 rpm 을 받는것이 설치하기에 용이하죠.

fake 는 arp 를 속여 IP 를 이전하는 소프트웨어 라고 하는데 차후 이에 대해 좀더 세부적으로 끌어 나가야 할 것 같습니다.
어쨌던 heartbeat 에는 fake 의 기능이 들어 있으므로(IPAT) heartbeat 만 설치하여도 작동이 가능합니다.

그럼 heartbeat 가 하는 일과 fake 가 하는 일은 무엇일까요..?

heartbeat 는 말 그대로 심장박동을 이야기 하죠.

쉽게 이야기 하면 A 는 B 에게 몇초에 한번씩 "나 살아있어" 라고 이야기 하고 B는 A에게 "나도 살아있어" 라고 이야기 하는 프로그램인 겁니다.

B가 A에게서 몇초에 한번씩 "나 살아있어"라는 말을 들어야 하는데 그 말이 들리지 않으면 B는 이상하다..라고 생각하고 몇초간 더 기다려 봅니다.
그런데도 계속 연락이 없어지면 B는 A가 죽었구나..라고 판단하고 내가 A가 되어줄께..라고 하고서 A의 모든 기능을 이어받아 자신이 A가 되어 버리는 거죠...

A-> 사망.
B-> A로 전환.

그런데 갑자기 죽은줄만 알았던 A가 다시 부활해서 B에게 말합니다. "나 살아있어". 그러면 원래 B였던 A는 원래 A였던 사망자에게 다시 A로의 권한을 위임하여 자신은 도로 B로 돌아가는 겁니다.

사망했던 A -> A로 복귀.
B였던 A -> B로 복귀.

무슨 드라마 같이 되어버렸습니다...-_-; 그럼 B가 죽으면 어떻게 될까요...? A는 B에게 별로 관심이 없는 듯 합니다.
죽던지 말던지 자기가 하던일만 하네요...사실 이것도 설정하기 나름입니다만..

그러면 B가 A가 되는 과정을 서버시스템으로 치자면 무엇이 변화하면서 가능한 걸까요..? 바로 IP 입니다.
외부에 보여지는 VIP 가 넘나드는 것이죠.

IP의 문제없는 전환은 MAC ADDRESS 가 업데이트 되야지만 실시간으로 변환이 가능합니다.

fake 라는 프로그램은 이리하여 arp spooping 이라는 기능으로 신속히 라우터에게 IP에 대한 새로운 MAC ADDRESS 를 갱신하는 겁니다.

그래서 외부에서 새로운 요청을 받았을 시 바로바로 새로운 정보를 접속자에게 보내줄 수 있는 것이죠.

MAC ADDRESS 는 무엇인가?

맥어드레스는 맥킨토시의 주소가 아니라(^^) MAC(media access control) 이라고 하여 공유하고 있는 미디어에 연결된 장치의 하드웨어 주소 라고 컴퓨터 용어 사전에 나와 있습니다.
결국 랜카드의 하드웨어 주소를 말합니다.

랜카드에는 전세계에서 유일한 고유의 번호가 찍혀있습니다.

리눅스 시스템에서 지금 바로 /sbin/arp 라고 명령을 내려 보세요.

인용:
Address HWtype HWaddress Flags Mask Iface
123.123.123.1 ether 00:10:E0:01:A1:E9 C eth0



윈도우 2000 의 경우는 코맨드 라인에서 ipconfig /all 라고 치시면 맨 밑에 나오구요

인용:
>Physical Address. . . . . . . . . : 00-01-02-55-16-67


98에서는 실행메뉴에서 winipcfg 라고 치시면 아마 나올겁니다.

대충 위와 비슷한 내용이 나올건데요...위의 예의 경우 HWaddress 부분에 적힌 00:10:E0:01:A1:E9 가 하드웨어의 주소가 됩니다.

그럼 왜 IP 가 아닌 arp 인가..? 빠르기 때문입니다. 왜 빠르냐고요...? 빠른가 부지여... RFC문서 826 과 1122 에 arp 에 대하여 정의되어 있다고 합니다.

심도깊은 공부를 위하신다면 자료실에 올려 놓았으니 참조하시구요...영문입니다..

어쨌거나 heartbeat 를 받아서 설치하고 설정화일을 수정 해 보겠습니다.

heartbeat 의 새로운 버전은 http://www.linux-ha.org/download/ 에 가시면 다운 받으실 수 있습니다. 현재 버전은 heartbeat-0.4.8-1.i386.rpm 입니다.

인용:
rpm -Uvh heartbeat-0.4.8-1.i386.rpm


heartbeat 를 설치하면 /etc/ha.d 라는 디렉토리에 설정파일등이 생성 됩니다.
그리고 /etc/rc.d/init.d/ 에 heartbeat 라는 init 파일도 생성이 되구요..
그러나 이대로 그냥

인용:
/etc/rc.d/init.d/heartbeat start


를 하면 에러가 납니다. 설정 파일을 편집해야 겠군요.


그리고 만약 heartbeat 의 개념이나 라우팅이 되는 원리등이 좀 이해하기 곤란하신 분은 반드시 아래 링크를 참조하십시오. 똑같은 내용을 이곳에서는 강좌하지 않았습니다.


http://kldp.org/Translations/html/Virtual_Server-KLDP/index.htm


제 개인적으로 현재 lvs 에 대해 나와 있는 한글번역 문서나 어떤 내용이든지 이해하시기에는 별 문제가 없으리라 판단하여 특별히 개념에 대해 기록하지 않았습니다.

 

 

8  [리눅스클러스터링]heartbeat 설정파일 편집

 

heartbeat 설정파일 편집하기

자..설치를 잘 따라오신분들은 이번엔 설정파일을 편집하는 부분입니다.

순서를 heartbeat 설정파일 편집하기 와 설정파일 개조하기 로 나누겠습니다.

heartbeat 의 기본 설정으로는 원만하게 클러스터링을 하는데 조금 부담이 있습니다.

첫번째로 우선 rpm 으로 설치하셨으니 /etc/ha.d/ 디렉토리고 가 보시면

README.config 라는 파일이 있습니다.

그파일을 열어보시면 별거는 없지만

인용:
당신은 심장 박동을 해피하게 하려면 세개의 설정파일이 필요하당..
글고 그것들은 전부 이 디렉토리에 있어야 된당..

그것들의 이름은:
        ha.cf     메인 설정파일
        haresources        리소스 설정파일
        authkeys        인증정보
다..



등등하고..


rpm 으로 설치한 사람은 행복하게도 아래의 명령어를 쳐서 나오는 디렉토리에
설정파일의 샘플이 존재한다고 나옵니다.


인용:
rpm -q heartbeat -d



라고 쳐보죠...

주루륵 나오는데

/usr/share/doc/packages/heartbeat 라는 디렉토리에  설정파일 세개가 몰려있는것이 보이시죠..?

그럼 글로 갑시다..

그리고 아래와 같이 복사합니다.


인용:
cp ha.cf /etc/ha.d
cp haresources /etc/ha.d
cp authkeys /etc/ha.d



복사가 완료되었으면 다시 /etc/ha.d 디렉토리로 돌아옵니다.

그리고 이제 설정 파일을 편집할 순서가 된것입니다.

지금부터 제가 써 놓은 곳은 주석을 풀고 아래에 있는 숫자..혹은 여러분이 바라는 설정대로 고쳐 놓으시고요...

/etc/ha.d/ha.cf 파일의 내용-------------------

소스코드:
debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 5 hopfudge 1 udpport 1001 udp eth0 node master node slave 




위에 node 라는 항목이 두개가 있습니다.
우선권은 위에 있는 노드가 됩니다.

그리고 이제 저장하고 닫으신 후

authkeys 라는 파일을 열어보도록 합니다.

그리고 sha1 HI! 라는 항목의 주석을 풀어줍니다.

아래처럼 되겠죠..

/etc/ha.d/authkeys 파일의 내용 ------------------

소스코드:
auth 1 #1 crc 1 sha1 HI! #3 md5 Hello!



그리고 중요한건데 퍼미션은 반드시 600으로 두셔야 작동이 됩니다.
왜 그런지는 설정파일내에 있는 주석을 보시면 아시지 않을까 싶습니다.


그리고 그 다음엔 haresources  파일을 편집해야 합니다.
여기서 부터 좀 중요한 부분인데..우리는 아이피를 왔다갔다..하고 모 이런것도
중요하지만 실제로 서비스를 하는게 목적이니 만큼 실제 사용할 수 있는 부분으로
바꾸어 보겠습니다.

전에 mon 에 대한부분 하실 때 만들어 놓은 punk 라는 데몬 기억하시죠..?
그걸 쓸겁니다..

haresource 파일에 적어주는 내용은 아래와 같습니다.


/etc/ha.d/haresource 파일의 내용 ----------------

소스코드:
#문법에 맞게 써야 합니다. #문법은 아래와 같습니다. #masternode_name       IP           DAEMON_NAME master.server.com 123.123.123.1    punk



자아..이렇게 한줄만 써 주면 됩니다.

그리고 중요한건데요...소스를 좀 수정해야겠습니다.
말씀드리지만 이건 순전히 편할라구 하는 편법이구요..

heartbeat 의 자세한 사용 방법은 차후 강좌에 올리도록 하겠습니다.

우선..왜 소스를 수정하느냐..가 궁금하실 겁니다.

슬레이브 클러스터 서버도 평소엔 노드로서 웹등의 서비스를 가능하게
하기 위해선데요..그러려면 이 녀석은 슬레이브와 노드의 역할을 동시에
할 수 있어야 하겠죠..그러기 위해선 전 강좌에 있던것처럼 노드들에게 가상으로
아이피를 부여 해 주어야 하구요..lo:0 아시져..?

그거를 스크립트로 만들고 heartbeat 데몬의 가동과 정지시에 넣었다 뺏다 하기 위한입니다.

그럼 고쳐보죠..

우선 ipvsadm.sct 라는 파일을 /etc/ha.d 디렉토리에 만들어 주세요..퍼미션은 755로 두고요..

/etc/ha.d/ipvsadm.sct 파일의 내용----------------

소스코드:
 echo 1 > /proc/sys/net/ipv4/ip_forward ifconfig lo:0 123.123.123.1  netmask 255.255.255.255 broadcast 123.123.123.1 up route add -host 123.123.123.1 dev lo:0 echo 1 > /proc/sys/net/ipv4/conf/all/hidden echo 1 > /proc/sys/net/ipv4/conf/lo/hidden



아시다 시피 123.123.123.1 은 버츄얼 아이피를 적는겁니다.

그리고 /etc/ha.d/resource.d/IPaddr 파일을 약간 손봅니다..

인용:
#!/bin/sh
#
#        $Id: IPaddr,v 1.7 2000/11/07 14:15:04 alan Exp $
#
#        This script manages IP alias IP addresses
#
#        It can add an IP alias, or remove one.
#
#        usage: $0 ip-address {start|stop|status}
#
#        The "start" arg adds an IP alias.
#
#        Surprisingly, the "stop" arg removes one.        :-)
#
#

LC_ALL=en; export LC_ALL # Make ifconfig work in France for David Jules :-)

. /etc/ha.d/shellfuncs

IFCONFIG=/sbin/ifconfig
ROUTE=/sbin/route
SENDARP=$HA_BIN/send_arp
FINDIF=$HA_BIN/findif
USAGE="usage: $0 ip-address {start|stop|status}";

###################   sung gon's system configuration  ############################


ifconfig lo:0 down


##################################################################################
##
#
#        Find out which alias serves the given IP address
#        The argument is an IP address, and its output
#        is an aliased interface name (e.g., "eth0:0").
#
###################################################################################
find_interface() {  

  ipaddr=$1;
  $IFCONFIG |
  while read ifname linkstuff
  do
    read inet addr junk
    while
      read line && [ "X$line" != "X" ]
    do
      : Nothing
    done
    case $ifname in
      *:*)        ;;
      *)        continue;;
    esac
    case $addr in
      addr:$ipaddr)        echo $ifname; return 0;;
    esac
  done
  return 1
}
###################################################################################

#
#        Remove the IP alias for the requested IP address...
#        
ip_stop() {
  BASEIP=`echo $1 | sed s'%/.*%%'`
  IF=`find_interface $BASEIP`
  if
    [ -z "$IF" ]
  then
    : Requested interface not in use
  fi

  if
    [ -x $HA_RCDIR/local_giveip ]
  then
    $HA_RCDIR/local_giveip $*
    
  fi

#
#        The next bit of code is borrowed from Horms' fake code...
#        and can be inferred from the IP-Aliasing mini-HOWTO
#

  $ROUTE del -host $BASEIP
  $IFCONFIG $IF down

  ha_log "info: IP Address $BASEIP released"
}
###################################################################################

#
#        Find an unused interface/alias name for us to use for new IP alias
#        The argument is an IP address, and the output
#        is an aliased interface name (e.g., "eth0:0").
#
find_free_interface() {
  ipaddr=$1;
  if
    NICINFO=`$FINDIF $ipaddr`
  then
    : OK
  else
    lrc=$?
    ha_log "ERROR: unable to find an interface for $ipaddr"
    return $lrc
  fi
  nicname=`echo "$NICINFO" | cut -f1`
  nicinfo=`echo "$NICINFO" | cut -f2-`
  if
    [ $nicname = "" ]
  then
    ha_log "ERROR: no interface found for $ipaddr"
    return 1;
  fi

  IFLIST=`$IFCONFIG | grep "^$nicname:[0-9]" | sed 's% .*%%'`
  IFLIST=" `echo $IFLIST` "

  j=0

  while
    [ $j -lt 512 ]
  do
    case $IFLIST in
      *" "$nicname:$j" "*)        ;;
      *)                        echo "$nicname:$j        $nicinfo"
                                      return 0;;
    esac
    j=`expr $j + 1`
  done
  return 1
}

##############################################################################
#
#        Add an IP alias for the requested IP address...
#
#        It could be that we already have taken it, in which case it should
#        do nothing.
#

ip_start() {
#
#
#        Do we already service this IP address?
#
#$IFCONFIG lo:0 123.123.123.1 down

  if
    $IFCONFIG | grep "inet addr:$1 " >/dev/null 2>&1
  then
    exit 0        # We already own this IP address
  fi

  if
    IFINFO=`find_free_interface $1`
  then
    : OK got interface [$IFINFO] for $1
  else
    exit 1
  fi
  IF=`echo "$IFINFO" | cut -f1`
  IFEXTRA=`echo "$IFINFO" | cut -f2-`
  BASEIP=`echo $1 | sed s'%/.*%%'`

  if
    [ -x $HA_RCDIR/local_takeip ]
  then
    $HA_RCDIR/local_takeip $*
  fi
  
#
#        The remaining code in this function taken from FAKE, by horms
#

  ha_log "info: ifconfig $IF $BASEIP $IFEXTRA"
  $IFCONFIG $IF $BASEIP $IFEXTRA

  $ROUTE add -host $BASEIP dev $IF

  TARGET_INTERFACE=`echo $IF | sed 's%:.*%%'`

  MACADDR=$($IFCONFIG $TARGET_INTERFACE  | \
      fgrep $TARGET_INTERFACE | \
      sed \
      's/^.*HWaddr \(..\):\(..\):\(..\):\(..\):\(..\):\(..\).*$/\1\2\3\4\5\6/')
  
  if [ "${MACADDR:=NULL}" = "NULL" ]; then
      ha_log "ERROR: Could not locate obtain hardware address for $TARGET_INTERFACE"
  fi

  ha_log "info: Sending Gratuitous Arp for $BASEIP on $IF [$TARGET_INTERFACE]"

  for j in 1 2 3 4 5
  do
   $SENDARP $TARGET_INTERFACE ${BASEIP} ${MACADDR} ${BASEIP} ffffffffffff \
     || ha_log "ERROR: Could not send gratuitous arp"
     sleep 2
  done &
}
###################################################################################
ip_status() {
  BASEIP=`echo $1 | sed s'%/.*%%'`
  if
    $IFCONFIG | grep "inet addr:$BASEIP " >/dev/null 2>&1
  then
    echo "running"
  else
    echo "stopped"
  fi
}
###################################################################################
usage() {
  echo $USAGE >&2
}
####################################################################################
#
#        Add or remove IP alias for the given IP address...
#

if
  [ $# -eq 1 ]
then
  case $1 in
    info)        cat <<-!INFO
        Abstract=IP address takeover
        Argument=IP address OR IP address/broadcast address OR IP address/broadcast address/netmaskbits
        Description:
        An IPaddr resource is an IP address which is to be taken over by \\
        the owning node.  An argument is required, and is of this form:
            nnn.nnn.nnn.nnn/bbb.bbb.bbb.bbb
        Where nnn.nnn.nnn.nnn is the IP address to be taken over, and\\
        bbb.bbb.bbb.bbb is the broadcast address to be used with this address.

        Since IPaddr is the "default" resource type, it is not necessary\\
        to prefix the IP address by "IPaddr::".
        This allows IPaddr::192.2.4.63 to be abbreviated as 192.2.4.63.
        !INFO
        exit 0;;
  esac
fi
if
  [ $# -ne 2 ]
then
  usage
  exit 1
fi

case $2 in
  start)        ip_start $1;;
  stop)                ip_stop $1
########################### sung gon insert ###################################
                /etc/ha.d/ipvsadm.sct;;
##############################################################################
  status)        ip_status $1;;
  *)                usage
                  exit 1
                ;;
esac
#




파일의 내용중에 두분에 수정을 했습니다.

보이시죠..?  ########################### sung gon insert ################################### 로 구분해 놓았습니다.

그러면 이제 아이피를 제대로 이동할 수 있도록 punk 데몬을 수정하도록 하죠..

/etc/rc.d/init.d/punk.init 파일을 아래와 같이 씁니다.

소스코드:
#!/bin/sh # # punk cluster daemon scripts # PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH IPVSADM=/sbin/ipvsadm MON=/usr/local/mon/mon RETVAL=0 #Source function library. . /etc/rc.d/init.d/functions case "" in         start)         if [ -x $IPVSADM ]         then         echo 1 > /proc/sys/net/ipv4/ip_forward         ifconfig eth0:0 123.123.123.1  netmask 255.255.255.255 broadcast 123.123.123.1 up         route add -host 123.123.123.1 dev eth0:0         echo 1 > /proc/sys/net/ipv4/conf/all/hidden         echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden         $IPVSADM -A -t 123.123.123.1:80 -s wlc         $IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.3 -g -w 1         $IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.4 -g -w 1         $IPVSADM -a -t 123.123.123.1:80 -R 123.123.123.5 -g -w 1         echo -n "started daemon punk:"         daemon  $MON -f -c /etc/mon/mon.cf         RETVAL=$?         echo         [ $RETVAL = 0 ] && touch /var/lock/subsys/punk         echo         fi         ;;         stop)         if [ -x $IPVSADM ]                 then                 echo -n "punk daemon stopping..."                 $IPVSADM -C                 ifdown eth0                 ifup eth0                 killproc mon                 rm -f /var/lock/subsys/punk                 killall http.monitor                 echo -n "punk daemon killed"                 echo         fi         ;;         *)         echo "Usage : punk {start|stop}"                         exit 1 esac exit 0 



여기까지 입니다.

그담에 /etc/rc.d/init.d/heartbeat 파일에 한줄만 추가해 줍니다.

소스코드:
 #!/bin/sh # #        $Id: heartbeat.sh,v 1.29 2000/11/17 13:28:46 alan Exp $ # # heartbeat     Start high-availability services # # Author:       Alan Robertson        <alanr@suse.com> # #                This script works correctly under SuSE, Debian, #                Conectiva and a few others.  Please let me know if it #                doesn't work under your distribution, and we'll fix it. #                We don't hate anyone, and like for everyone to use #                our software, no matter what distribution you're using. # # chkconfig: 2345 34 40 # description: Startup script high-availability services. # processname: heartbeat # pidfile: /var/run/heartbeat.pid # config: /etc/ha.d/ha.cf    if   [ -r /etc/SuSE-release ] then   # rc.status is new since SuSE 7.0   [ -r /etc/rc.status ] && . /etc/rc.status   . /etc/rc.config   # Determine the base and follow a runlevel link name.   base=${0##*/}   link=${base#*[SK][0-9][0-9]}   # Force execution if not called by a runlevel directory.   test "$link" = "$base" && START_HEARTBEAT=yes   test "$START_HEARTBEAT" = yes || exit 0 fi if   [ -z "$rc_done" ] then   rc_done="Done."   rc_failed="Failed."   rc_skipped="Skipped." fi HA_DIR=/etc/ha.d; export HA_DIR CONFIG=$HA_DIR/ha.cf . $HA_DIR/shellfuncs # exec 2>>/var/log/ha-debug DISTFUNCS=/etc/rc.d/init.d/functions PROC_HA=$HA_BIN/ha.o SUBSYS=heartbeat INSMOD=/sbin/insmod US=`uname -n` # Set this to a 1 if you want to automatically load kernel modules USE_MODULES=1 # #        Some non-SUSE distributions like it if we use their functions... # if   [ ! -x $DISTFUNCS ] then   # Provide our own versions of these functions   status() {         $HA_BIN/heartbeat -s   }   echo_failure() {       echo -e " Heartbeat failure [rc=]. $rc_failed"       return   }   echo_success() {         : Cool!  It started!       echo -e "$rc_done"   } else   . $DISTFUNCS fi # #        See if they've configured things yet... # if   [ ! -f /etc/ha.d/ha.cf ] then   echo -n "Heartbeat not configured."   echo_failure 1   exit 0 fi # #        Install the softdog module if we need to # init_watchdog() { # #         We need to install it if watchdog is specified in $CONFIG, and #        /dev/watchdog refers to a softdog device, or it /dev/watchdog #        doesn't exist at all. # #        If we need /dev/watchdog, then we'll make it if necessary. # #        Whatever the user says we should use for watchdog device, that's #        what we'll check for, use and create if necessary.  If they misspell #        it, or don't put it under /dev, so will we. #        Hope they do it right :-) # #   insmod=no   # What do they think /dev/watchdog is named?   MISCDEV=`grep ' misc$' /proc/devices | cut -c1-4`   MISCDEV=`echo $MISCDEV`   WATCHDEV=`grep -v '^#' $CONFIG | grep watchdog |         sed s'%^[         ]*watchdog[         ]*%%'`   WATCHDEV=`echo $WATCHDEV`   if     [ "X$WATCHDEV" != X ]   then     : Watchdog requested by $CONFIG file   #   #        We try and insmod the module if there's no dev or the dev exists   #        and points to the softdog major device.   #     if       [ ! -c "$WATCHDEV" ]     then       insmod=yes     else       case `ls -l "$WATCHDEV" 2>/dev/null` in       *$MISCDEV,*)             insmod=yes;;       *)        : "$WATCHDEV isn't a softdog device (wrong major)" ;;       esac     fi   else     : No watchdog device specified in $CONFIG file.   fi   case $insmod in     yes)       if         grep softdog /proc/modules >/dev/null 2>&1       then         : softdog already loaded       else         $INSMOD softdog >/dev/null 2>&1       fi;;   esac   if     [ "X$WATCHDEV" != X -a ! -c "$WATCHDEV" -a $insmod = yes ]   then     minor=`cat /proc/misc | grep watchdog | cut -c1-4`     mknod -m 600 $WATCHDEV c $MISCDEV $minor   fi } # init_watchdog() # #        Start the heartbeat daemon... # start_heartbeat() {   if     ERROR="$($HA_BIN/heartbeat 2>&1)"   then     : OK   else     return $?   fi } # #        Start Linux-HA # StartHA() {   echo -n "Starting High-Availability services: "   if     [ $USE_MODULES = 1 ]   then     #        Create /dev/watchdog and load module if we should     init_watchdog   fi   rm -f /var/run/ppp.d/*   if     [  -f $HA_DIR/ipresources -a ! -f $HA_DIR/haresources ]   then     mv $HA_DIR/ipresources $HA_DIR/haresources   fi   #        Start heartbeat daemon   if     start_heartbeat   then     echo_success     return 0   else     RC=$?     echo_failure $RC     if [ ! -z "$ERROR" ]; then       echo       echo "$ERROR"     fi     return $RC   fi } # #        Ask heartbeat to stop.  It will give up its resources... # StopHA() {   echo -n "Stopping High-Availability services: "   if     $HA_BIN/heartbeat -k &> /dev/null        # Kill it   then     echo_success     return 0   else     RC=$?     echo_failure $RC     return $RC   fi } # #        Ask heartbeat to restart.  It will *keep* its resources # RestartHA() {   echo -n "Restarting High-Availability services: "   if     $HA_BIN/heartbeat -r # Restart, and keep your resources   then     echo_success     return 0   else     RC=$?     echo_failure $RC     return $RC   fi } RC=0 # See how we were called. case "" in   start)         StartHA         RC=$?         echo         [ $RC -eq 0 ] && touch /var/lock/subsys/$SUBSYS         ;;   stop)         StopHA         RC=$?         echo         [ $RC -eq 0 ] && rm -f /var/lock/subsys/$SUBSYS ####################바꾼곳 여기~######################         /etc/ha.d/ipvsadm.sct #######################################################         ;;   status)         status heartbeat         RC=$?         ;;   restart|reload)         RestartHA         RC=$?         ;;   *)         echo "Usage: ha {start|stop|status|restart|reload}"         exit 1 esac exit $RC 



자아..여기까지가 설정파일 수정의 모든것 입니다.

테스트 단계에서 실제로 몇가지 테스트를 하면서 어떤 설정값이 가장 좋은지는
스스로 판단하시기 바랍니다.

이제 테스트를 해 보도록 합니다.

master 서버와 slave 서버의 heartbeat 데몬을 가동시킵니다.

인용:
/etc/rc.d/init.d/heartbeat start



물론 웹서버데몬이라던가 각종 서비스할 데몬들도 가동을 시켜야 겠죠..

그리고 아래의 순서로 테스트를 해 봅니다.

1. 정상서비스 테스트(각각의 웹서버로 서비스가 되는지 확인한다.)

2. master 서버의 케이블을 뽑거나..혹은 httpd 데몬을 중지시켜 slave 서버가 master 서버의 서비스 중지 상황을 확인하고 자신의 ipvsadm 데몬을 가동시키는지 확인한다.

3. 다시 master 서버의 케이블을 연결하여 heartbeat 를 slave 서버로 보내는지 확인하고 slave 서버는 master 서버의 재생을 확인하고 master 로의 역활을 반납하는지 확인한다.

4. 기타 slave 서버및 node 들의 케이블을 순서대로 뽑아보고 서비스에 지장이 없는지 확인한다.

이상입니다.


위의 4가지 테스트가 모두 성공적으로 완료된다면 heartbeat 설정파일및 mon 데몬의 생존확인 프로세서의 간격을 줄여 보면서 최적의 상태로 셋팅합니다.


 

9  [리눅스클러스터링] 클러스터링 작동원리 이해하기
 


두대는 heatbeat 로 묶여서 작동하는 웹서버입니다. 둘다 ACTIVE 상태로 놓아서 효율성이 올라갑니다.이것이 가장 많이 쓰이는 방식인 Active & Active 방식의 클러스터 서비스 입니다.
DB 서버는 Fail safe 방식의 클러스터가 쓰였습니다.
DB 간의 동기화 같은 경우 적당히 쓰일만한 툴이 별로 없는 것으로 저는 알고 있습니다.
예전 어디에선가 DRDB 라는 프로그램이 있었는데...이것은 상위서버의 하드드라이브에 물리적인 변화가 일어나는것을 감지하여 실시간으로 하위서버가 상위서버의 변동사항을 업그레이드 하는 프로그램이었던 것으로 기억이 나네요...그러나 개발이 중단된 것으로 알고 있습니다.

역쉬 만만한것이 rsync 나 등등이겠지요...
최근엔 데이터를 NAS 나 SAN 등으로 공유하는 스토리지 방식을 많이 채택하고 있습니다. 가격 물론 비싸죠..--
 


 


위의 그림과 같이 시스템이 자동으로든 인위적으로 든 heartbeat 데몬을 가동시킵니다.

첫번째
heartbeat 데몬이 가동되면서 현재 자신의 위치를 설정파일에 입각하여 인지 합니다.

두번째
현재 자신이 마스터 서버로 설정되어 있다면(/etc/ha.d/haresource) heartbeat 는 VIP 를 자신의 eth0:0 로 취하고 haresource 파일에 기재되어 있는 데몬을 가동시킵니다.

세번째
punk 데몬이 가동되면서 ipvsadm 의 설정이 로드되어 로드발란싱을 시동합니다.

네번째
mon 데몬또한 가동시켜 각 노드들의 상황을 체크하여 ipvsadm 설정을 업그레이드 합니다.

위의 도표는 제가 예전에 테스트하고 리포트 때릴때 대충 만들어 뒀던 것입니다.
모..그다지 세부적인 표는 아니지만 이해하시는데는 별 무리가 없으리라 싶어 참조용으로 올립니다.


자아..지금까지의 것들을 가지고 무엇을 만들 수 있는지 한번 보기로 하죠..
아래는 가장 무난히 쓰일만한 방식의 웹 서비스 입니다.

 

10  [리눅스클러스터링] 죽여도죽여도 죽지 않는 클러스터링 서버 만들어 보기(이론)
 
우선 우리가 아래에서 배웠던 것들에서 빠진게 무엇인지 볼까요?

네.. 마스터와 슬레이브가 둘다 죽으면 어떡하나..입니다. 그럼 다른 웹서버들이 아무리 많아도 하나도 돌지 않게 되어버리겠죠.
그래서 국내 모 업체에서는 모든 서버가 다 마스터역할 을 할 수 있고 모든 서버가 다 슬레이브 역할을 할 수 있는 알고리즘을 개발하여 시판하고 있습니다.
좋은 알고리즘 입니다..^^

그러나 요렇게 하는 방법도 있을 수 있겠죠..그냥 재미로 읽으시길 바랍니다.



왜 문제가 되는가.. 왜 문제가 되냐면 답은 간단하다..

마스터 서버와 슬레이브 서버가 모두 죽어버렸다면 어떻게 할까요?

그렇습니다..아무리 노드들이 많이 붙어 있어도 이런 방식으론 마스터와 슬레이브 모두가 다운된다면 다른 모든 서버들은 무용지물이 되어버리게 마련이죠.

이해가 안된다면 다음의 설정을 보세요.


인용:
나는 지금 현재 heartbeat 와 ipvsadm 으로 구성된 클러스터 노드 두대와 실제 웹서비스를 하기위한 노드 두대를 가지고 있다..
총 4대 이다..

1. master : king
2. slave : knight
3. node1 : 백성1
3. node2 : 백성2

그런데 king 서버가 다운 되는 현상이 발생했고 그 순간 knight 서버가 king 서버의 권한을 위임받았지만 알마 있지 않아 knight 노드에 심각한 문제가 발생하여 다운되고 말았다..

로드발란싱을 해주어야 할 두대의 서버가 모두 다운되어 버린것이다.

그러면 백성1과 백성2 는 어찌해야 하는가...

그렇다..그냥 그렇게 홀로 외로이 외부로 나가지도 못하는 서비스를 하고만 있는 것이다...


현재 리눅스 클러스터링의 모순은 여기에 있습니다.

생각해 보죠..군대에서 중대장이 죽으믄 소대장이 중대장 역할을 합니다..(인사계가 한다는 사람 나가!)
그런데 소대장이 죽었다고 그 부대가 전멸하는가..? 그건 아니지요..

분대장도 있고 병왕고(!)도 있습니다...식기..침상..바닥..다 있구요...(이해가 안가시는 분은 무척이나 좋은 군대에 계셨었던 모양입니다..)

그들이 순차적으로 지휘자의 권한을 갖는것입니다.

문제점은 이렇구요..그럼 해결책은..

계획 세우기

자 이제 계획을 세워보죠.

계획을 세우기에 앞서 나는 여기서 실제 코딩의 예는 보여주지 않을 것입니다. 단순한 이론입니다.
이는 제가 재 이쪽의 개발을 하지 않는 관계로 완성된 프로그램 같은것이 없기 때문입니다.
그러나 예전에 잡아놓았던 알고리즘만큼은 어느정도 정리가 되어있으므로 그것을 기재하는 것입니다.

아까 위에서도 얘기했지만 모든 서버의 클러스터 발란싱화가 되어 있는 서버는 국내에도 있습니다.
그렇지만 모든것이 그렇듯 있다고 해서 그 대체품이 없으란 법은 없으니까..

물론 저보다 더 나은 알고리즘을 생각해 본 사람도 있을 수 있습니다.
수많은 알고리즘 중 그냥 한 자리를 차지할 뿐입니다.

이것또한 완벽히 계획된 알고리즘은 아니며 단순히 이해차원에서 봐주길 바라구요..


우선 문제점은 알았습니다..그렇다면 그 문제점을 해결해 나가보도룩 하죠.

아까도 이야기 헸다 시피 master 나 slave 가 죽으면 나머지 노드들은 그자리에서 주저 않아 버리고 맙니다.

그렇다면 각 노드들도 master 나 slave 의 역할을 하기 위해서 어떻게 해야 하는가..

인용:
1. 순차적인 계급이 필요하다..

군대와 같이 모든 노드들이 자신의 서열순위를 기억해야 한다..이는 대때로 업그레이드가 되어야 하며 내 상관이 전역(노드에서 탈퇴)하고 나면 내가 그 상관의 역할을 맡아야 함과 마찬가지 방식이다.


인용:
2. 지금까지의 구조에서는 불가능 하다.
지금까지 엮은 강좌의 내용과 사용된 프로그램으로는 부족하다..또 있어야 한다..


단순하게 위의 두가지 조건만 가지고 이야기를 풀어가 봅시다.

순차적인 계급이 있어야 한다는 부분에 대해서..

어떤 프로세서 하나가 각 노드들에게 각각의 서열을 알려주어야 한다.
그것에는 몇가지 정보가 기록되어 있어야 하는데..

대충 나누어 보면 아래와 같다.


1. VIP

2. 현재 남아있는 각 노드들의 직위

3. 그외 기타 정보

그러면 답이 대충 나오지요..

무언가 위의 정보를 적시에 전송해주고 받을 프로그램이 있어야 한다는 말인데..

여기서는 이 데몬의 이름을 cast_server 라 지칭 하겠습니다.



위의 그림을 보면 cast_server 와 case_client 라는 부분이 보일것입니다.
그 부분이 직접 개발해야 하는 부분으로 클러스터 노드속에 한 부분을 차지하고 있는것이 보일텐데요..

순서대로 보도록 하죠.

어느 부분에서건 cast 데몬은 정해진 시간동안 끊임없이 데이터를 보내고 받습니다.
master 서버의 경우 cast_server 는 현재의 상황을 실시간으로 정리하여 차후 문제가 생기기 이전 문제에 대한 답을 각 노드들에게 발송하게 되구요.

보다시피 mon 에서 접수한 각 노들들의 정보또한 발송하게 됩니다.
예를 들어 node1 이 다운됐다고 가정했을 때 mon 은 다운된 서버의 ipvsadm 정보를 버리게 되고.
이와함께 cast_server 에서는 현재의 계급체계 설정에서 탕퇴한 노드를 제외하고 다시 직위체계를 재작성 하여 각 노드들에게 보내는 것입니다.

그리고 각 노드들은 cast_server 로의 전달 메세지를 받아서 저장하고 있다가 master 와 slave 가 다운됐을 경우 저장된 설정파일을 찾아 그 직위로 업그레이드 되는것이죠.

물론 전송간에 일어날 time rate 의 설정은 매우 중요합니다.

자..그럼 세부적으로 cast client 의 구조를 자세히 보도록 하죠.



단순하게 설명하면 이렇다.. cast client 는 설정파일을 입수하여 그것이 자신더러 무엇을 하라는 것인지를 일단 확인합니다.
그리고 자신의 서열이 master 나 혹은 slave 로 기재되어 있을때는 얼씨구나 하고 master 로서의 역할, 또는 slave 로서의 역할로 옮기게 되는 것입니다.

아..이론은 여기까지 생각해보고 안해봤습니다.

 
11  [리눅스클러스터링]ipvsadm 이 잘 돌고 있는지 테스트하기!
 
그냥 인터넷 익스플로러로 테스트를 하면 이게 정말 바뀌는지 아닌지 캐쉬때문에 확인할 길이 막막해 집니다.
그래서 아까 하셨던 것처럼 아파치의 설정도 바꿔보고 합니다.

캐쉬가 저장되지 않는 옛날 브라우저를 사용해도 되지만 마땅히 그럴만 한 브라우저를 찾기도 애매하군요.

그럼 다른 리눅스 시스템에서 이렇게 한번 해 보지요.
우선 각 노드들마다 index.html 의 타이틀을 바꿉니다. 아래처럼 바꾸면 보기가 깨끗합니다.

인용:
1번 노드 = "Cluster Node [ 1 ] "
2번 노드 = "Cluster Node [ 2 ] "
3번 노드 = "Cluster Node [ 3 ] "


클러스터가 설정된 시스템 말고 그 이외의 시스템에서 아래의 perl 모듈을 설치하고 아래의 소스와 같은 파일을 하나 생성합니다.



필요한 모듈
LWP::UserAgent / 이 모듈은 가상의 브라우저를 생성해 줍니다.
HTTP::Request / 이 모듈은 GET 요청을 생성합니다.
HTTP::Response / 이 모듈은 사용자 에이전트가 요청을 수행 했을 때 반환하는 객체형입니다. 에러 및 내용확인을 위해 이것을 체크하게 됩니다.
URI::Heuristic / url 입력시 http:// 나 www.perl.com 를 perl 이라고 쳐도 자동으로 붙여주는 툴입니다.
참조 : PERL COOK BOOK(한빛 미디어 번역서)

-----get_title.pl 의 소스  아래의 소스는 PERL COOK BOOK 의 소스에 반복횟수만 추가한 것입니다.---
소스코드:
#!/usr/bin/perl -w # #클러스터 서버들의 타이틀을 가져오는 프로그램. #참조 : PERL COOK BOOK 868P # use LWP::UserAgent; use HTTP::Request; use HTTP::Response; use URI::Heuristic; my $raw_url = shift or die "usage: [code]#!/usr/bin/perl -w
#
#클러스터 서버들의 타이틀을 가져오는 프로그램.
#참조 : PERL COOK BOOK 868P
#
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use URI::Heuristic;
my $raw_url = shift or die "usage: $0 url\n";
for ( $i = 0 ; $i <= 100000 ; $i++){         # 이곳의 숫자를 변경해 반복횟수를 변경한다.
my $url = URI::Heuristic::uf_urlstr($raw_url);
$| = 1;
printf "%s =>\n\t", $url;
my $ua = LWP::UserAgent->new();
$ua->agent("schmozilla/v9.14 Platinum");
my $req = HTTP::Request->new(GET=>$url);
$req->referer("http://wizard.yellowbrick.oz");
my $response = $ua->request($req);
if ($response->is_error()){
        printf "%s\n", $response->status_line;
        }
else{
        my $count;
        my $bytes;
        my $content = $response->content();
        $bytes = length $content;
        $count = ($content =~ tr/\n/\n/);
        printf "%s (%d lines, %d bytes)\n", $response->title(), $count, $bytes;
        }
}[/code] url\n"; for ( $i = 0 ; $i <= 100000 ; $i++){         # 이곳의 숫자를 변경해 반복횟수를 변경한다. my $url = URI::Heuristic::uf_urlstr($raw_url); $| = 1; printf "%s =>\n\t", $url; my $ua = LWP::UserAgent->new(); $ua->agent("schmozilla/v9.14 Platinum"); my $req = HTTP::Request->new(GET=>$url); $req->referer("http://wizard.yellowbrick.oz"); my $response = $ua->request($req); if ($response->is_error()){         printf "%s\n", $response->status_line;         } else{         my $count;         my $bytes;         my $content = $response->content();         $bytes = length $content;         $count = ($content =~ tr/\n/\n/);         printf "%s (%d lines, %d bytes)\n", $response->title(), $count, $bytes;         } }

                
위의 소스를 퍼미션을 755 로 바꾼후 실행해 봅시다.

인용:
./get_title.pl http://123.123.123.1/


저의 경우는 아래와 같습니다.


소스코드:
[elf@storm test_program]$./get_title.pl http://kingdom.punklogic.net/ http://kingdom.punklogic.net/ =>        Cluster Node [ 4 ] (29 lines, 1107 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 2 ] (29 lines, 1056 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 3 ] (29 lines, 1083 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 1 ] (29 lines, 1026 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 4 ] (29 lines, 1107 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 2 ] (29 lines, 1056 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 3 ] (29 lines, 1083 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 1 ] (29 lines, 1026 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 4 ] (29 lines, 1107 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 2 ] (29 lines, 1056 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 3 ] (29 lines, 1083 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 1 ] (29 lines, 1026 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 4 ] (29 lines, 1107 bytes) http://kingdom.punklogic.net/ =>        Cluster Node [ 2 ] (29 lines, 1056 bytes)


여러분도 이렇게 번호가 바뀌시나요..?
안되시면 혹시 순서에서 빼먹은게 없나 확인 해 보세요.
만약 이렇지 않고 한 번호만 접속이 된다거나, 또는 아예 접속이 되지 않는다거나 한다면 각 노드들마다 arp 캐쉬가 hidden 값으로 제대로 되어 있는지 확인하시고 lo:0 에 VIP(여기서는 123.123.123.1) 이 설정되어 있는지확인 해 보세요.

 
12  [무용담^^]도메인 여러개 동시에 자동생성 하기

엇그제 서버재구축 요청을 받고 IDC 에 갔었습니다.
웹호스팅 서버였는데 도메인이 약 200여개 정도 되더군요..버전은 알짜6.2 가 깔려있고..

리부팅하니 파일체크하느라 정신없더군요..^^ 역시 ext2 는..무섭습니다..

새로 세팅하고 기존 네임서버 설정파일을 옮겨놓았는데 버전차이 때문인지 ..순간 아뿔사..네임서버 설정 정말 가관이었습니다..--a..
하여튼 그 200여개의 도메인이 하나도 인식이 안되더군요..기본적으로 자기자신도 못찾는..--a......아..모야모야..

그래서 이렇게 했습니다.
우선 마스터 도메인(호스팅서버의 도메인이죠)을 설정해놓고..나머진..그래도 다행이 파일 이름은 정리가 잘 되어있더군요..
zone-abc.com
zone-bcd.com

등등....

그래서 일단 기존의 설정사항을 참조하기 위하여 /var/named/ 폴더에 old 라는 폴더를 만들어 모두 옮기고..
이렇게 했습니다.

인용:
#mkdir /var/named/old
#mv /var/named/* /var/named/old
#cd /var/named/old
#ls > name_list


그런담에 vi 로 name_list 를 열어서 :%s/zone-//g 로 앞에 'zone-' 을 잘라주고.. 저장했습니다.
named_list 파일에는 깔끔하게 도메인 이름만 들어가 있는거지요..:-)

그담에 perl 로 급하게 아래의 스크립트를 만들었습니다.

소스코드:
 1 #!/usr/bin/perl -w 2 3 open(FILES,"/var/named/old/name_list"); 4 @array = <FILES>; 5 foreach $f(@array){ 6         chomp($f); 7         # named 파일 만들기 8         system("cat /var/named/head > /var/named/zone-$f"); 9         system("echo \"@                IN      SOA     $f. root.$f. (\" >> /var/named/zone-$f"); 10        system("cat /var/named/tail >> /var/named/zone-$f"); 11 12        # named.conf 에 추가할 내용만들기 13 system("echo \"zone '$f'             IN { type master; file 'zone-$f'; allow-update        { none; }; };\" >> /var/namedlist"); 14 }


8번 라인에서 cat 하는 head 라는 파일의 내용은 아래와 같습니다.

소스코드:
$TTL 86400


perl 에서 변수를 $ 로 인식하는 바람에 생각도 안나고 해서 급한맘에..^^

tail 은 이하 공통된 내용을 뿌려주는것이구요..

그래서 named 파일들 정상적으로 생성해 주고..
named.conf 파일에 추가할 내용도 /var/namedlist 라는 파일에 새로이 다시 만들었습니다.

위에 명령대로 라면 /var/named 폴더에 네임서버 설정파일들은 모두 생성이 된 상태지요..

그런 담에 /etc/named.conf 파일에 추가해 주면 되는데 그 내용은 /var/namedlist 파일에 있으니까..쉘에서 이렇게 해주면 되지요.

소스코드:
#cat /var/namedlist >> /etc/named.conf 


그런데 문제는 named.conf 파일에 내용이 " 가 아니라 ' 로 되어있다는 거지요..이건 인식을 못하고 에러로 처리합니다.

다시 /etc/named.conf 파일을 vi 로 열어서 :%s/'/"/g  해서 끝..

음..perl 을 한동안 안만진 댓가로 출력할때 변수나 " 출력하는걸 잊어버렸습니다. 그 댓가로 위와같은 엄청난 삽질을..--
 

 

13  [보안]tripwire 설정파일 twpol.txt 파일 편하게 편집하기
tripwire 설치에 관한 내용들은 많이 있으니까 별도로 다루진 않겠습니다.
rpm 으로도 있고하니 모..^^;; 편하게 쓰지요..지속적으로 돌아야 하는 프로그램도 아니니 굳이 소스컴파일 할 필요가 없다고 봅니다.

우선 설치하고 나면 아마 /etc/tripwire 폴더에 설정파일을 생성하는 twinstall.sh 이라는 파일이 생깁니다.

1. ./twinstall.sh
./twinstall.sh 를 실행하면 패스워드 지정해 주고 나서 키를 생성하게 되지요. 이건 만약 해킹을 당한시라고 해도 설정파일을 누가 손 못대게 하기위해서 패스워드를 인코딩 하는 일을 하는것입니다. 몇분 걸리지요..패스워드를 한 5~6회 넣어주는것 같습니다.


2. tripwire --init
twinstall.sh 를 실행하고 나면 몇몇 설정파일들이 생성됩니다.
이게 기본 설정파일을 이용해 tripwire --init 를 실행해 봅니다.
tripwire --init 하는 순간 엄청난 양의 에러메세지를 만나게 됩니다.
전부다 파일을 찾을 수 없다는 내용입니다.
그런데 이게 한두개가 아니라 거의 백여개에 육박하게 볼수가 있는데요..
일일히 다 찾아서 주석으로 막아주는 것도 곤욕입니다.

서버용으로 리눅스를 설치하면 이것저것 다 빼고 깔아버리기 때문에 tripwire -init 시에  No such file or directory 라고 수두룩하게 나오지요..

이럴땐 설정파일을 좀 더 편하고 확실하게 수정할 수 있는방법이 없을까 생각을 해 봤습니다.

우선 이렇게 합니다.

[root@xxxx tripwire]# tripwire --init 2> error
Please enter your local passphrase:
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***

에러메세지는 error 로 보내라는 것이죠..


그래서 설정시에 나오는 에러메세지를 모두 error 이라는 파일로 생성합니다.

생성되고 나서 error 이라는 파일을 열어보면

Generating the database...
*** Processing Unix File System ***
### Warning: File system error.
### Filename: /proc/scsi
### No such file or directory
### Continuing...
### Warning: File system error.
### Filename: /usr/sbin/fixrmtab
### No such file or directory
### Continuing...
### Warning: File system error.
### Filename: /usr/share/grub/i386-redhat/e2fs_stage1_5
### No such file or directory
### Continuing...
### Warning: File system error.
### Filename: /usr/share/grub/i386-redhat/fat_stage1_5
### No such file or directory
### Continuing...
### Warning: File system error.
### Filename: /usr/share/grub/i386-redhat/ffs_stage1_5
### No such file or directory
### Continuing...
### Warning: File system error.
### Filename: /usr/share/grub/i386-redhat/minix_stage1_5
### No such file or directory
### Continuing...
.......................

등으로 정형화된 에러메세지가 보입니다.


이걸 에디트 플러스 등으로 열어서 일단 쓸모없는 부분을 다 전체바꾸기로 없애버리고 뒤의 굵게 지정된 부분들만 남겨놓습니다.
이 방법을 모르시는 분은 없겠죠..:-)


다 하고 나면 이렇게 되겠죠..

인용:
/proc/scsi



/usr/sbin/fixrmtab



/usr/share/grub/i386-redhat/e2fs_stage1_5



/usr/share/grub/i386-redhat/fat_stage1_5



/usr/share/grub/i386-redhat/ffs_stage1_5



/usr/share/grub/i386-redhat/minix_stage1_5


듬성듬성 보기 흉하니 빈줄을 마저 없앤 후 정렬합니다.

인용:
/proc/scsi
/usr/sbin/fixrmtab
/usr/share/grub/i386-redhat/e2fs_stage1_5
/usr/share/grub/i386-redhat/fat_stage1_5
/usr/share/grub/i386-redhat/ffs_stage1_5
/usr/share/grub/i386-redhat/minix_stage1_5


그럼 이제 이것들이 모두 없는 파일이라는 것이겠죠..
이것들을 twpol.txt 에서 찾아서 주석처리 해야 하는데..


실행파일을 하나 만들어 봅니다.
파일명을 여러분이 좋으실 대로 만드시구요..

소스코드:
#!/usr/bin/perl -w open(FILES,"/etc/tripwire/error"); @array = <FILES>; foreach $f(@array){        chomp($f);                system("perl -pi -e 's/$f/#$f/' twpol.txt"); }


간단한 코드지만 해석한다면 /etc/tripwire/error 이라는 파일을 열어서 @array 변수에 한줄씩 저장한다음 twpol.txt 파일의 내용중 해당 줄과 같은 것의 앞에 # (주석) 코드를 막으라는 것입니다.

만들고 실행합니다.

그리고 나서 twpol.txt 파일을 보면 주석처리된 부분을 보실 수 있습니다.

이제 다시 ./twinstall 하고 나서 tripwire --init 해 보세요..
에러메세지가 사라졌을 것입니다.
추가하고 싶은 내용은 추가하시면 되구요..

그리고 이제 리포트를 이메일로 받고싶을때 어떻게 하면 좋을까요..
/bin 폴더에 tripwire-report 라는 파일을 생성합니다.


소스코드:
#!/bin/sh /usr/sbin/tripwire -m c | mail -s " Tripwire 검사보고 " elf@clusterkorea.org


그리고 crontab 에 아래와 같이 등록합니다.

소스코드:
0 5  * * * /bin/tripwire-report


그럼 매일 새벽 다섯시 정각에 변동사항을 찾아서 위에 등록된 이메일로 리포트를 발송해 줄것입니다.
 
 
14  [강좌]PostgreSQL 의 설치

PostgreSQL 설치및 기본 사용법


PostgreSQL 의 공식 사이트
http://www.postgresql.org/


최근 postgresql 의 사용이 늘어나는 추세이니 발빠른 서버관리자들은 이미 사용법을 익히고 있을 것으로 판단됩니다만
언제나 모르는 사람은 있는법. 딱 서버관리자가 알아야 할 만큼만의 내용을 써 보겠습니다.

서버관리자가 해야 하는것은 크게 나누면 설치, 관리, 튜닝, 백업, 리스토어,검색,삭제 정도라고 볼 수 있지요.
그렇기 때문에 최소한 모든 프로그램의 사용법을 그 분야의 전문가 수준은 아니더라도 어느수준이상을 알고 있어야 합니다.
언제 써먹을지도 모르지만 말이죠.

그럼 시작하겠습니다.

 

1)설치
PostgreSQL 을 rpm 으로 설치하는것은 그냥 설치만 하면 자동으로 다 알아서 만들어주고 처리해 주니 소스설치에 대한
부분만 설명하고 넘어가겠습니다.

공식 다운로드 배포처는 postgresql.org 입니다만 여러곳에서 링크하고 있으니 다운 받으시면 되구요.
postgresql-7.3.2.tar.gz 버전으로 설명을 하도록 하겠습니다.

첫째로 압축을 해제하구요.

 

 


[root@ora local]# tar xvfzp postgresql-7.3.2.tar.gz
postgresql-7.3.2/
postgresql-7.3.2/config/
postgresql-7.3.2/config/libtool.m4
postgresql-7.3.2/config/java.m4
postgresql-7.3.2/config/ac_func_accept_argtypes.m4

......주루륵............


postgresql-7.3.2/README
postgresql-7.3.2/configure.in
postgresql-7.3.2/configure
postgresql-7.3.2/register.txt
[root@ora local]#

 

풀리고 나면 압축이 풀린 폴더로 들어갑니다.

 


[root@ora local]# cd postgresql-7.3.2
[root@ora postgresql-7.3.2]# ls
COPYRIGHT       INSTALL   aclocal.m4  configure.in  register.txt
GNUmakefile.in  Makefile  config      contrib       src
HISTORY         README    configure   doc
[root@ora postgresql-7.3.2]#


설정파일을 시스템에 맞도록 갱신하는 작업을 합니다.
수많은 옵션이 있지만 추후에 ./configure --help 로 확인하기로 하고 우선 필요한 설치폴더 설정과
멀티바이트를 지원하도록 합니다.

 


[root@ora postgresql-7.3.2]# ./configure --prefix=/usr/local/pgsql --enable-multibyte
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking which template to use... linux
checking whether to build with 64-bit integer date/time support... no
checking whether to build with recode support... no
checking whether NLS is wanted... no


.......주루륵......................


config.status: linking ./src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking ./src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking ./src/makefiles/Makefile.linux to src/Makefile.port
[root@ora postgresql-7.3.2]#

 

설정이 무리없이 끝나면 make 와 make install 을 합니다.

 


[root@ora postgresql-7.3.2]# make ; make install
make -C doc all
make[1]: Entering directory `/usr/local/postgresql-7.3.2/doc'
gzip -d -c man.tar.gz | /bin/tar xf -
for file in man1/*.1; do \
  mv $file $file.bak && \

....................

And, so that we have an idea of who is using what, please connect to the
following registration URL:

        http://www.pgsql.com/register/submit.php


Thank you for choosing PostgreSQL, the most advanced open source database
engine.


[root@ora postgresql-7.3.2]#

 


설치가 다 되었으면 이제 설치된 폴더로 이동합니다.

 


[root@ora postgresql-7.3.2]# cd /usr/local/pgsql/
[root@ora pgsql]# ls
bin  doc  include  lib  man  share
[root@ora pgsql]# cd bin
[root@ora bin]# ls
clusterdb   dropdb    initdb        pg_controldata  pg_encoding   postgres
createdb    droplang  initlocation  pg_ctl          pg_id         postmaster
createlang  dropuser  ipcclean      pg_dump         pg_resetxlog  psql
createuser  ecpg      pg_config     pg_dumpall      pg_restore    vacuumdb
[root@ora bin]#

 

데이터베이스를 초기화 하고 작동시키기전에 현 postgresql 을 가동할 권한자를 생성합니다.

 


[root@ora bin]#adduser -d /usr/local/pgsql postgres
[root@ora bin]# mkdir /usr/local/pgsql/data
[root@ora bin]# chown -R postgres.postgres /usr/local/pgsql/
[root@ora bin]#

 

그런다음 데이터베이스를 초기화 하기위하여 postgres 계정으로 로그인 한 후 데이터베이스를 초기화합니다.

 


[root@ora bin]# su - postgres
[postgres@ora pgsql]$
[postgres@ora pgsql]$ ls
bin  data  doc  include  lib  man  share
[postgres@ora pgsql]$ cd bin
[postgres@ora bin]$ ls
clusterdb   dropdb    initdb        pg_controldata  pg_encoding   postgres
createdb    droplang  initlocation  pg_ctl          pg_id         postmaster
createlang  dropuser  ipcclean      pg_dump         pg_resetxlog  psql
createuser  ecpg      pg_config     pg_dumpall      pg_restore    vacuumdb

[postgres@ora bin]$ ./initdb  /usr/local/pgsql/data/
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale ko_KR.euckr.
This locale setting will prevent the use of indexes for pattern matching
operations.  If that is a concern, rerun initdb with the collation order
set to "C".  For more information see the Administrator's Guide.

Fixing permissions on existing directory /usr/local/pgsql/data/... ok
creating directory /usr/local/pgsql/data//base... ok
creating directory /usr/local/pgsql/data//global... ok
creating directory /usr/local/pgsql/data//pg_xlog... ok


...........략................


Success. You can now start the database server using:

    ./postmaster -D /usr/local/pgsql/data/
or
    ./pg_ctl -D /usr/local/pgsql/data/ -l logfile start

[postgres@ora bin]$

 

라고 하고 기본데이터베이스가 생성됩니다.

데이터베이스를 가동시켜 보도록 합니다.

 

[postgres@ora bin]$ ./postmaster -D /usr/local/pgsql/data/ &
[1] 723
[postgres@ora bin]$ LOG:  database system was shut down at 2003-05-26 11:43:55 K
ST
LOG:  checkpoint record is at 0/8018FC
LOG:  redo record is at 0/8018FC; undo record is at 0/0; shutdown TRUE
LOG:  next transaction id: 480; next oid: 16976
LOG:  database system is ready

[postgres@ora bin]$ ps ax|grep post
  351 pts/0    S      0:00 su - postgres
  723 pts/0    S      0:00 ./postmaster -D /usr/local/pgsql/data/
  724 pts/0    S      0:00 postgres: stats buffer process
  726 pts/0    S      0:00 postgres: stats collector process
  728 pts/0    S      0:00 grep post
[postgres@ora bin]$


데이터베이스가 작동된것이 확인 됩니다.

로그인 해 보죠.,

 


[postgres@ora bin]$ ./psql template1
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=#

 

'template1=#' 이것이 postgresql의 명령어 대기쉘입니다.

우선은 postgres 의 패스워드를 변경하고 postgresql 을 패스워드 모드로 작동하게 하겠습니다.
postgresql 은 기본적으로 아무 사용자가 접근가능한 모드로 작동이 되더군요.이유는 모르겠습니다.
제가 잘못 안 것일 수도 있고..--a..

패스워드를 먼저 변경하도록 하지요.

 


template1=# alter user postgres with password '1234';
ALTER USER
template1=# select*from pg_user;
 usename  | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig
----------+----------+-------------+----------+-----------+----------+----------+-----------
 postgres |        1 | t           | t        | t         | ******** |          |
(1 row)

template1=#

 

그리고 일단 빠져나온 후 /usr/local/pgsql/data 폴더로 이동하여 pg_hba.conf 파일을 열어서 아래의 내용을 바꿉니다.

 


template1=# \q
[postgres@ora bin]$ cd ../data/
[postgres@ora data]$ ls
PG_VERSION  global   pg_hba.conf    pg_xlog          postmaster.opts
base        pg_clog  pg_ident.conf  postgresql.conf  postmaster.pid
[postgres@ora data]$
vi pg_hba.conf

 

 

pg_hba.conf 파일의 내용중

==============================================================================
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

local   all         all                                             trust
host    all         all         127.0.0.1         255.255.255.255   trust
==============================================================================

==============================================================================
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD

local   all         all                                             password
host    all         all         127.0.0.1         255.255.255.255   password
==============================================================================

위와같이 trust -> password 로 바꾸어 준 뒤 저장합니다.

그리고 데이터베이스를 재시동 하고 로그인 해 봅니다.

 


[postgres@ora data]$ cd ../bin
[postgres@ora bin]$ ./pg_ctl restart -D /usr/local/pgsql/data/
waiting for postmaster to shut down....LOG:  smart shutdown request
LOG:  shutting down
.LOG:  database system is shut down
.done
postmaster successfully shut down
postmaster successfully started
[postgres@ora bin]$ LOG:  database system was shut down at 2003-05-26 12:12:45 KST
LOG:  checkpoint record is at 0/81402C
LOG:  redo record is at 0/81402C; undo record is at 0/0; shutdown TRUE
LOG:  next transaction id: 569; next oid: 16977
LOG:  database system is ready

[postgres@ora bin]$ ./psql template1
Password: ****
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

template1=#

 


자아 보시다 시피 패스워드를 물어봅니다.
그럼 여기까지 잘 따라 하셨으면 다음강좌에서는 mysql 과 비교하여 사용자생성,수정,데이터베이스생성등에 대해서 간단하게 알아보도록 하겠습니다.

수고 많으셨습니다.



15  [강좌]PostgreSQL 사용자 생성및 데이터베이스 생성

 

1)유저생성 및 데이터베이스 생성

데이터베이스 생성은 두가지 방법으로 이루어 집니다.
우선 createdb 라는 프로그램을 이용하는 방법과 postgresql 쉘내에서
CREATE DATABASE [DBNAME]  을 하는 방법이 있습니다.
CREATE DATABASE [DBNAME] 의 문법이야 어디든 같으니까 createdb, createuser 를 이용하는 방법만 간략하게 들어보겠습니다.

 

현재의 나는 'postgres' 의 계정으로 작업을 합니다.

1)데이터베이스 생성

 


[postgres@ora bin]$ ./createdb
Password: ****
CREATE DATABASE
[postgres@ora bin]$ ./psql
Password: ****
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# \l
        List of databases
   Name    |  Owner   | Encoding
-----------+----------+-----------
 postgres  | postgres | SQL_ASCII  <====== 생성된데이터베이스
 template0 | postgres | SQL_ASCII
 template1 | postgres | SQL_ASCII
(3 rows)

postgres=#


단순하게 createdb 만 입력하면 현재 자신의 계정과 동일한 이름의 데이터베이스를 생성합니다.

\l  (소문자 L 입니다.) 명령어는 나중에 다시 설명하겠습니다.
그럼 현재 데이터베이스를 삭제 해 보도록 하겠습니다.

 

 

2)데이터베이스 삭제

\q 를 이용하여 빠져나온 후 dropdb [DBNAME] 을 이용하여 데이터베이스를 삭제합니다.

 


postgres=#
\q

[postgres@ora bin]$ ./dropdb postgres
Password:****
DROP DATABASE
[postgres@ora bin]$ ./psql
Password:****
FATAL:  Database "postgres" does not exist in the system catalog.
psql: FATAL:  Database "postgres" does not exist in the system catalog.
[postgres@ora bin]$


postgres 라는 데이터베이스가 없다는 에러메세지를 냅니다.

자..그럼 계정을 하나 생성하고 그 게정에 맞도록 데이터베이스를 생성하는 작업을 한번 해 보겠습니다.

3)test 라는 계정을 생성하고 그 계정에게 TestDB 라는 데이터베이스를 사용할 수 있도록 생성해 준다.

 


[postgres@ora bin]$ ./createuser test
Shall the new user be allowed to create databases? (y/n) n
Shall the new user be allowed to create more new users? (y/n) n
Password:****
CREATE USER
[postgres@ora bin]$

 

!참고)아까부터 계속 입력하는 패스워드는 모두 postgres 의 데이터베이스 비밀번호 입니다.

데이터베이스 생성권한및 사용자 생성권한을 주지 않습니다. 이들이 관리자는 아니니까요..:-)

그러면 현재 상태로는 test 가 어떤 일을 할 수 있을까요? 아무런 일도 할 수 없습니다.
아직 해줄일이 남았지요.


test 를 위한 데이터베이스를 생성해 주도록 합니다.

 


[postgres@ora bin]$ ./createdb -O test TestDB
Password:****
CREATE DATABASE
[postgres@ora bin]$


 

 

owner 가 test 인( -O test) TestDB 라는 데이터베이스를 만들어 주는 것입니다.
그리고 test 가 로그인 할 수 있도록 패스워드를 지정해 주어야겠지요.
postgres 계정으로 로그인 해서 test 의 패스워드를 지정해 줍니다.

 


[postgres@ora bin]$ ./psql template1
Password:****
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# alter user test with password '1010';
ALTER USER
postgres=#


 

 

test 라는 계정의 패스워드를 1010 으로 설정합니다.

빠져나온 후 test 라는 아이디로 TestDB 에 접속한번 해 보지요.

 


postgres=# \q
[postgres@ora bin]$ ./psql -U test TestDB
Password:**** <test 의 비밀번호인 '1010' 을 입력합니다.>
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

TestDB=>


 

 

로그인 되었습니다. 현재의 나는 test 이며 TestDB 로 접속된 것입니다.

이제 TestDB 데이터베이스 내에서 테이블 생성및 수정이 자유롭습니다.

한가지 제가 공부했던 바로 문제가 되었던 부분이,

postgresql 에서는 데이터베이스 계정사용자들은 모두 다른사람 소유의 데이터베이스에 자신의 테이블을 만들 수 있다는 것이었습니다.

호스팅 서비스등에서 사용하기는 꽤나 애매한 것이지요..

 

그런데 이런 문제는 7.3.x 버전이상의 postgresql 에서는 schema 라는 개념이 도입되어 해결이 되었다고 합니다.

 

사용자별로 별도의 용량이나 권한을 주어서 여러 사람이(호스팅등) 사용하기에는 적합하지 않다는 개인적인 생각입니다.


 

16  간단 LVS 구축 강좌
 
간단하게 웹서버를 로드밸런싱 할수 있는 LVS 강좌입니다. 자세하게는 쓰지 못했으나 Redhat 9 에 설치를 해보았습니다. 시간관계상^^ 단순 ipvsadm 을 이용한 로드밸런싱부분만 들어가있구요.추후에 여러가지 기능과 다른 방식의 LVS들도 강좌로 올리도록 하지요.
LVS 구축 강의 입니다. 다음 편에는 더 여러가지 경우에 대해서 그리고, 부한 분산 뿐만 아니라 fail-over까지 다루어 보도록 하겠습니다. 강좌 링크는 아래와 같습니다.

http://www.javalinux.co.kr/ss-cgi/osboard/OsBoardRead.jsp?msgseq=100010000043000&key=&board=10001&order=thread&ptr=0

http://www.javalinux.co.kr/study/linux/virtualserver-2.htm

 

728x90

댓글