LVS Kernel을 이용한 리눅스 부하분산 클러스터 구축
==============================================================================
LVS Kernel을 이용한 리눅스 부하분산 클러스터 구축
==============================================================================
*
* 위 문서는 클루닉스 기술부 내부 기술 세미나용입니다.
* 문서 제작자의 동의 없이 무단 복사 및 배포를 금합니다.
*
* 문서 제작일 : 2004년 8월 23일
* 문서 제작자 : 클루닉스 기술부 서 진우 ( alang@syszone.co.kr )
*
1. 시스템 구축 준비 하기
1.1. 리눅스 부한 분산 클러스터 개론
1.2. 시스템 구축 환경
앞으로 진행할 리눅스 클러스터 시스템 구축을 위해 테스트 환경으로
4대 ( 최소 3대 ) 서버가 필요합니다. Load Balance Server 2대와 일반 웹서버
2대로 구성하여 리눅스 부하분산 클러스터 시스템을 구축할 것 입니다.
시스템 구성은 Master LB 서버와 Slave LB 서버를 두어 Heartbeat를 이용하여
LB 서버의 이중화 ( High availabiltiy )를 구현할 것이고 Mon 을 이용하여
2대의 웹서버에 작업 부하 분산 및 Service Fail Over 가 될수 있도록 구현할
것이다.
1.2.1 시스템 구성도
[ Master LB ] — Heartbeat — [ Slave LB ]
[ Web Server-1 ] [ Web Server-2 ]
1.2.2 시스템 기본 정보
Operating System : Redhat Linux 9 ( Kernel Version : 2.4.27 )
Master LB ip : 211.238.41.167
Slave LB ip : 211.238.41.166
Web Server-1 : 211.238.41.165
Web Server-2 : 211.238.41.164
Virtual ip : 211.238.41.170
Cluster ip ( Encluster 시 필요 ) : 211.238.41.168
LB 서버간의 heartbeat 와 웹서버간의 Data Sync, LB 와 웹서버간의 Mon
server monitering 에 사용되는 네트워크 대역을 Private Network 로 분리
할수도 있다. 이 방법에 대해서는 아래 내용을 충분히 숙지하고, 기본적인
리눅스 네트워킹에 대한 이해만 있으면 충분히 구축할 수 있을 것이다.
1.2.3 설치 시 필요 패키지
Kernel : 2.4.26 이상 ( 본 문서에서는 2.4.27 사용 )
ftp://ftp.kernel.org/pub/linux
ipvs : Kernel 2.4.23 이하 버전에만 해당함
http://linuxvirtualserver.org/software
ipvsadm-1.21
http://linuxvirtualserver.org/software
arp hidden patch
http://www.ssi.bg/~ja
Mon 관련 Perl 모듈
ftp://ftp.bora.net/pub/CPAN
ftp://ftp.kornet.net/pub/CPAN
ftp://ftp.nuri.net/pub/CPAN
CPAN 을 이용한 다운 방식도 있음 -> 본문 참조
Mon
ftp://ftp.kernel.org/pub/software/admin/mon
Mon.cgi
http://www.nam-shub.com/files/
fping
ftp://ftp.kernel.org/pub/software/admin/mon
heartbeat
http://linux-ha.org/download
rsync
http://rsync.samba.org/ftp/rsync
total package
ftp://syszone.co.kr/pub/linux/server/lvspkg
2. Open Source 를 이용한 리눅스 부하분산 클러스터 구축
2.1. 리눅스 클러스터 커널 환경 구축
이전에는 리눅스 커널에서 기본적으로 ipvs 기능을 지원 하지 않았기에 별도의
커널 패치를 해주어야 한다. ipvs 를 정상적으로 수행하기 위해서는 ipvs 자체
커널 패치와 direct routing 방식을 지원하기 위해서 arp 문제를 해결해 주는
non-arp alias 인터페이스를 만들때 사용되는 arp hidden 패치를 해주어야 한다.
패치는 각 커널 버전에 맞는 패치를 해야 커널 컴파일 시 에러가 발생하지 않는다.
ipvs 는 커널 2.4.23 까지 ipvs-1.0.10 대 Patch 로 사용이 가능하다.
2.4.26 이후 부터는 ipvs-1.0.11 버전이 커널 속에 기본적으로 포함되어 있다.
2.1.1 커널 2.4.23 이하 버전일 경우 커널 패치 방법
ipvs 패치는 로드밸랜싱 서버에만 해주면 되지만 arp 패치는 로드,리얼서버
모두 해준다. 여기서는 시스템 초기 셋팅은 동일하게 해야 한다. 두대가 모
두 lvs, real_server 역활을 해야 하기 때문이다.
IPVS module 의 설치 방법에는 두가지가 있다. 우선 하나는 모듈로 올리는
방법과 커널에 추가 하는 방법이다.
모듈에 올리는 방법 :
// <path-name> 은 ipvs patch directory
tar xzvf ipvs-0.9.6.tar.gz
cd ipvs-0.9.6/ipvs
make
make -C ipvsadm
make install
insmod ip_vs_wlc.o
커널에 적재하는 방법 :
# cd /usr/src
# tar xjvf linux-2.4.23.tar.bz2
# ln -sf linux-2.4.23 linux
# cd linux
# make menuconfig
-> save -> exit
# zcat ../linux-2.4.23-ipvs.patch.gz | patch p1
# cat ../hidden-2.4.23-1.diff | patch p1
만일 커널 버전에 맞지 않는 Patch 를 할경우 에러가 발생할 수 있으니 반드시
커널 버전에 맞는 patch 를 적용하도록 한다.
2.1.2 커널 컴파일 하기
아래 커널 컴파일 환경은 Kernel 2.4.27 환경이고, 커널 컴파일 관련 옵션 선택
작업은 2.1.1 에서 다룬 kernel 2.4.23 이전 커널의 ipvs 패치 이후 진행 단계와
동일하게 작업 하면 된다.
이후 모든 설명은 커널 2.4.26 이상 환경을 기준을 설명한다.
# tar xjvf linux-2.4.27.tar.bz2
# ln -sf linux-2.4.27 linux
# cd linux
# make menuconfig
아래와 같은 초기 메뉴 화면이 나온다.
x x Code maturity level options —> x x
x x Loadable module support —> x x
x x Processor type and features —> x x
x x General setup —> x x
x x Memory Technology Devices (MTD) —> x x
x x Parallel port support —> x x
x x Plug and Play configuration —> x x
x x Block devices —> x x
x x Multi-device support (RAID and LVM) —> x x
x x Networking options —> x x
x x Telephony Support —> x x
x x ATA/IDE/MFM/RLL support —> x x
기본적은 커널 옵션은 해당 시스템 사항에 맞게 적용하고 여기서는 ipvs 에 관련된
부분만 적용하도록 하겠다.
먼저 Networking options 메뉴로 가서 아래와 같이 옵션을 체크 한다.
x x <*> Packet socket x x
x x [*] Packet socket: mmapped IO x x
x x < > Netlink device emulation x x
x x [*] Network packet filtering (replaces ipchains) x x
x x [ ] Network packet filtering debugging x x
x x [*] Socket Filtering x x
x x <*> Unix domain sockets x x
x x [*] TCP/IP networking x x
x x [*] IP: multicasting x x
x x [ ] IP: advanced router x x
x x [ ] IP: kernel level autoconfiguration x x
x x <M> IP: tunneling x x
x x <M> IP: GRE tunnels over IP x x
x x [*] IP: broadcast GRE over IP x x
x x [ ] IP: multicast routing x x
x x [*] IP: ARP daemon support (EXPERIMENTAL) x x
x x [ ] IP: TCP Explicit Congestion Notification support x x
x x [*] IP: TCP syncookie support (disabled per default) x x
x x IP: Netfilter Configuration —> x x
x x IP: Virtual Server Configuration —> x x
x x < > The IPv6 protocol (EXPERIMENTAL) x x
x x < > Kernel httpd acceleration (EXPERIMENTAL) x x
x x SCTP Configuration (EXPERIMENTAL) —> x x
x x < > Asynchronous Transfer Mode (ATM) (EXPERIMENTAL) x x
x x < > 802.1Q VLAN Support x x
x x — x x
x x < > The IPX protocol x x
x x < > Appletalk protocol support x x
x x Appletalk devices —> x x
x x < > DECnet Support x x
x x < > 802.1d Ethernet Bridging x x
x x < > CCITT X.25 Packet Layer (EXPERIMENTAL) x x
x x < > LAPB Data Link Driver (EXPERIMENTAL) x x
x x [ ] 802.2 LLC (EXPERIMENTAL) x x
x x [ ] Frame Diverter (EXPERIMENTAL) x x
x x < > Acorn Econet/AUN protocols (EXPERIMENTAL) x x
x x < > WAN router x x
x x [ ] Fast switching (read help!) x x
x x [ ] Forwarding between high speed interfaces x x
x x QoS and/or fair queueing —> x x
x x Network testing —> x x
IP: Netfilter Configuration —> 로 가서 iptables 에 관련된 옵션을 아래와
같이 체크 한다. 실제 iptables 의 경우 패킷의 포워딩 및 NAT, DR 방식에서 주요
한 요소로 사용되게 된다.
x x <*> Connection tracking (required for masq/NAT) x x
x x <M> FTP protocol support x x
x x <M> Amanda protocol support x x
x x <M> TFTP protocol support x x
x x <M> IRC protocol support x x
x x <M> Userspace queueing via NETLINK (EXPERIMENTAL) x x
x x <*> IP tables support (required for filtering/masq/NAT) x x
x x <M> limit match support x x
x x <M> MAC address match support x x
x x <M> Packet type match support x x
x x <M> netfilter MARK match support x x
x x <M> Multiple port match support x x
x x <M> TOS match support x x
x x <M> recent match support x x
x x <M> ECN match support x x
x x <M> DSCP match support x x
x x <M> AH/ESP match support x x
x x <M> LENGTH match support x x
x x <M> TTL match support x x
x x <M> tcpmss match support x x
x x <M> Helper match support x x
x x <M> Connection state match support x x
x x <M> Connection tracking match support x x
x x <M> Unclean match support (EXPERIMENTAL) x x
x x <M> Owner match support (EXPERIMENTAL) x x
x x <*> Packet filtering x x
x x <M> REJECT target support x x
x x <M> MIRROR target support (EXPERIMENTAL) x x
x x <*> Full NAT x x
x x <M> MASQUERADE target support x x
x x <M> REDIRECT target support x x
x x [*] NAT of local connections (READ HELP) x x
x x <M> Basic SNMP-ALG support (EXPERIMENTAL) x x
x x <*> Packet mangling x x
x x <M> TOS target support x x
x x <M> ECN target support x x
x x <M> DSCP target support x x
x x <M> MARK target support x x
x x <M> LOG target support x x
x x <M> ULOG target support x x
x x <M> TCPMSS target support x x
x x <*> ARP tables support x x
x x <M> ARP packet filtering x x
IP: Virtual Server Configuration —> 로 가서 ipvs 옵션을 체크한다.
x x <*> virtual server support (EXPERIMENTAL) x x
x x [*] IP virtual server debugging x x
x x (12) IPVS connection table size (the Nth power of 2) x x
x x — IPVS scheduler x x
x x <*> round-robin scheduling x x
x x <*> weighted round-robin scheduling x x
x x <*> least-connection scheduling x x
x x <*> weighted least-connection scheduling x x
x x <*> locality-based least-connection scheduling x x
x x <*> locality-based least-connection with replication scheduling x x
x x <*> destination hashing scheduling x x
x x <*> source hashing scheduling x x
x x <*> shortest expected delay scheduling x x
x x <*> never queue scheduling x x
x x — IPVS application helper x x
x x <*> FTP protocol helper x x
이밖에 Reiserfs, NFS, Coda, XFS, Samba 등등 클러스터 파일 시스템 구성에 관련된
유용한 기능을 추가적을 체크해 주면 된다.
저장하고 나온다.
이런 일련의 작업이 귀찮을 경우 ..
ftp://syszone.co.kr/pub/linux/server/lvspkg/xeon-p4-aic-usb 를 다운 받아
/usr/src/linux 에 놓아두고
–> Load an Alternate Configuration File 에서 불려와서 적용해도 된다.
단 위 커널 설정 파일은 Intel Xeon CPU, Aic79xx SCSI Adapter 환경임
커널 컴파일을 한다.
# make dep
# make clean
# make bzImage
# make modules
# make modules_install
커널 컴파일 완료 후
# cp System.map /boot/System.map-2.4.27-lvs
# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.27-lvs
# cd /boot
# ln -sf System.map-2.4.27-lvs System.map
# ln -sf vmlinuz-2.4.27-lvs vmlinuz
lilo 설정
# vi /etc/lilo.conf
—————————————————————–
prompt
timeout=50
default=linux-lvs
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
message=/boot/message
image=/boot/vmlinuz-2.4.20-8smp
label=linux
initrd=/boot/initrd-2.4.20-8smp.img
read-only
append=”root=LABEL=/”
image=/boot/vmlinuz
label=linux-lvs
read-only
root=/dev/sda2
—————————————————————-
# lilo
리부팅을 한다.
2.2. ipvsadm 설치 및 사용 방법
ipvsadm 은 LB 서버에서 클라이언트의 서비스 요청을 받아 실제 작업 서버로 요청
패킷을 포워팅 시키는 정책을 정의하는 명령어 이다. 부하분산 서버의 Virtual Server
정책은 모두 이 명령어로 정의하게 된다.
2.2.1 ipvsadm 설치
ipvsadm-1.21.tar.gz 파일을 /usr/local/src 밑에 옮겨 놓는다.
# cd /usr/local/src
# tar xzvf ipvsadm-1.21.tar.gz
# cd ipvsadm-1.21
# make
# make install
# ln -sf /sbin/ipvsadm /usr/sbin/ipvsadm -> Encluster 사용 시 필요함.
# ipvsadm
———————————————————————-
IP Virtual Server version 1.0.11 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
위와 같은 내용이 나오면 정상적으로 설치가 완료 된것이다.
2.2.2 ipvsadm 사용 방법
ipvsadm 옵션 설명
-A : 서비스를 추가 한다.
-D : 서비스 삭제
-E : 서비스 수정
-C : 정의된 모든 정책 삭제
-s : 스케줄러 선택 ( wlc : weight least connection scheduling )
-a : add server ( -e : EDIT , -d : Delete )
-t : TCP service 추가 ( -u : UDP , -f : Firewall )
-r : 옵션 다음에 Real Server ip address 를 적는다.
-i : 패킷전달 방식 (ip tunneling 방식) , -g : Direct Routing 방식, -m : NAT
-w : wlc 방식에서 가중치 ( 기본 가중치는 1 로 주어짐 )
–set tcp tcpfin udp : 연결 시간 제한 설정 ( set connection timeout value )
-p : persistent 시간 지정
예 ) 정책 설정 방법
# ipvsadm -A -t 211.238.41.170:80 -s wlc -p 360
# ipvsadm
———————————————————————–
IP Virtual Server version 1.0.11 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 211.238.41.170:http wlc persistent 360
———————————————————————–
# ipvsadm -a -t 211.238.41.170:80 -r 211.238.41.165 -g -w 100
# ipvsadm -a -t 211.238.41.170:80 -r 211.238.41.166 -g -w 100
# ipvsadm
———————————————————————–
IP Virtual Server version 1.0.11 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 211.238.41.170:http wlc persistent 360
-> 211.238.41.166:http Route 100 0 0
-> 211.238.41.165:http Route 100 0 0
———————————————————————–
2.3 LB 서버와 Real Server 의 네트워크 구성 설정
2.3.1 LB 서버 네트워크 구성
LB 서버에는 특정 인터페이스에 VIP 를 설정하여야 한다. 여기서는 eth0:0
인터페이스에 VIP 를 설정하도록 한다.
-> eth0 : real IP
-> eth0:0 virtual IP
-> VIP : 211.238.41.170
-> Web Server-1 : 211.238.41.165
-> Web Server-2 : 211.238.41.164
# ifconfig eth0:0 211.238.41.170 netmask 255.2555.255.255 broadcast 211.238.41.170
# route add -host 211.238.41.170 dev eth0:0
route -n 으로 확인하여 해당 flags 값이 UH 면 된다.
# route -n
————————————————————————-
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
211.238.41.170 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
211.238.41.160 0.0.0.0 255.255.255.224 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 211.238.41.190 0.0.0.0 UG 0 0 0 eth0
————————————————————————-
kernel forward parameter 값을 1 로 수정한다.
echo 1 > /proc/sys/net/ipv4/ip_forward
매번 부팅때마다 적용하기 위해서는 /etc/sysctl.conf 에서 해당 부분 설정을
0에서 1로 수정한다.
net.ipv4.ip_forward = 1
*** 만일 NAT 구성 시에는 /etc/sysconfig/network 파일을 열어 아래 내용을
추가해 준다.
IP_FORWARD(대문자)=true(소문자)
– ipvsadm 정책 설정
# ipvsadm -A -t 211.238.41.170:80 -s wlc
# ipvsadm -A -t 211.238.41.170:22 -s wlc
# ipvsadm -a -t 211.238.41.170:80 -r 211.238.41.165 -g
# ipvsadm -a -t 211.238.41.170:80 -r 211.238.41.164 -g
# ipvsadm -a -t 211.238.41.170:22 -r 211.238.41.165 -g
# ipvsadm
————————————————————————-
IP Virtual Server version 1.0.11 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 211.238.41.170:ssh wlc
-> 211.238.41.165:ssh Route 1 0 0
TCP 211.238.41.170:http wlc
-> 211.238.41.165:http Route 1 0 0
-> 211.238.41.164:http Route 1 0 0
————————————————————————-
2.3.2 Real Server 네트워크 구성
Real Server 에서는 LB 로 부터 분배 되어지는 패킷을 받기 위해 DR, NAT, Tun 별로
모두 네트워크 구성이 달라진다.
NAT 의 경우는 별도의 VIP 에 대한 Alias Device 를 가질 필요가 없다. 단지 네트워크
구성에서 Gateway 를 LB 서버의 통신 가능한 IP 로 정해주면 된다.
DR 이나 Tun 의 경우에는 Real Server에서도 VIP 에 대한 IP를 Non arp alias Device
에 설정을 해주어야 한다. 그래야 LB 서버에서 포워딩되는 패킷을 받아 들일수가 있다
여기서는 Direct routing 의 방식으로 설정을 하도록 하겠다.
-> eth0 : Real IP
-> lo:0 : VIP
# ifconfig lo:0 211.238.41.170 netmask 255.255.255.255 broadcast 211.238.41.170
# route add -host 211.238.41.170 dev lo:0
여기서 별도의 non arp alias device 를 잡지 않아도 iptables 의 rediect 기능을
이용하여 Direct routeing 방식으로 네트워크를 구성할 수 있다.
Encluster 에서는 이 방법을 사용하고 있다.
# iptables -t nat -A PREROUTING -j REDIRECT -d 211.238.41.170 -p tcp
# iptables -t nat -A PREROUTING -j REDIRECT -d 211.238.41.170 -p udp
Real Server 네트워크 구성에서 VIP 가 설정 되는 Device 의 경우 반드시 arp
caching 남으면 안된다.
arp caching 남게 되면 vip를 통해 초기 접속된 Real Server로만 계속 접속을
시도하게 됨으로 LB 서버의 분배 스케줄링에 문제가 발생하게 된다.
다음 장에서 DR 과 tun 방식에서의 Arp 캐싱 문제 해결 방법에 대해 알아보자.
2.4. Direct Routing 방식에서의 ARP 문제 해결
arp caching 문제 해결은 2.1 장에서 얘기한 hidden patch 를 통해 해결 할수 있다.
하지만 커널 2.4.26 이상부터는 별도의 hidden patch 없이 arp_ignore ,
arp_announce 값을 이용하여 arp 문제를 해결 할수 있다
**** 참고 ****
하지만 http://www.ssi.com/~ja 에는 2.4.26~27 버전대의 hidden patch 가 올려져
있지만 hidden patch 를 한경우와 arp_ignore , arp_announce 통해 처리한 경우와
다른 점은 찾지 못했당.
– hidden patch 를 통해 arp 캐싱 문제 해결
# echo 1 > /proc/sys/net/ipv4/conf/all/hidden
# echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
– arp_ignore , arp_announce 통해 해결하는 방법
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
매 부팅때 마다 위 설정을 유지 하기 위해서는 위의 명령 내용을
/etc/rc.d/rc.local 에 적어 주던지 아님 /etc/sysctl.conf 파일 내용에 해당
내용을 아래와 같이 추가하도록 한다.
# cat /etc/sysctl.conf
—————————————————————-
net.ipv4.ip_forward = 1 ## 0에서 1로 수정
# 아래는 추가
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
# hidden patch 적용 경우에는 아래 추가
net.ipv4.conf.all.hidden = 1
net.ipv4.conf.lo.hidden = 1
—————————————————————-
2.5. 부하 분산 테스트
앞장에서 설정한 정책에 따라 잘 분산이 되는지 확인해 보도록 하자.
확인에 앞서 먼저 정확한 분산 확인을 위해 apache 의 httpd.conf 의 설정 값을
수정하도록 한다.
KeepAlive = Off
MaxKeepAliveRequests 1
그리고 웹 페이지 테스트를 할수 있는 index 페이지를 만들어 보도록 하자.
# vi index.html
——————————————————————
<html>
<head>
<title>node01</title>
</head>
<body>
<font size=5 color=red> node01 </font>
</body>
</html>
——————————————————————
그런 후 브라우저를 열어서 VIP 로 웹 접속을해보도록 하자.
웹 접속이 이루어 졌으면 브라우저 새로고침을 계속 눌려보아, 화면이 서버별로
변경이 되는지를 확인하면 된다.
이밖에 아래 Perl 스크립터를 이용하여 확인을 해보아도 된다. 아래 스크립터로
테스트를 하기 위해서는 index 웹페이지의 title 을 반드시 적어 주어야 한다.
아래 스크립터는 웹페이지의 title 내용을 출력하라는 내용의 스크립트다.
# vi get_title.pl
————————————————————————–
#!/usr/bin/perl -w
#
#클러스터 서버들의 타이틀을 가져오는 프로그램.
#
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 <= 100 ; $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;
}
}
——————————————————————————
# chmod 755 get_title.pl
# ./get_title.pl http://211.238.41.170
http://211.238.41.170 =>
node02 (12 lines, 109 bytes)
http://211.238.41.170 =>
node01 (12 lines, 108 bytes)
http://211.238.41.170 =>
node02 (12 lines, 109 bytes)
http://211.238.41.170 =>
node01 (12 lines, 108 bytes)
http://211.238.41.170 =>
node02 (12 lines, 109 bytes)
http://211.238.41.170 =>
node01 (12 lines, 108 bytes)
http://211.238.41.170 =>
node02 (12 lines, 109 bytes)
http://211.238.41.170 =>
node01 (12 lines, 108 bytes)
http://211.238.41.170 =>
node02 (12 lines, 109 bytes)
http://211.238.41.170 =>
node01 (12 lines, 108 bytes)
http://211.238.41.170 =>
node02 (12 lines, 109 bytes)
2.5. Server failed 를 감지하는 MON 적용 하기
지금까지 기본적인 로드 밸런싱(작업분배)은 설정에 대해 알아보았다.
하지만 real_server(앞으로 real 이라하겠다.)중 하나가 죽었도 master_lvs
에서는 스케줄 규칙에 따라 패킷을 죽은 real 에도 정해진 규칙대로 분배하게
된다. 그렇기 때문에 패킷이 죽은 real 로 보내질때는 접속이 되지 않는다.
이를 방지하기 위해서 mon 이란 프로그램을 설치한다. mon 은 정해진 시간마
다 각 real 서버들을 감시 하면서 죽은 real 서버가 발견대면 ipvsadm 에서
죽은 real 서버로 분배대는 작업 규칙을 제거 하여 더이상 작업을 분배하지
않도록 한다. 그리고 죽었던 real 서버가 살아나면 이또한 감지하고 다시 정
해진 작업분배를 계속 하게 된다. 이제 mon 설치 방법에 대하여 알아보도록
하자.
2.5.1 Mon 설치 준비 하기
mon 은 기본적으로 perl 로 만들어진 각 서비스 체크 모듈을 가지고 서버스의
상태를 파악하여해당 서비스가 죽은 경우 특정 액션을 취할 수 있게 해주는
프로그램이다. 이를 이용하면 ipvsadm 정책을 새로이 만들수도 있고, 기타
다른 곳에도 응용할수 있다.
mon 을 이용하기 위해서는 기본적으로 perl ver 5.x 이상이 설치 되어져 있어야 한다.
또 몇가지 기본 perl modules 과 fping 정도의 프로그램을 먼저 설치 해 두어야 한다.
perl modules 은 CPAN을 이용하여 쉽게 설치 할수 있고, 직접 다운 받아 설치
할수도 있다. perl modules 설치 전에 perl 용 시스템 header 파일을 만들어야 한다.
# cd /usr/include
# h2ph *.h sys/*.h asm/*.h
– CPAN 이용방법
# perl-MCPAN -e shell
처음 이용할 경우 다음과 같은 기본 설정 단계가 나온다.
—————————————————————————
/usr/lib/perl5/5.8.0/CPAN/Config.pm initialized.
CPAN is the world-wide archive of perl resources. It consists of about
100 sites that all replicate the same contents all around the globe.
Many countries have at least one CPAN site already. The resources
found on CPAN are easily accessible with the CPAN.pm module. If you
want to use CPAN.pm, you have to configure it properly.
If you do not want to enter a dialog now, you can answer ‘no’ to this
question and I’ll try to autoconfigure. (Note: you can revisit this
dialog anytime later by typing ‘o conf init’ at the cpan prompt.)
Are you ready for manual configuration? [yes] -> yes
The following questions are intended to help you with the
configuration. The CPAN module needs a directory of its own to cache
important index files and maybe keep a temporary mirror of CPAN files.
This may be a site-wide directory or a personal directory.
First of all, I’d like to create this directory. Where?
CPAN build and cache directory? [/root/.cpan]
.
.
.
기본 내용으로 설정한다.
.
cpan shell — CPAN exploration and modules installation (v1.61)
ReadLine support available (try ‘install Bundle::CPAN’)
cpan>
—————————————————————————
cpan> install Time::Period
cpan> install Time::HiRes
cpan> install Convert::BER
cpan> install Mon::Client
cpan> install Mon::Protocol
cpan> install Mon::SNMP
– 직접 다운 받아 설치 하기
ftp://ftp.bora.net/pub/CPAN 에서 원하는 perl modules을 다운 받는다.
# tar xzvf Time-Hires-01.20.tar.gz
# cd Time-Hires-01-20
# perl Makefile.PL
# make
# make test
# make install
– fping 설치 하기
# cd /usr/local/src
# tar xjvf fping-2.2b1.tar.bz2
# cd fping-2.2.b1
# ./configure
# make
CONFIG_FILES= CONFIG_HEADERS=./config.h ./config.status
creating ./config.h
gcc -c -DHAVE_CONFIG_H -I. -I. -I. -g -O2 fping.c
fping.c:222: conflicting types for `sys_errlist’
/usr/include/bits/sys_errlist.h:28: previous declaration of `sys_errlist’
make: *** [fping.o] 오류 1
-> 이와 같이 오류가 발생하면 fping.c 파일의 222번 줄을 수정한다.
/* externals */
extern char *optarg;
extern int optind,opterr;
extern char *_sys_errlist[]; -> *sys_errlist[];
extern int h_errno;
#ifdef __cplusplus
}
.. 그런 후 ..
# make
# make install
2.5.2 Mon 설치 하기
# tar xzvf mon-0.99.2.tar.gz -c /usr/lib
# cd /usr/lib
# mv mon-0.99.2 mon
# cd mon
# mkdir /etc/mon /var/log/mon
# install m644 doc/mon.8 /usr/man/man8
# install m644 doc/moncmd.1 /usr/man/man1
# install m644 doc/monshow.1 /usr/man/man1
# install m644 etc/auth.cf /etc/mon
# install m644 etc/example.cf /etc/mon
# install m700 etc/S99mon /etc/rc.d/init.d/mon
# vi /etc/rc.d/init.d/mon 을 수정한다.
————————————————————–
#!/bin/sh
#
# start/stop the mon server
#
# You probably want to set the path to include
# nothing but local filesystems.
#
# chkconfig: 2345 99 10
# description: mon system monitoring daemon
# processname: mon
# config: /etc/mon/mon.cf
# pidfile: /var/run/mon.pid
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
# Source function library.
. /etc/rc.d/init.d/functions
# See how we were called.
case “$1” in
start)
echo -n “Starting mon daemon: ”
daemon /usr/lib/mon/mon -f -c /etc/mon/mon.cf –> 이부분 -f 추가
——————————————————————
# vi /etc/service
——————————————————————
맨 아래다가..
mon 2583/tcp # MON
mon 2583/udp # MON traps
추가 ..
——————————————————————
# cp /etc/mon/example.cf /etc/mon/mon.cf
이것으로 mon 설치를 완료한다.
간단한 테스트를 해보도록 하자
mon 의 fping modules 을 이용한 서버 상태 확인 하는 테스트이다.
# /usr/lib/mon/mon.d/fping.monitor syszone.co.kr
start time: Thu Aug 26 18:11:37 2004
end time : Thu Aug 26 18:11:37 2004
duration : 0 seconds
————————————————————————-
reachable hosts rtt
————————————————————————-
syszone.co.kr 0.19 ms
다음장에서는 실제 mon 을 이용하여 LB 서버에 Fail Over 기능을 추가 해보자.
2.5.3 Mon 을 이용한 Load Balance 에 Fail Over 기능 추가하기
/usr/lib/mon/mon.d 디렉토리 안의 file 들은 각 시스템의 해당 서비스를 모니
터링 하는 perl scripts 이다. mon 의 장점과 단점이 될수 있는 부분이 기본적
으로 포함되어져 있는 monitor scripts 가 없는 경우 일반인들이 싶게 개별 사
이트의 특수한 프로그램을 감시 할수 없다는 것이다. 하지만 약간의 Perl 지식
만 갖춘 상태라고 하면 어떤 형태의 moniter modules 도 쉽게 만들 수 있을 것
이다.
이장에서는 mon을 이용하여 virtual address 정책을 실제 작업가 죽어 있을 경
우 정책에서 자동 제거하고 다시 살아나면 다시 포함하는 기능을 추가하는 방법
에 대해 알아 보겠다.
mon 의 기본 설정 파일은 한개이다. /etc/mon/mon.cf 가 그것이다.
이 설정 파일의 내용만 이해하면 시스템 엔지니어가 원하는 어떤 형태의 감시
툴도 만들 수 있을 것이다.
# vi /etc/mon/mon.cf
————————————————————————-
# global options
#
cfbasedir = /etc/mon # mon.cf 위치
logdir = /var/log/mon
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 30s
# authentication types:
# getpwnam standard Unix passwd, NOT for shadow passwords
# shadow Unix shadow passwords (not implemented)
# userfile “mon” user file
authtype = userfile # mon.cgi 사용시 로그인 가능 기능
userfile = /etc/mon/mon.user
dtlogging = yes
dtlogfile = downtime.log
############## 호스트 그룹 지정 ####################
# hostgroup 은 실제 모니터링을 해야할 서버와 그 서버의 별칭을 정하는 곳
# 아래에서 HTTP-server1 은 서비스 별칭이고 www1 은 호스트네임이다.
# 서비스 별칭은 실제 서비스에 대한 모니터링 관련 설정을 하는 watch 에서
# 사용된다.
hostgroup HTTP-server1 www1
hostgroup HTTP-server2 www2
watch HTTP-server1
service ping
description ping servers in www1
interval 5s
monitor fping.monitor
period wd {Sun-Sat}
# alert mail.alert alang@clunix.com
# alert page.alert alang@clunix.com
alertevery 10m
alertafter 2 30m
alert test.alert “www1 Server is DOWN”
upalert test.alert “www1 Server is UP”
service HTTP
description http to servers in www1
interval 3s
monitor http.monitor
# depend HTTP-server1:ping
period wd {Sun-Sat}
alertevery 30m
# alert mail.alert alang@clunix.com
# alert page.alert alang@clunix.com
alert test.alert “HTTPd is DOWN”
upalert test.alert “HTTPd is UP”
alert lvs.alert -P tcp -V 211.238.41.170:80 -R 211.238.41.165:80 \\
-W 100 -F dr -X down
upalert lvs.alert -P tcp -V 211.238.41.170:80 -R 211.238.41.165:80 \\
-W 100 -F dr
watch HTTP-server2
service ping
description ping servers in www2
interval 5s
monitor fping.monitor
period wd {Sun-Sat}
# alert mail.alert alang@clunix.com
# alert page.alert alang@clunix.com
alertevery 10m
alertafter 2 30m
alert test.alert “www2 Server is DOWN”
upalert test.alert “www2 Server is UP”
service HTTP
description http to servers in www2
interval 3s
monitor http.monitor
# depend HTTP-server2:ping
period wd {Sun-Sat}
alertevery 30m
# alert mail.alert alang@clunix.com
# alert page.alert alang@clunix.com
alert test.alert “www2 HTTPd is DOWN”
upalert test.alert “www2 HTTPd is UP”
alert lvs.alert -P tcp -V 211.238.41.170:80 -R 211.238.41.166:80 \\
-W 100 -F dr -X down
upalert lvs.alert -P tcp -V 211.238.41.170:80 -R 211.238.41.166:80 \\
-W 100 -F dr
—————————————————————————
Mon 설정이 완료된 후 Mon 설정에서 웹서버에 이상이 있을 때 호출하는 스크립터인 lvs.alert를 만들도록 한다.
# vi /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: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;
};
———————————————————————
해당 스크립터의 퍼미션을 755하여 실행 권한을 준다.
이제 설정을 저장 후 Mon 데몬을 시작해 보자
# /etc/rc.d/init.d/mon start
restart 는 불안하니 stop , start 만 사용하도록 하자.
2.5.4 Mon.cgi 를 이용하여 웹에서 Mon 제어하기
moncgi란 test-mode가 아닌 그래픽 모드에서 서버를 모니터링 할 수 있게끔
해주는 툴이다. 물런 설치 하지 않아도 LB Fail over 기능에는 전혀 상관 없다.
설치 과정에 대해 알아보자
Mon 웹프로그램을 관리할 시스템 계정 생성
# adduser -u 90 -c “MonCGI Apache User” -d /usr/local/moncgi \\
-s /sbin/nologin moncgi
mon 웹프로그램에 로그인할 계정 생성
# /usr/local/apache/bin/htpasswd -c /etc/mon/mon.user moncgi
# cd /usr/local/src
# tar xzvf apache_1.3.31.tar.gz
# cd apache_1.3.31
# vi config.layout -> 아래와 부분을 추가함
—————————————————————————–
<Layout moncgi>
prefix: /usr/local/moncgi
exec_prefix: $prefix
bindir: $exec_prefix/bin
sbindir: $exec_prefix/bin
libexecdir: $exec_prefix/libexec
mandir: $prefix/man
sysconfdir: /etc/mon/moncgi
datadir: $prefix
iconsdir: $datadir/icons
htdocsdir: $datadir/htdocs
manualdir: $htdocsdir/manual
cgidir: $datadir/cgi-bin
includedir: $prefix/include
localstatedir: /var/log/mon
runtimedir: $localstatedir/logs
logfiledir: $localstatedir/logs
proxycachedir: $localstatedir/proxy
</Layout>
—————————————————————————–
# ./configure –with-layout=moncgi –show-layout
# ./configure –with-layout=moncgi –with-port=9000 –server-uid=moncgi \\
–server-gid=moncgi –disable-module=autoindex –disable-module=imap \\
–disable-module=include –disable-module=negotiation \\
–disable-module=status –disable-module=userdir
# make
# make install
# cd /etc/mon/moncgi
# rm -rf access* srm* magic*
# grep -v “#” httpd.conf | grep ^. > tt –> 주석 처리된 내용을 삭제함.
# mv ./tt ./httpd.conf
# vi httpd.conf
—————————————————————————–
######################## 전체 환경 설정 ####################
ServerType standalone
ServerRoot “/usr/local/moncgi”
PidFile /var/log/mon/moncgi/httpd.pid
ScoreBoardFile /var/log/mon/moncgi/httpd.scoreboard
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 1
MaxSpareServers 2
StartServers 0
MaxClients 10
MaxRequestsPerChild 0
Listen 211.238.41.167:9000
######################## 주 서버 설정 ######################
Port 9000
User moncgi
Group moncgi
ServerAdmin root@www3.clunix.org
DocumentRoot “/usr/local/moncgi/cgi-bin”
<Directory “/usr/local/moncgi/cgi-bin”>
Options ExecCGI
AllowOverride None
AddHandler cgi-script .cgi
# Order deny,allow
# Deny from all
# Allow from 211.238.41.180
</Directory>
DirectoryIndex mon.cgi
UseCanonicalName On
TypesConfig /etc/mon/moncgi/mime.types
DefaultType text/plain
HostnameLookups Off
ErrorLog /var/log/mon/moncgi/error_log
LogLevel warn
LogFormat “%h %l %u %t \\”%r\\” %>s %b” common
CustomLog /var/log/mon/moncgi/access_log common
ServerSignature On
BrowserMatch “Mozilla/2” nokeepalive
BrowserMatch “MSIE 4\\.0b2;” nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch “RealPlayer 4\\.0” force-response-1.0
BrowserMatch “Java/1\\.0” force-response-1.0
BrowserMatch “JDK/1\\.0” force-response-1.0
—————————————————————–
# cd /usr/local/moncgi 로 이동
# rm -rf htdocs icons libexec man cgi-bin/*
# cd /etc/rc.d/init.d/
# ln -sf /usr/local/moncgi/bin/apachectl moncgi
# /etc/rc.d/init.d/moncgi restart
이제 moncgi 가 재대로 동작하는지 확인
# lsof -i | grep 9000
——————————————————————————
httpd 3805 root 16u IPv4 419398 TCP www3.clunix.org:9000 (LISTEN)
httpd 3816 moncgi 16u IPv4 419398 TCP www3.clunix.org:9000 (LISTEN)
httpd 3817 moncgi 16u IPv4 419398 TCP www3.clunix.org:9000 (LISTEN)
httpd 3818 moncgi 16u IPv4 419398 TCP www3.clunix.org:9000 (LISTEN)
httpd 3819 moncgi 16u IPv4 419398 TCP www3.clunix.org:9000 (LISTEN)
httpd 3820 moncgi 16u IPv4 419398 TCP www3.clunix.org:9000 (LISTEN)
# chkconfig –add moncgi
# chkconfig –level 3 moncgi on
moncgi를 설치 하기 위해서는 몇가지 perl modules 이 더 필요하다.
필요한 모듈로는 Crypt::TripleDES , Math::TrulyRandom 이 있다.
앞서 설명한 CPAN 을 이용하도록 하자.
# perl -MCPAN -e shell
cpan > install Crypt::TripleDES
cpan > look Math::TrulyRandom
# perl Makefile.PL
# make && make install
# exit
# exit
#
mon.cgi-1.52.tar.gz 을 다운 받는다. ( http://www.nam-shub.com/files/ )
# mkdir /etc/mon/moncgi
# /usr/local/src
# tar xzvf mon.cgi-1.52.tar.gz
# cd mon.cgi-1.52
# install m755 mon.cgi /usr/local/moncgi/cgi-bin
# install m644 config/mon.cgi.cf /etc/mon/moncgi
# install m700 util/moncgi-appsecret.pl /usr/sbin/moncgi-appsecret
# cd .. ; rm -rf mon.cgi*
# cd /usr/local/moncgi/cgi-bin
mon.cgi 를 수정한다.
# vi mon.cgi
——————————————————————–
$moncgi_config_file = “/etc/mon/moncgi/mon.cgi.cf” 176 줄
——————————————————————–
/etc/mon/moncgi/mon.cgi.cf 에서 Reloas_time, must_login , Login_expire_time
을 설정이 되어 있는지 확인을 해본다. 환경에 맞게 수정하라.
그런후 http://IP:9000/mon.cgi
(접근후 계정과 password를 넣는 창이 있을 것이다. 이것은 MON에서 추가해준
유저를 넣으면 된다.)
Mon 데몬을 자동으로 실행하는 init script 를 만들어 보자
# vi /etc/rc.d/init.d/puck
———————————————————————
#!/bin/sh
#
# load balancer daemon scripts
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
IPVSADM=/sbin/ipvsadm
MON=/usr/lib/mon/mon
RETVAL=0
#Source function library.
. /etc/rc.d/init.d/functions
case “$1” in
start)
if [ -x $IPVSADM ]
then
#
# ipvs system 설정 부분
#
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 211.238.41.170 netmask 255.255.255.255 \\
broadcast 211.238.41.170 up
route add -host 211.238.41.170 dev eth0:0
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
$IPVSADM -A -t 211.238.41.170:80 -s wlc
$IPVSADM -a -t 211.238.41.170:80 -r 211.238.41.165:80 -g -w 100
$IPVSADM -a -t 211.238.41.170:80 -r 211.238.41.166:80 -g -w 100
#
# 추가되는 real_server 는 아래에 같은형식으로 추가하면 된다.
# $IPVSADM -a -t 211.238.41.170:80 -R 211.238.41.165 -g -w 2
# $IPVSADM -a -t 211.238.41.170:80 -R 211.238.41.166-g -w 2
#
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 “puck daemon stopping…”
$IPVSADM -C
ifconfig eth0:0 down
killproc mon
rm -f /var/lock/subsys/punk
killall http.monitor
echo -n “puck daemon killed”
echo
fi
;;
*)
echo “Usage : puck {start|stop}”
exit 1
esac
exit 0
—————————————————————————
이제 /etc/rc.d/init.d/puck initscripts 로 mon 을 손쉽게 제어할 수 있다.
LB 서버에서 /etc/rc.d/init.d/puck start 한 후 Web Server-1, Web Server-2의
httpd 데몬을 stop, start 시키면서 ipvsadm tables 에 상황에 맞게 적용되는지
를 확인한다.
2.6. LB 서버간의 이중화 HA 구축 하기 ( Heartbeat )
Load Balance 방식의 최대 단점 중 하나가 LB 서버가 다운 될을 경우 모든 서비스
가 정지된다. 그러므로 LB 서버의 이중화는 필수적인 사항이다. 이를 위해
heartbeat 란 프로그램을 이용하여 LB 서버를 이중화 해야 한다.
heartbeat 프로그램을 다운 받아 /usr/local/src 에 놓아둔다.
heartbeat 에 이용되는 프로그램은 다음과 같다.
http://www.linux-ha.org/ 에서 heartbeat 최신버전을 다운 받는다.
heartbeat-pils-1.2.2-8.rh.9
heartbeat-stonith-1.2.2-8.rh.9
heartbeat-1.2.2-8.rh.9
2.6.1 Heartbeat 설치 및 기본 설정
Heartbeat는 Master_lvs 와 Slave_lvs 에 모두 설치한다.
# rpm -Uvh heartbeat-*
설정파일은 /etc/ha.d 에 있다.
# cd /etc/ha.d
heartbeat 설정은
ha.cf
haresources
authkeys
rpm -q heartbeat -d 라고 하면 설정파일의 샘플파일이
/usr/share/doc/heartbeat-1.2.2 란 디렉토리에 있다는 것을 알수 있다.
샘플 파일을 /etc/ha.d 로 복사한다.
# 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 www3 # Master LB Server
node www2 # Slave LB Server
# node 명은 실제 서버의 hostname 이여야 한다.
# 즉 /etc/sysconfig/network 에 정의된 HOSTNAME 값이다.
# 확인은 그냥 uname -n 으로 확인하여도 되낟.
————————————————————–
/etc/ha.d/authkeys 설정 내용 ———————————
#auth 1
#1 crc
#2 sha1 HI!
#3 md5 Hello!
auth 1
1 sha1 HI!
—————————————————————
authkeys 파일은 설정 후 반드시 퍼미션을 600 으로 변경해야 한다.
아니면 heartbeat start 시 Bad permissions on keyfile 와 같은 에러가
발생한다.
/etc/ha.d/haresource 설정 내용 ——————————–
# 설정 형식에 맞게 설정해야 합니다. 설정형식은…
# masternode_name VIP DAEMON_name
# DAEMON_name 은 /etc/rc.d/init.d 밑에 있는 initscripts 를 적으면 된다
www3 211.238.41.170 puck
—————————————————————
여기까지 Master_LB 에 대한 설정은 모두 끝났다.
2.6.2 Slave LB 서버가 Director 와 Real Service 의 두가지 역활 담당 시 Slave LB
서버 설정
만일 Slave_LB 서버를 LB 역활로만 둔다라고 하면 Master_LB 서버와 동일하게
Mon 설정과 Heartbeat 설정을 해주면 된다.
하지만 Slave_LB 서버를 평소에 RealServer 역활을 수행하다가 Master LB 서버에
문제 발생 시 Real Server 에서 LB 서버로 역활을 전환하는 방식으로 한다고 하면
Slave_LB 서버의 Mon 과 Heartbeat 설정에서 몇가지 수정을 해주어야 한다.
먼저 Slave_LB 서버가 Real Server 역활을 수행 시 lo:0 를 추가할때 쓰이는
스크립터를 만들도록 한다.
/etc/ha.d/lvs-r.sh———————————————–
#!/bin/sh
VIP=211.238.41.170
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
route add -host $VIP dev lo:0
/sbin/sysctl -w net.ipv4.conf.all.arp_ignore=1
/sbin/sysctl -w net.ipv4.conf.all.arp_announce=2
/sbin/sysctl -w net.ipv4.conf.lo.arp_ignore=1
/sbin/sysctl -w net.ipv4.conf.lo.arp_announce=2
echo 1 > /proc/sys/net/ipv4/ip_forward
—————————————————————–
lvs-r.sh 의 퍼미션에 실행 권한을 준다.
# chmod 755 /etc/ha.d/lvs-r.sh
/etc/rc.d/init.d/puck 을 수정한다.
/etc/rc.d/init.d/puck ———————————————
case “$1” in
start)
if [ -x $IPVSADM ]
then
#
# ipvs system 설정 부분
#
echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth0:0 211.238.41.170 netmask 255.255.255.255 \\
broadcast 211.238.41.170 up
route add -host 211.238.41.170 dev eth0:0
/sbin/sysctl -w net.ipv4.conf.all.arp_ignore=0
/sbin/sysctl -w net.ipv4.conf.all.arp_announce=0
/sbin/sysctl -w net.ipv4.conf.eth0.arp_announce=0
/sbin/sysctl -w net.ipv4.conf.eth0.arp_announce=0
$IPVSADM -A -t 211.238.41.170:80 -s wlc
$IPVSADM -a -t 211.238.41.170:80 -r 211.238.41.165:80 -g -w 100
$IPVSADM -a -t 211.238.41.170:80 -r 211.238.41.166:80 -g -w 100
#
# 추가되는 real_server 는 아래에 같은형식으로 추가하면 된다.
# $IPVSADM -a -t 211.238.41.170:80 -R 211.238.41.165 -g -w 2
# $IPVSADM -a -t 211.238.41.170:80 -R 211.238.41.166-g -w 2
#
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 “puck daemon stopping…”
$IPVSADM -C
######## HA 설정 추가 내용 ################################
ifconfig eth0:0 down
/etc/ha.d/lvs-r.sh
###########################################################
killproc mon
rm -f /var/lock/subsys/punk
killall http.monitor
————————————————————————
그담에 /etc/rc.d/init.d/heartbeat 파일에 한줄만 추가해 준다.
/etc/rc.d/init.d/heartbeat 수정 내용 ——————————–
.
case “$1” in
start)
StartHA
RC=$?
.
.
stop)
RunStartStop “pre-stop”
StopHA
RC=$?
Echo
if
[ $RC -eq 0 ]
then
rm -f $LOCKDIR/$SUBSYS
fi
RunStartStop post-stop $RC
######### Slave-HA 추가 사항 ######################
/etc/ha.d/lvs-r.sh
###################################################
;;
————————————————————————
여기까지가 설정의 모든 것이다.
이제 Master_LB 와 Slave_LB 의 heartbeat 데몬을 가동시킨다.
# /etc/rc.d/init.d/heartbeat start
이제 High Availability 가 이루어 지는지 테스트를 해보자.
A. 정상적으로 작업분배가 이루어 지는지 테스트를 한다.
B. Master_LB 의 Lan 선을 뽑아 버린다. 그럼..Slave_LB 가 Master_LB 의
권한을 무사히 위임 받는지를 확인한다.
C. 다시 Master_LB 를 살려 보도록 하자. 그럼..Slave_LB 가 Master_LB의
역활을 다시 반납하고 다시 real 서버로 돌아가는지를 확인한다.
D. 다른 노드들도 각각 Lan선을 뽑고 난뒤에도 서비스에 지장이 없는지를 확
인 하도록 한다.
위의 4가지 테스트가 모두 성공적으로 완료 된다면 heartbeat 와 mon 을 이용한
고가용성 시스템 구축이 완성된것이다.
마지막으로 서버 환경에 맞추어서 heartbeat 와 mon 의 데몬 감시 주기 시간을
조절하면 된다.
3. Encluster 를 이용한 리눅스 부하분산 클러스터 구축
3.1. Encluster 1.6을 이용한 리눅스 부하분산 클러스터 구축
3.1.1 Encluster 1.6 의 구성 및 기능 소개
3.1.2 Encluster 1.6 설치 및 기본 설정
ftp://clunix@technet.clunix.com/EnCluster 에서 최신 버전을 다운 받는다.
( EnCluster-1.6.5h-9-i386 버전 권장 )
클루닉스에서 제공하는 Kernel rpm 혹은 kernel.org 에서 제공하는 Kernel Source 에
ipvs 패치 및 적용을 한 커널을 준비 하여야 한다.
ipvsadm 은 클루닉스에서 제공하는 rpm 패키지를 설치하길 권장 한다.
source 설치 시는 반드시 /usr/sbin 밑에 ipvsadm 링크를 걸어 주어야 한다.
# ln -s /sbin/ipvsadm /usr/sbin/ipvsadm
# rpm -Uvh cmdb-1.6.5-9.i386.rpm
# rpm -Uvh cluman-1.6.5h-5.i386.rpm
# rpm -Uvh ipvsadm-1.21-8.enc.i386.rpm
– Cluster IPAddress 입력
# vi /usr/clx/etc/clusterip
——————————————————————————
211.238.41.168 # cluster ip, Master Node 가 가지고 있는 관리 IP
——————————————————————————
– License Key 입력
# vi /usr/clx/etc/license.key
—————————————————————————–
ENC16-XXXX-XXXX-XXXX-XXXX-XXXX # 라이센트 입력
—————————————————————————–
– 기본 시스템 설정 확인
# vi /usr/clx/sbin/cmctl
—————————————————————————–
# Network interface device
CMDB_NETDEV=eth0
# Special Runing Mode
EXTRA=’-e masq -e linux24′
—————————————————————————–
CMDB_NETDEV=eth0 는 실제 클러스터 군이 서로 통신을 하는 Network Device 명을
적어 주어야 한다. 실제 클러스터 구축 시 Service Network 와 Management Network
로 분리 하는 경우가 많은데 이때는 실제 Encluster 클러스터 노드간의 통신을 진행
하는 장치명을 적어 주면 된다.
EXTRA=’-e masq’ 부분을 EXTRA=’-e masq -e linux24′ 으로 변경 해줌
-e linux24 는 Direct Routing 방식에서의 Real 서버에 lo alias device 에 VIP 를
설정하는 역활을 iptables 를 이용하여 대신 해주는 부분임
/usr/clx/sbin/vipctl 에 보면 -e linux24 설정이 되어져 있는 경우 아래와 같은
설정이 적용된다.
iptables -t nat -D PREROUTING -j REDIRECT -d $VIP -p tcp > /dev/null 2>&1
iptables -t nat -D PREROUTING -j REDIRECT -d $VIP -p udp > /dev/null 2>&1
iptables -t nat -A PREROUTING -j REDIRECT -d $VIP -p tcp
iptables -t nat -A PREROUTING -j REDIRECT -d $VIP -p udp
이 설정은 반드시 커널에서 iptables 에 nat 와 redirect 기능이 추가 되어야 한다.
이 부분의 내용이 정상적으로 적용 되지 않은 경우 VIP 를 통해 접속 할 경우 접속이
이루어 지지 않는다.
정상적인 동작을 확인 하는 방법은 Real Node 에서 아래 Command Line 을 입력하면
확인이 가능하다.
# iptables -L -t nat -n
– Encluster 데몬 시작
# /etc/rc.d/init.d/cmctl restart
정상적으로 시작이 이루어 지면 웹 브라우저를 열어 Encluster 1.6 Web UI인 Cluman 에
접속을 한다.
http://CIP:777
이후 클러스터 설정은 Cluman 에서 설정을 하면 된다.
– 설치 관련 팁
1) 라이센스 관련 팁
– 라이센스 정상 확인
# /usr/clx/sbin/cmdb -V << License Key >>
– 라이센스 변경
/usr/clx/etc/license.key 에 변경된 라이센스 정보를 입력 후
# /etc/rc.d/init.d/cmctl reloadlicense
2) Cluman 패스워드 분실 시
– Cluman (Web UI) 관리 패스워드 분실 시 패스워드 초기화
# /usr/clx/sbin/initpasswd.sh
위를 실행하면 초기 패스워드인 root/root 로 변경이 된다.
# /usr/clx/sbin/cmitool set svc sysinfo var0 “”
# cp /usr/clx/cluman/bin/.htpasswd.default /usr/clx/cluman/bin/.htpasswd
위 같은 방법으로 해도 패스워드가 초기화 되어진다.
3) Cluman 접속 불가능 한 상태에서의 master node 확인하기
# /usr/clx/sbin/cmitool get cluster self
—————————————————————
entry_type: cluster
num_entry: 1
name: default
ip: 211.238.41.168
master_node_name: 211.238.41.167
master_node_ip: 211.238.41.167
run: up
status: up
num_node: 3
num_nset: 1
num_vnode: 1
num_svc: 4
update_seq: 69
config_seq: 46
3.1.3 Encluster 1.6 제거
– Encluster 1.6 제거
# rpm -e cmdb-x.x.i386.rpm
# rpm -e cluman-x.x.i386.rpm
# rpm -e ipvsadm-1.21.x.i386.rpm
# rm -rf /usr/clx/cluman
# rm -rf /usr/clx/log
/usr/clx/etc 밑에 있는 clusterip, license.key, nodelist, snapshot.cdb 등은
영구적인 삭제가 아닌 경우 재설치를 위해 반드시 놓아 둔다.
snapshot.cdb 는 cluman 의 설정 저장 파일로 snapshot.cdb 를 백업 해 두었다가
재 설치 및 업그레이드 이후 다시 /usr/clx/etc 밑에 놓고 /etc/rc.d/init.d/cmctl
을 restart 하면 이전의 설정을 그대로 유지 할 수 있다.
3.1.4 Cluman 을 이용한 Encluster 1.6 관리 하기
3.1.5 cmitool, cmish 을 이용한 command 방식 관리
3.1.6 Encluster 1.6 을 이용한 HA 구성
Encluster 의 원리 중 director election 상태에서 특정 스크립트를 실행하고
director election 해제 시에 특정 스크립트를 실행하는 원리가 있다.
이를 이용하면 간단한 HA 구성을 만들 수 있다.
apache 웹서버를 부하분산 하면서 Mysql DB 를 HA 시키는 구조의 시스템을
구축해 보도록 하자.
1. svr1, svr2 서버에 apache 와 mysql 을 설치 한다. mysql 버전은 3.23 이상으로 한다.
2. Encluster 로 svr1, svr2의 서버들은 DR 형태로 클러스터 구성을 한다.
3. httpd 와 mysqld 서비스를 등록하다.
4. mysql replication 설정하기
svr1 서버를 master 서버로 지정 함.
svr2 서버를 slaver 서버로 지정 함.
– master 서버에 DB 복제를 해주는 역활의 User 를 만든다.
mysql > GRANT FILE ON *.* TO cluster@”%” IDENTIFIED BY ‘<password>’;
여기서 % 대신에 slave 서버 주소를 적어 주어도 상관없음.
master 의 /etc/my.cnf
——————————————————————-
[mysqld]
log-bin
binlog-do-db=syszone
server-id=1
——————————————————————-
binlog-do-db=’DB 이름’
slaver 의 /etc/my.cnf
——————————————————————-
[mysqld]
server-id=2
master-host=211.238.41.165
master-user=repli
master-password=root///
master-port=3306
——————————————————————-
master-user=repli 가 잘 안되면 그냥 root 로 한다.
단..root 역시 원격 DB 접속을 가능토록 해주어야 한다.
mysql> select User,Host from user;
+———+———–+
| User | Host |
+———+———–+
| root | % |
| www | % |
| | localhost |
| root | localhost |
| sahak21 | localhost |
| www | localhost |
| www | svr2 |
+———+———–+
svr1, svr2 서버의 mysql deamon 을 차례로 start 시킨다.
확인 절차 –master server ( svr1 )
mysql > show master status;
+————–+———-+————–+——————+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+————–+———-+————–+——————+
| svr1-bin.023 | 79 | syszone | |
+————–+———-+————–+——————+
확인 절차 –slave server ( svr2 )
| Master_Host 211.238.41.165
| Master_User root
| Master_Port 3306
| Connect_retry 60
| Master_Log_File svr1-bin.023
| Read_Master_Log_Pos 79
| Relay_Log_File svr2-relay-bin.025
| Relay_Log_Pos 271
| Relay_Master_Log_File svr1-bin.023
| Slave_IO_Running Yes
| Slave_SQL_Running Yes
| Replicate_do_db
| Replicate_ignore_db
| Last_errno 0
| Last_error
| Skip_counter 0
| Exec_master_log_pos 79
| Relay_log_space 271
여기서 master pos 에 관련된것이 master status 의 position 값과 일치해야함.
– Encluster 상에서 Apache Virtual Host 와 Mysql DB host 지정 문제를 해결해야 한다.
– apache virtualhost 문제 해결
실제 apache 에서 virtualhost 를 사용할 경우 현 서버 구성중 자기 자신이 direct
로 되어져 있는 경우 httpd.conf 의 서버 주소 및 virtualhost 주소가 모두 vip 로
되어져야 virtualhost 가 되어진다. 그리고 real server 인 경우에는 httpd.conf
의 Ip address 가 모두 real ip로 되어져 있어야 virtualhost 가 이루어 진다.
/usr/local/apache/conf 디렉토리에 httpd.conf-real , httpd.conf-vip 의 두개의
설정파일을 만들어 둔다.
– Mysql connect address 문제 해결
Encluster 의 클러스터 구성에서 web 과 같은 서비스와 Mysql DB 서비스를 같이
할 경우 mysql db connection address 가 vip 로 되어져야 하는데 web의 경우는
vip 를 인식하는 클라이언트가 클러스터 구성의 외부에 있는 client brower 에서
찾아 들어가기 때문에 vip를 통한 부하분산에 문제가 없다.
하지만 mysql 처럼 DB 서버의 경우에는 db client 가 클러스터 구성 외부의 client
가 아닌 web server가 db client 역할을 하고 그 web server 가 db server와 같은
서버일 경우 client 가 클러스터 구성 안에 존재 하게 된다.
이때 클러스터 구성안에서는 vip 를 direct server 로 인식하기 때문에 부하분산
방식에 문제가 생긴다. 그래서 이를 해결 하기 위해서는 direct 서버에 별도의
db connection 전용의 ip address 를 활당하는 방법으로 이를 해결한다.
– Encluster 구성중 /usr/clx/sbin/vipctl 의 script 를 이용하여 위의 두가지
문제를 해결한다.
vipctl 의 역활은 direct 가 변경되는 경우 이 스크립터를 실행한다.
////// master (svr1) 의 /usr/clx/sbin/vipctl script 수정
script fuction 중 honor_vip () 는 direct 변동으로 인해 자기가 director 가
안 되었을 경우 실행하는 함수이다.
honor_vip () {
if ifconfig $DEV:$ALIAS | grep “inet addr:$VIP” &> /dev/null
then
# The VIP is already taken
exit 0;
fi
if [ -e /proc/sys/net/ipv4/conf/all/hidden ]
then
# Linux-2.2.x with hidden patch
# Do ARP disabling on the interface
# This line may be moved to system init script
echo 1 > /proc/sys/net/ipv4/conf/all/hidden
echo 1 > /proc/sys/net/ipv4/conf/lo/hidden
# Add interface alias on the vip
ifconfig lo:$ALIAS $VIP netmask 255.255.255.255 broadcast $VIP up
elif [ -e $IPTABLES ]
then
# Linux-2.4.x with iptables
$IPTABLES -t nat -D PREROUTING -j REDIRECT -d $VIP -p tcp > /dev/null 2>&1
$IPTABLES -t nat -D PREROUTING -j REDIRECT -d $VIP -p udp > /dev/null 2>&1
$IPTABLES -t nat -A PREROUTING -j REDIRECT -d $VIP -p tcp
$IPTABLES -t nat -A PREROUTING -j REDIRECT -d $VIP -p udp
이부분 추가
———————————————————————————-
ifconfig $DEV:777 down
/usr/local/apache/bin/apachectl stop
ln -sf /usr/local/apache/conf/httpd.conf-real /usr/local/apache/conf/httpd.conf
/usr/local/apache/bin/apachectl start
———————————————————————————-
fi
}
take_vip () 함수는 자기가 director 가 되었을 경우 실행하는 함수이다.
take_vip () {
# 디렉터가 되는 경우
# Remove vip honoring
dishonor_vip
# Add interface alias on the vip
ifconfig $DEV:$ALIAS $VIP netmask 255.255.255.255 broadcast $VIP up &> /dev/null
route add -host $VIP dev $DEV:$ALIAS &> /dev/null
이부분 추가
——————————————————————————–
ifconfig $DEV:777 211.238.41.174 netmask 255.255.255.224 up &> /dev/null
/usr/local/apache/bin/apachectl stop
ln -sf /usr/local/apache/conf/httpd.conf-vip /usr/local/apache/conf/httpd.conf
/usr/local/apache/bin/apachectl start
——————————————————————————–
# Do ARP spoofing; do several times
if [ $DOARPSPOOFING = true ]
then
HWADDR=`ifconfig $DEV | grep HWaddr | cut -d’ ‘ -f11`
BADDR=’ff:ff:ff:ff:ff:ff’
( \\
$SENDARP $DEV $VIP $HWADDR $VIP $BADDR &> /dev/null; usleep 400; \\
$SENDARP $DEV $VIP $HWADDR $VIP $BADDR &> /dev/null; usleep 400; \\
$SENDARP $DEV $VIP $HWADDR $VIP $BADDR &> /dev/null; \\
) &
fi
}
////// slave (svr2) 의 /usr/clx/sbin/vipctl 수정
honor_vip () 의 수정 부분에 아래 내용을 추가
ifconfig $DEV:777 down
/usr/local/apache/bin/apachectl stop
ln -sf /usr/local/apache/conf/httpd.conf-real /usr/local/apache/conf/httpd.conf
/usr/local/apache/bin/apachectl start
/usr/clx/sbin/dush -n svr1 /etc/rc.d/init.d/mysql stop
/etc/rc.d/init.d/mysql stop
/usr/clx/sbin/dua /usr/local/mysql/data/syszone
/usr/clx/sbin/dush -n svr1 /etc/rc.d/init.d/mysql start
/etc/rc.d/init.d/mysql start
take_vip () 의 수정 부부에 아래 내용을 추가
ifconfig $DEV:777 211.238.41.174 netmask 255.255.255.224 up &> /dev/null
/usr/local/apache/bin/apachectl stop
ln -sf /usr/local/apache/conf/httpd.conf-vip /usr/local/apache/conf/httpd.conf
/usr/local/apache/bin/apachectl start
이는 웹 서버는 Encluster 를 이용하여 정상적으로 부하분산을 시키고 Mysql 의 경우는
replication 을 이용하여 평소에는 master 서버의 내용을 slave 에서 실시간 복제를 하고
있다가 master 서버에 문제가 발생했을 경우 slave 서버가 director 가 되면서
mysql connection address 를 slave 가 가져가면서 slave 에서 db service를 하게 된다.
그런 이후 master 가 살아나면 slave db server 새로 갱신된 내용을 master 서버로 file
dump 방식으로 다시 전달하고 master 서버에서 db connection ip address 를 가져 오게
되어 master 서버에서 다시 서비스를 하게 된다.
slave 서버에서 master 서버로 다시 db service server가 변경되는 액션은 관리자가
수동으로 처리하게 하고 있다. 자동으로 할 경우엔 slave server 의 honor_vip ()
함수의 추가 내용 마지막에 /etc/rc.d/init.d/cmctl restart 를 추가해 주면 된다.
;;; 추가 설정 시 주의 사항
rsh, rlogin 을 이용한 dua, dush util 를 설치하고 설정해야 함.
direct 가중치를 master 노드에 200 , slave 노드에 100 을 주도록 한다.
3.1.7 Encluster 1.6 의 작동 원리
3.2. Encluster 2.0을 이용한 리눅스 부하분산 클러스터 구축
3.2.1 Encluster 2.0 구성 및 기능 소개
3.2.2 Encluster 2.0 설치
ftp://clunix@technet.clunix.com/EnCluster 에서 최신 버전을 다운 받는다.
– IPVS Kernel 및 ipvsadm 설치
ipvs 가 패치, 적용된 rpm kernel 를 설치 한다.
ipvsadm 역시 rpm 으로 설치 한다. Source 설치 시에는 반드시 /usr/sbin 밑에 링크를 건다.
# ln -s /sbin/ipvsadm /usr/sbin/ipvsadm
– RPM 설치
# rpm -ivh ecm-base-1.0.0-1.i386.rpm
# rpm -ivh ecm-mon-1.0.0-1.i386.rpm
# rpm -ivh ecm-ui-1.0.0-1.i386.rpm
# rpm -ivh ecm-l4-1.0.0-1.i386.rpm
# rpm -ivh ecm-mon-1.0.0-1.i386.rpm
# rpm -ivh ecm-tsp-1.0.0-1.i386.rpm
ecm-base RPM을 가장 먼저 설치해야 함
– Encluster 2.0 기본 설정
# vi /usr/clx/etc/econf
—————————————————————————
cl=(name=clunix-cluster dsc=’cluster test cluster’ ip=<ip>192.168.0.101)
—————————————————————————
name, dsc는 http://192.168.0.101:910/ecx/에 접속, 왼쪽 메뉴의 Cluster를 선택하였을
때 나오는 이름, 설명에 해당하는 값임
ip는 CIP(Cluster IP)로서 같은 Cluster에서는 이 값이 동일해야만 서로 통신이 가능하며,
UI 접속 주소이기도 함.
# vi /usr/clx/etc/license.key
– license.key 파일이 없거나 잘못된 키이면, 실행되지 않음
# vi /usr/clx/bin/ecmctl
– ECM channel로서 어떤 network interface를 사용할 것인지 결정 (default: eth0)
– 파일 앞부분에서 아래라인 수정
ECM_NET_DEV=${ECM_NET_DEV:=eth0}
/usr/clx/rc/snapshot 파일이 존재하면, 기존의 설정을 읽게 됨
– 깔끔하게 시작하고 싶은 경우, snapshot 파일을 삭제
# /usr/clx/bin/ecmctl start
# tail -f /usr/clx/log/edbd.log
edbd log를 주시하면서, wake up slept services 라는 메시지가 나오면 ready to serve상태임
http://CIP:910/ecx로 접속
3.2.3 Encluster 2.0 제거
– 기존 install 제거 (ecm-base를 가장 나중에 제거)
# rpm -e ecm-ui (HPC: # rpm -e ecmhpc-ui)
# rpm -e ecm-mon
# rpm -e ecm-base
# rm -rf /usr/clx
* /usr/clx/etc/license.key나 /usr/clx/rc/snapshot 백업할 필요있으면 백업
* /usr/clx를 지우면 dutil과 nodelist 파일도 같이 삭제됨
* 따라서, dutil rpm도 제거하고, 다시 설치하거나,
/usr/clx/sbin과 /usr/clx/etc/nodelist, /usr/clx/etc/nosynclist 만을 남기고
/usr/clx를 삭제하는 것을 권장
3.2.4 Web UI (ecm-ui)를 이용한 Encluster-2.0 관리 하기
3.2.5 Edb-tool 사용하기
3.2.6 Encluster-2.0 작동 원리
4. Data 동기화 ( Data Sync or Data Mirroring )
4.1. rsync 를 이용한 data sync
클러스터에서 디스크를 동기화하는 방법은 많이 소개가 되어져 있다.
예전에는 거의 NFS 를 이용해 왔었는데 보안과 시스템 로드에서 몇가지 문제점
이 있어서 현재는 많이 사용하진 않는다. 현재에 대두되는 걸로는 rsync,GFS,
pvfs, Soft RAID, Intemezzo 등이 있다. 여기서는 가장 간단하면서 경제적이고
부하도 크게 문제되지 않는 rsync 에 대해서 알아보도록 하겠다.
rsync 는 NT 의 미러링과 같이 특정 하드디스크의 데이타를 그 속성을 유지한체
다른 디스크로 동일하게 복제해주는 역활을 하는 프로그램이다.
rsync 로 이용할수 있는것은 아주 다양한데..주로 클러스터 웹서버의 디스크 동
기화, 미러링 서버의 디스크 동기화, 백업서버의 데이터 백업 등이 있다.
rsync는 rcp와 비슷한 동작을 하는 프로그램으로 rcp보다 더 다양한 옵션이 있고,
더 효율적으로 데이터를 전송합니다. (출발지와 목적지 사이에다른 부분만을 전송)
파일크기의 변화나 시간의 변화등을 이용 동기화를합니다.
주요 특징은 다음과 같습니다.
ㅇ 링크, device, 소유자, 그릅, 허가권 복사 지원
ㅇ GNU tar와 비슷한 exclude, exclude-from 옵션 지원
ㅇ rsh 또는 ssh 등 사용가능
ㅇ root 권한이 필요없음
ㅇ anonymous 또는 인증 rsync 서버 지원(미러링에 유용함)
이제 설치로 넘어가 보도록 하자..
4.1.2. rsync 설치
rsync 는 Source 를 이용하여 설치하는 방법과 RPM을 이용하여 설치 하는 방법이
있다.
http://rsync.samba.org/ftp/rsync/ 에서 최신판을 받아 설치 하면된다.
# rpm -Uvh rsync-2.5.7-0.9.i386.rpm 혹은 ..
# tar xzvf rsync-2.5.7.tar.gz
# ./configure
# make
# make install
4.1.3 rsync 설정 방법
rsync 가 사용하는 프로토콜로는 rsh 나 ssh를 사용하거나 특정 포트를 이용하
여 xinetd 데몬으로 제어도 가능하다. 보통 873 포트를 사용한다.
ssh 를 이용한 사용방법과 873 port 를 이용한 사용방법은 다소 차이가 있다.
873 port 사용방법
rsync 를 사용할 리눅스 버젼이 6.x 일경우에는 /etc/inetd.conf 에 다음줄을
추가한다.
rsync stream tcp nowait root /usr/bin/rsync rsyncd –daemon
만일 리눅스 버젼이 Redhat 7.x ~ 9 이면…
/etc/xinetd.d/rsync 파일을 만들어 준다.
———————————————————————-
service rsync
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = –daemon
log_on_failure += USERID
}
———————————————————————-
그리고 /etc/services 에 다음 내용이 있는지 확인하고 없으면 추가한다.
rsync 873/tcp # rsync
rsync 873/udp # rsync
그런후 inetd 혹은 xinetd 데몬을 restart 해준다.
이제 /etc/rsyncd.conf 설정 파일을 만들어 준다.
/etc/rsyncd.conf —————————————————–
[webdata]
path = /usr/local/apache/htdocs
comment = web data
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 211.238.41.164, 211.238.41.165
max connections = 3
timeout 600
————————————————————————
[home] : 서비스명
path : 전송될 data가 들어 있는 경로
uid : data 를 전송하는 사용자의 uid 기본값은 nobody
gid : data 를 전송하는 사용자의 gid 기본값은 nobody
use chroot : path를 root 디렉토리로 사용. 보안상 필요함.
read only : 읽기전용
(클라이언트에서 서버로 올리는 경우에는 read only= no 로 설정을 해야됩니다. )
hosts allow : 호스트별 접속허용. 기본값은 all host이므로 보안을 유지하
려면 반드시 설정함
max connections : 동시접속자수.
timeout : 클라이언트에서 접근시 타임아웃시간.
anonymous 로 운영하는 경우 설정을 해야 클라이언트가 죽었을 때 서버에서 접속을
해체할 수 있습니다.
이렇게해서 873포트를 쓰는 rsync서버의 설정은 끝났습니다.
4.1.4 rsync 클라이언트 사용방법
이제 rsync 클라이언트에서 data 를 동기화 하는 방법을 알아보자.
Mater_LB(www3) 서버를 데이터 관리 서버라고 하자. 즉 Master_LB 서버에 실제
서비스 데이터를 올려 두고 Webserver-1(www1), Webserver-2(www2) 에서 rsync
를 통해 자료를 동기화시키는 구성으로 셋팅을 해보자.
www1, www2 서버에서 아래 명령을 수행한다.
# rsync -avz –delete www3::webdata /usr/local/apache/htdocs
ssh 나 rsh 를 이용한 방법은 rsyncd 를 설치하고 xinetd 설정이나 rsyncd.conf
같은 설정은 하지 않아도 된다. 그냥..
# rsync -avz -e ssh www3:/usr/local/apache/htdocs /usr/local/apache/htdocs
rsh 를 사용하면.. -e rsh 하면 된다.
ssh 를 이용하면 패스워드를 입력해야 하는데 스크립터를 디스크 동기화를 자동화
할때는 다소 불편한 점이 있다. 이때는 –password-file 옵션을 사용하면 암호파일
의 위치를 지정해 줄수 있다.
이와 같이 rsync 클라이언트 사용법을 cron 등에 등록시켜 주기적으로 data 를 업
데이트 시킴으로써…두 호스트 간의 데이타 동기화를 할수 있다.
4.1.5 실제 적용 예제
[ Maste LB 의 /etc/rsyncd.conf 설정 ]
/etc/rsyncd.conf —————————————————–
[webdata]
path = /usr/local/apache/htdocs
comment = web data
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 211.238.41.165, 211.238.41.166
max connections = 3
timeout 600
[dbdata]
path = /usr/local/mysql/data
comment = mysql
uid = root
gid = root
use chroot = yes
read only = yes
hosts allow = 211.238.41.165, 211.238.41.166
max connections = 3
timeout 600
———————————————————————-
[ WebServer-1, WebServer-2 의 자동 Sync Script ]
/root/bin/rsync.sh —————————————————–
rsync -avz –delete www3::webdata /usr/local/apache/htdocs
rsync -avz –delete www3::dbdata /usr/local/mysql/data
————————————————————————
# chmod 755 rsync.sh
이 스크립터 파일에 실행 권한을 주고 실행하면 된다.
그런뒤…cron 에 5분 간격으로 위의 스크립터가 실행되도록 한다.
# crontab -e
————————————————————————
*/5 * * * * /root/bin/rsync.sh
————————————————————————
# /etc/rc.d/init.d/crond restart
이것으로 Rsync 를 이용한 데이터 동기화 내용을 마치도록 하겠다.
4.2. dutils 를 이용한 data sync
4.2.1 dua, dush 은 무엇 인가 ?
dua, dush 는 Encluster-HPC 의 다중 서버 관리 도구이다. 즉 여러대의 서버에
file 및 작업 명령을 일괄적으로 처리하도록 해주는 프로그램이다.
dua, dush 를 정상적으로 사용하기 위해서는 앞에서 설명한 rsh, rlogin 서비스 설정
이 완료되어 있어야 한다.
4.2.2 rsh, rlogin 설정 하기
rlogin, rsh 관련 서비스를 구동하기 위해서는 rsh, rsh-server 두개의 패키지가
설치가 되어져 있어야 한다.
먼저 xinetd 데몬에서 rsh, rlogin 서비스를 사용할 수 있도록 설정을 변경한다.
# vi /etc/xinetd.d/rsh
—————————————————————————–
service shell
{
disable = no
socket_type = stream
wait = no
user = root
log_on_success += USERID
log_on_failure += USERID
server = /usr/sbin/in.rshd
}
—————————————————————————–
# vi /etc/xinetd.d/rlogin
—————————————————————————–
service login
{
disable = no
socket_type = stream
wait = no
user = root
log_on_success += USERID
log_on_failure += USERID
server = /usr/sbin/in.rlogind
}
—————————————————————————–
설정을 변경한 후 xinetd 데몬을 restart 한다.
# /etc/rc.d/init.d/xinetd restart
# vi /etc/securetty
—————————————————————————-
.
..
…
rsh
rlogin
—————————————————————————-
rsh, rlogin 서비스를 허용할 hosts 와 users 설정을 한다.
# vi /etc/hosts
—————————————————————————–
127.0.0.1 localhost
# Data Sync 가 필요한 nodelist
211.238.41.165 www1
211.238.41.166 www2
211.238.41.167 www3
—————————————————————————–
# vi /etc/hosts.equiv
—————————————————————————–
www1
www2
www3
.
—————————————————————————–
# vi $HOME/.rhosts
—————————————————————————–
www1
www2
www3
—————————————————————————–
.rhosts 설정에서는 각 노드간의 rsh 접속이 동일한 계정 사이에서만 기본적으로
이루어 진다. 만일 clunix 계정으로 root 의 권한으로 rsh 접속을 하기 위해서는
root 의 .rhosts 에 아래와 같이 해 주어야 한다.
# vi /root/.rhosts
—————————————————————————–
www1
www2
www3
www1 clunix
www2 clunix
www3 clunix
—————————————————————————–
위 설정에서는 root 계정에서는 www node 간에 rsh, rlogin 으로 별도의 옵션이나
인증없이 login 이 된다.
clunix 계정에서는 -l 옵션으로 www node 간에 rsh, rlogin 으로 root login 이
허용된다.
www1 root # rsh www2
www2 root #
www1 clunix $ rsh -l root www2
www2 root #
4.2.3 dutils 설치 및 기본 설정
dutils 는 dua, dush 로 구성 되어진 Encluster 의 다중 서버 관리 도구이다.
즉 여러대의 서버에 file 및 작업 명령을 일괄적으로 처리하도록 해주는 프로그램이다.
dua, dush 를 정상적으로 사용하기 위해서는 앞에서 설명한 rsh, rlogin 서비스 설정
이 완료되어 있어야 한다.
먼저 Master Node 에 dutil-1.2.1-1.noarch.rpm 를 설치 한다.
# rpm -Uvh dutil-1.2.1-1.noarch.rpm
실제 dua, dush 를 이용하여 일괄 괄리할 서버 리스트를 작성한다.
# vi /usr/clx/etc/nodelist
——————————————————————————
www1
www2
www3
——————————————————————————
** dua : file 을 nodelist 에 포함된 모든 Node 에게 일괄적으로 sync 시키는 도구
** dush : nodelist 의 포함된 node 에게 일괄적으로 내려진 작업을 수행한다.
공통 옵션 설명 :
-l : /usr/clx/etc/nodelist 이외의 다른 nodelist 를 참조할 경우 -l 옵션으로 호출
할수 있다.
예) dua -l /etc/nodelist /root
-n : nodelist 에 포함된 모든 node 가 아닌 특정 node 에만 작업을 수행할 경우 사용됨
예) dua -n www3 /root
-p : 작업을 순차적으로 처리하는 것이 아닌 backgroud mode 로 동시에 작업이 수행된다
예) dush -p “/etc/rc.d/init.d/ecmctl restart”
-s : 노드간 수행 결과를 구분하기 위한 ###executing…” 이란 메세지가 나타나지 않고
수행 결과만을 출력해 주는 옵션이다.
-d : dua 에서 사용되는 옵션으로 디렉토리간의 완전한 sync 를 할때 사용된다.
즉 www1 와 www2 의 디렉토리 내용을 완전히 sync 시킬때 사용되는 옵션으로
그냥 # dua /root 라 수행하면 www1 의 /root 내용이 www2 의 /root 로 파일이
복제 되지만 # dua -d /root 라 수행하면 www2가 www1 보다 더 많은 파일을
가지고 있다면 www1 에 없는 파일은 모두 삭제해 버리고 완전 www1 와 동일한
자료만을 가지게 된다.
4.2.4 dua 를 이용한 Data sync
이제 dua 를 이용한 웹 서비스 데이터 컨덴츠를 동기화 해 보도록 하자.
/home/clunix/www 밑에 html 및 php,jsp 와 같은 웹 소스 파일이 위치 한다면
www1 을 file master 서버로 정해 두고 www1 에서만 파일 업로드를 시키도록
정책을 정한다. 그런 후
www1 에서
# dua /home/clunix/www
라고 정해 주시면 /home/clunix/www 밑의 모든 파일이 www2, www3 로 sync 가
되어진다.
만일 www1, www2, www3 에서 모두 file upload 가 이루어 진다면 ..
www1 에 아래와 같은 스크립트를 하나 만든다.
# vi /root/bin/datasync
—————————————————————————
#!/bin/sh
DUTILS=/usr/clx/sbin
$DUTILS/dua -n www2 /home/clunix/www/
$DUTILS/dush -n www2 “$DUTILS/dua -n www3 /home/clunix/www/”
$DUTILS/dush -n www3 “$DUTILS/dua -n www1 /home/clunix/www/”
$DUTILS/dush -n www3 “$DUTILS/dua -n www2 /home/clunix/www/”
—————————————————————————
위 명령어를 www1 에서 실행하면 www1 의 data 가 www2 로 전달 되고
www2 의 데이터가 www3 로 전달 되고 www3 의 data 가 www1, www2 로 전달되어
3개의 노드의 파일이 모두 동일해 진다.
단 위 구성에서는 www1 서버에 이상이 생기면 파일 동기화에 문제가 발생 할수
있다는 단점이 있다.
dua 는 관리자의 편위를 위한 data sync tool 이다. 모든 active 서버에 데이터
를 multi active 상태로 sync 를 시키기 위해서는 아래의 Intermezzo 나 Pvfs 를
사용해야 한다.
요즘에는 Open GFS File System 이 주요 이슈로 떠 오르고 있다.
4.2.5 dush를 이용한 일괄 관리
dush 를 이용하여 3개의 서버에 일괄적으로 시스템을 관리 할 수 있다.
예를 들면 시스템의 프로그램 일괄 설치 및 시스템 상의 명령어 일괄 수행등에
활용 될수 있다.
## 프로그램 일괄 설치
– dua 로 프로그램 일괄 배포
[root@test01 root]# dua check-utils-2.0.1.rpm
### synchronizing test01
building file list … done
wrote 71 bytes read 20 bytes 182.00 bytes/sec
total size is 109608 speedup is 1204.48
### synchronizing test02
building file list … done
check-utils-2.0.1.rpm
wrote 54927 bytes read 36 bytes 109926.00 bytes/sec
total size is 109608 speedup is 1.99
– dush 로 프로그램 일괄 설치
[root@test01 root]# dush rpm -Uvh check-utils-2.0.1.rpm
– dush 로 프로그램 일괄 수행
[root@test01 root]# dush /usr/local/bin/chkbandwidth
### executing in test01
[test01] [ I N ] 163.52 Kb/s [ OUT ] 306.26 Kb/s
### executing in test02
[test02] [ I N ] 45.66 Kb/s [ OUT ] 1.18 Kb/s
위와 같이 dush 를 잘 이용하면 여러대의 서버를 손쉽게 관리 할수 있다.
4.3. NFS + Automount 를 이용한 data sync
여러대의 서버가 같은 data 로 서비스를 할 경우 Sync 방식 외에 Data Shared
방식으로 서비스를 진행 할수도 있다. 가장 대표적인 서비스가 NFS 이다.
NFS 의 경우 시스템 부하, 보안, NFS Lock 같은 문제로 많은 유저가 사용을
주저 하고 있지만 사이트의 시스템 구성과 서비스 방식에 따라 NFS 서비스는
클러스터 시스템구성에서 가장 적절한 파일 시스템 환경을 제공할 수도 있다.
– nfs 설정
Nfs Server 가 되는 File Server 의 exports 설정 파일을 아래와 같이 설정한다.
# vi /etc/exports
—————————————————————————–
# NFS 원격 설치 시 사용되는 경로
/data/clunix/www *(rw,no_root_squash)
—————————————————————————–
# /etc/rc.d/init.d/portmap restart
# /etc/rc.d/init.d/nfs restart
이것을 각 부하분산 시스템에 적절한 Nfs 설정이 완료된다.
# mount -t nfs file:/data/clunix/www /home/clunix/www
[root@www1 root] df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda3 10080520 148852 9419600 2% /
/dev/hda1 202220 14518 177262 8% /boot
none 514940 0 514940 0% /dev/shm
/dev/hda2 10080520 1547244 8021208 17% /usr
/dev/hda6 2016016 200712 1712892 11% /var
file:/data/clunix/www 234429320 32840 234396480 1% /home/clunix/www
– automount 를 이용한 NFS 서비스 구동하기
automount 는 nfs 서비스와 같이 활용되어 nfs lock 이나 nfs 로 인한 connection
을 효율적으로 관리해 주는 프로그램이다.
nfs 는 항상 node 간의 네트워크 mount 상태가 유지 되는데 automount 는 nfs 의
사용이 없을 경우에는 자동으로 mount 를 해제하고, 사용자가 nfs 해당 경로에 접근
을 하면 자동으로 mount 를 시켜 주는 역활을 한다. 그러다 특정 시간 동안 접속이
없으면 다시 Mount 를 해제하게 된다. 이로써 보안과 성능, Lock 같은 문제를
어느 정도 해결 할수 있다.
automount 에는 am-utils ( amd ), autofs 두가지의 패키지가 있다.
Redhat9 에서는 기본적으로 autofs 를 체택하고 있다.
간단한 설정에 대해 알아보자.
주요 설정 파일은 ..
/etc/auto.master
/etc/auto.misc
# vi /etc/auto.master
======================================================================
/home /etc/auto.clunix –timeout=5
# vi /etc/auto.clunix
======================================================================
clunix/www -fstype=nfs,rw,soft,bg file:/data/clunix/www
# /etc/rc.d/init.d/portmap restart
# /etc/rc.d/init.d/autofs restart
/home/clunix/www 로 이동하면 자동으로 file 의 /data/clunix/www
로 nfs mount 가 된다.
automount 를 사용하게 되면 실제 사용자가 지정된 mount point 에 접근 시에만
자동으로 nfs mount 하고 일정 시간 사용을 하지 않으면 자동으로 umount 를 시
키기 때문에 nfs 서비스로 인한 resource 를 최대한 절약 할 수 있고, 여러명이
지속저으로 Nfs 를 사용할 경우 1개의 곳에서 lock 이 결려도 전체 서비스에 문
제가 생길 가능성이 있는데 automount 로 상당 부분 해소할 수 있다.
autofs-4.x 버전에서는 multiple hostname 기능이 지원한다.
이는 먼저 master 로 Connection 요청을 해서 정상적인 요청이 이루어 지지
않으면 slave 에 연결이 된다. Redhat9 에서는 기본적으로 autofs-3.x 임으로
autofs-4.x 로 업그레이드를 해야 한다.
http://www.kernel.org/pub/linux/daemons/autofs/
4.4. Intermezzo 를 이용한 data sync
4.5. Pvfs 를 이용한 data sync
4.5.1 pvfs ( Parallel Virtual File System ) 소개
4.5.2 pvfs 설치
– Source 다운 로드
ftp://ftp.parl.clemson.edu/pub/pvfs/
pvfs-1.6.2.tgz
pvfs-kernel-1.6.2-linux-2.4.tgz
– 네트워크 설정 준비 환경
Pvfs Meta Server : www3.clunix.org
I/O Server : www1.clunix.org, www2.clunix.org
File Clients : www1.clunix.org, www2.clunix.org
PVFS 시스템 구성은 크게 3가지로 나누어 진다. 파일의 변경 정보가 저장되는 Meta 서버와
각 파일의 inode 정보들이 생성되는 I/O 서버, 그리고 파일 시스템 동기화가 되어지는
클라이언트 노드로 구성되어진다. 테스트 환경에서 각 성격 별 서버가 결정 나면
모든 구성 노드들의 /etc/hosts 에 반드시 해당 서버들의 hosts 정보를 입력해야 한다.
# vi /etc/hosts
———————————————————————
211.238.41.165 www1.clunix.org www1
211.238.41.166 www2.clunix.org www2
211.238.41.167 www3.clunix.org www3
# vi /etc/sysconfig/network
HOSTNAME=xxx.clunix.org ->( 각 서버에 해당하는 호스트네임 )
– PVFS Source 설치
# mv pvfs-1.6.2.tgz pvfs-kernel-1.6.2-linux-2.4.tgz /usr/local/src
# cd /usr/local/src
# tar xzvf pvfs-1.6.2.tgz
# tar xzvf pvfs-kernel-1.6.2-linux-2.4.tgz
# cd pvfs-1.6.2
# ./configure && make && make install
# cd ../pvfs-kernel-1.6.2-linux
# ./configure –with-libpvfs-dir=../pvfs-1.6.2/lib
# make && make install
– Meta Server ( www3 ) 설정
# mkdir /pvfs-meta
# cd /pvfs-meta
# /usr/local/bin/mkmgrconf
——————————————————————-
This script will make the .iodtab and .pvfsdir files
in the metadata directory of a PVFS file system.
Enter the root directory:
/pvfs-meta //metadata를 저장할 디렉토리 이름 (바로 위에서 만든 디렉토리이다.)
Enter the user id of directory:
root
Enter the group id of directory:
root
Enter the mode of the root directory:
777
Enter the hostname that will run the manager:
www3.clunix.org (mgr을 실행시킬 서버, 메타서버의 호스트이름을 쓰면 된다.)
Searching for host…success
Enter the port number on the host for manager:
(Port number 3000 is the default)
3000
Enter the I/O nodes: ( can use form node1, node2, …or nodename#-#,#,#)
www1.clunix.org, www2.clunix.org -> i/o 서버에 해당하는 서버의 호스트 네임을 적는다.
Searching for hosts…success
I/O nodes : www1.clunix.org, www2.clunix.org
Enter the port number for the iods:
(Port number 7000 is the default)
7000
Done!
——————————————————————-
# mgr -> meta server daemon running
# ps aux | grep mgr -> 프로세스 확인
– I/O Server 설정
# mkdir /pvfs-data
# chmod 700 /pvfs-data
# chown -R nobody.nobody /pvfs-data
# cp /usr/local/src/pvfs-1.6.2/system/iod.conf /etc/iod.conf
# iod -> I/O server daemon running
# ps aux | grep iod -> 프로세스 확인
// pvfs-data 디렉토리의 소유권이 nobody 가 아닌 경우 iod 데몬이 실행 되지 않는다.
– 클라이언트 설정
# mkdir /lib/modules/2.4.27/misc
# cp /usr/local/src/pvfs-kenel-1.6.2/pvfs.o /lib/modules/2.4.27/misc
# mkdir /mnt/pvfs
# vi /etc/pvfstab
——————————————————————
www3.clunix.org:/pvfs-meta /mnt/pvfs pvfs port=3000 0 0
# pvfsd -> pvfsd client daemon running
# mknod /dev/pvfsd c 60 0
# insmod pvfs
# mount.pvfs www3.clunix.org:/pvfs-meta /mnt/pvfs pvfs port=3000 0 0
# df -h -> mount 확인
// 이것으로 PVFS 설치 및 설정이 완료되었다.
// I/O 서버와 동시에 클라이언트 노드를 사용할 경우 각 해당 설정을 모두 다 해주면
// 된다. 실제 로컬 파일 시스템을 사용하는 성능과 비교 했을때 단일 파일의 크기에는
// 크게 상관이 없지만, 파일 수에 대해서는 상당한 영향을 받는 것을 확인했다.
// 즉 500M 파일 하나를 복사 하는 속도는 로컬 시스템과 PVFS 차이는 없지만
// 100개 정도의 파일 ( 총 크기 10M )을 복사하는데는 500M 1개 파일 복사하는데 비해
// 8배 정도 더 속도가 느리게 나왔다. 이런 기능 상의 특성을 이용해서 적절한 곳에
// 사용해야 할것이다.
5. Benchmark Tool로 시스템 성능 체크 하기
지금까지 LVS 기능을 이용하여 고성능 웹서버를 구축하는 방법에 대해 알아 보았다.
이장에서는 이렇게 구축한 시스템이 어느 정도의 성능을 나타낼수 있는지를 확인하는
방법에 대해 알아보도록 하겠다.
5.1. 웹서버 벤치마크 개론
웹서버 벤치마크는 웹서버처리과정을 자동으로 프로그램한 툴을 통해 웹서버의 처리율
과 응답시간을 측정하는 것으로 단일 서버의 최대 처리 용량을 산정하여 전체 서비스에
필요한 자원 산정을 하는 기준을 제시하기 위해서다.
뿐만 아니라 초기의 벤치마크 자료는 서비스 이후 발생하는 병목에 대해 문제 원인 및
S/W 및 H/W 의 업그레이드등의 튜닝의 객관적 기준을 제시해 주는 역할을 한다.
그러므로 반드시 대형 사이트 구축 시에는 초기 구축 이후 구축 시스템의 객관적 성능
을 체크해 두어야 한다.
– 웹 벤치마크를 위해 기본적인 HTTP 메커니즘
클라이언트(브라우저) -> 서비스 요청 ( 네트워크 연결 요청 )
서버 -> 네트워크 연결 응답 -> TCP 연결
클라이언트 -> HTTP 요청
서버 -> HTTP 응답
클라이언트 -> HTTP 요청
서버 -> HTTP 응답
클라이언테(브라우저) -> HTTP 수용 ( 브라우저 분석 )
서버 -> TCP 연결 해제
위의 방식이 일반적인 웹 서비스 메커니즘 ( HTTP/1.1 ) 이라 보면 된다.
– 웹 벤치 마크 시 고려 대상
Single Server 일때의 성능 수치 분석
Multi Server ( Cluster ) 일때의 성능 수치 분석
-> Single node 일 경우 기본 시스템 상태에서의 성능값과 최적 튜닝 이후의
성능값을 파악해 둔다. 그런 후 Cluster Server 시에 성능을 체크하고 서버
수에 따른 성능 향상 손실값을 구한다.
Multi 서버 최대 성능 / ( Single 서버 최대 성능 * n ) ;; n 은 Multi node 수
손실값이 큰 경우 손실이 발생하는 원인에 대해 파악해 두어야 한다.
Static page 중심의 성능과 Dynamic page 중심의 성능 파악
방화벽이나 Proxy 서버등이 있을 경우 이 환경에서의 테스트 역시 필요하다.
벤치 마크 당시 시스템 모니터링으로 통해 시스템 상의 자원 활용률 역시 파악을 하여
특정 리소스 (CPU,MEM,I/O,NET)에 발생 하는 병목을 파악해 두도록 한다.
그리고 벤치 마크 시에는 반드시 웹 로그를 off 시키도록 한다. 수많은 요청을 하기 때문
에 웹 로그의 크기가 짧은 시간에 급작스럽게 크지므로 디스크의 병목이 발생 할수 있다.
(SPECweb 에서는 웹로그 사용해야함)
그리고 한대의 클라이언트 PC에서 테스트 경우 일정 부하 이후에 성능 증가가 없을 경우
두대의 클라이언트 PC로 벤치 마크 수행하고 만일 서버측에서 더 처리가 가능하면 이는
클라이언트 병목임으로 클라이언트에서의 최대 요청 수도 확인해 봐야 한다.
– 벤치 마크 순서
+ 테스트 환경 준비 및 확인
– 장비 설치, 네트워크 연결
– 테스트 환경에 대한 벤치 마크
( network 벤치 마크 : netperf, 시스템 불필요 데몬 제거, 튜닝 )
+ 벤치 마크 수행
– 벤치 마크 실행 ( 반복 수행 후 평균 냄 )
– 서버 모니터링 ( vmstat, process account)
단위 테스트 별로 최소 10분 이상 테스트 수행
SPECWeb 의 경우 20분 정도 수행
부하를 높여 가며 반복 테스트 -> 자동화 된 툴 사용 가능 ( autobench )
+ 결과 분석
– 벤치 마크 도구의 리포트 분석
Request per second : Maximum hit per dya 등을 구할때 기준 척도
Response time : 응답 시간에 민갑한 경우 ( 쇼핑몰 )
Max. concurrency : 동시 접속 수
Transfer rate : 네트워크 자원 소모량 측정
5.2. 웹서버 벤치 마크 툴과 사용 방법
5.2.1. ab 를 이용한 벤치마킹
http://httpd.apache.org 사이트에서 구할 수 있다. apache package 에 포함되어져
있으며 single, fixed 웹 환경에 사용 가능하다. 즉 단일 서버 성능 체크 시 유용하다.
사용이 간편하고 기본 apache 웹서버에 내장이 되어져 있어 별도의 설치 부담이 적다는
장점이 있다.
사용 옵션으론
-n : 웹 요청 수
-c : 동시 유저수
-k : KeepAlive 사용
-h : help
사용 예제 )
Single Server Test
# ab -n 50000 -c 1000 http://192.168.123.165/
==================================================================================
Server Software: Apache/1.3.31
Server Hostname: 192.168.123.165
Server Port: 80
Document Path: /
Document Length: 7 bytes
Concurrency Level: 1000
Time taken for tests: 36.852 seconds
Complete requests: 50000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 8601548 bytes
HTML transferred: 350063 bytes
Requests per second: 1356.78 [#/sec] (mean)
Time per request: 737.04 [ms] (mean)
Time per request: 0.74 [ms] (mean, across all concurrent requests)
Transfer rate: 233.41 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 142 774.9 2 9003
Processing: 18 166 1016.0 93 28055
Waiting: 3 166 1016.0 93 28055
Total: 18 308 1406.3 95 31060
=================================================================================
Cluster Server Test ( 2node )
# ab -n 50000 -c 1000 http://192.168.123.175/
=================================================================================
Server Software: Apache/1.3.31
Server Hostname: 192.168.123.175
Server Port: 80
Document Path: /
Document Length: 7 bytes
Concurrency Level: 1000
Time taken for tests: 19.276 seconds
Complete requests: 50000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 8600860 bytes
HTML transferred: 350035 bytes
Requests per second: 2593.90 [#/sec] (mean)
Time per request: 385.52 [ms] (mean)
Time per request: 0.39 [ms] (mean, across all concurrent requests)
Transfer rate: 446.20 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 177 831.6 2 9001
Processing: 4 174 863.6 93 13966
Waiting: 3 174 863.6 93 13966
Total: 4 351 1281.1 95 16451
===============================================================================
unable access_log, keepalive on, max process modify 등등 수정 후 다시 시도
5.2.2. httperf 를 이용한 벤치마킹
ftp://ftp.hpl.hp.com/pub/httperf 에서 구할 수 있다.
비교적 단순하면서 다양한 통계 결과를 출력 할수 있다.
(https, 수행시간별 통계,access log relay 가능, CPU, Net, cookie, session.. )
주요 사용 옵션
–hog : 웹 시뮬레이션 시 ephemeral port (1024~5000)를 사용할수 있게 한다.
기본적으로는 위 port 사용의 제한이 있음.
–server : 시뮬레이션을 할 웹서버 주소
–num-conns : Connection 수
–num-calls : connection 이 Closeing 되기 전에 다시 요청하는 수
–rate : session 과 connection 비율, –wsess 와 같이 사용 가능
–uri : request page
–wsess : session 요청 및 session 지연 시간 등을 지정
–ssi : https 사용
사용 예 )
httperf –hog –server www –num-conns 100 –rate 10 –timeout 5
www 서버에 100 개의 connection 을 만들고 fixed rate 비용을 10 으로 한다.
Single Server TEST
# httperf –hog –server=192.168.123.165 –rate=100 –num-conns=50000 \\
–num-calls=10
==========================================================================
Maximum connect burst length: 1
Total: connections 1000 requests 2000 replies 1000 test-duration 9.993 s
Connection rate: 100.1 conn/s (10.0 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 1.2 avg 1.7 max 2.4 median 1.5 stddev 0.2
Connection time [ms]: connect 0.4
Connection length [replies/conn]: 1.000
Request rate: 200.1 req/s (5.0 ms/req)
Request size [B]: 76.0
Reply rate [replies/s]: min 100.0 avg 100.0 max 100.0 stddev 0.0 (1 samples)
Reply time [ms]: response 1.2 transfer 0.0
Reply size [B]: header 193.0 content 7.0 footer 2.0 (total 202.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0
CPU time [s]: user 3.35 system 6.63 (user 33.5% system 66.3% total 99.9%)
Net I/O: 34.4 KB/s (0.3*10^6 bps)
Errors: total 1000 client-timo 0 socket-timo 0 connrefused 0 connreset 1000
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
==========================================================================
Cluster Server TEST ( 2node )
# httperf –hog –server=192.168.123.175 –uri=/index.html –rate=100 \\
–num-conns=1000 –num-calls=10
==========================================================================
Maximum connect burst length: 1
Total: connections 1000 requests 2000 replies 1000 test-duration 9.994 s
Connection rate: 100.1 conn/s (10.0 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 1.2 avg 1.9 max 2.8 median 1.5 stddev 0.4
Connection time [ms]: connect 0.5
Connection length [replies/conn]: 1.000
Request rate: 200.1 req/s (5.0 ms/req)
Request size [B]: 76.0
Reply rate [replies/s]: min 100.0 avg 100.0 max 100.0 stddev 0.0 (1 samples)
Reply time [ms]: response 1.3 transfer 0.0
Reply size [B]: header 193.0 content 7.0 footer 2.0 (total 202.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0
CPU time [s]: user 3.03 system 6.97 (user 30.3% system 69.7% total 100.1%)
Net I/O: 34.4 KB/s (0.3*10^6 bps)
Errors: total 1000 client-timo 0 socket-timo 0 connrefused 0 connreset 1000
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
==========================================================================
5.2.4. http-load 를 이용한 벤치마킹
http://www.acme.com/software/http_load 에서 구할 수 있다. ab 에 비해 오랜 시간
테스트가 가능하고 ab 보다 높은 성능 수치를 보이는 우수한 성능의 벤치 마크 도구이다.
사용 예 )
http_load -parallel 1000 -seconds 30 url http://192.168.123.165/index.html
-parallel : 동시 접속 수
-seconds : 테스트 수행 시간
url : 테스트 페이지 경로
5.2.4. SPECweb을 이용한 벤치마킹
http://www.spec.org 에서 구할 수 있다. SPECWeb 벤치 마크 툴은 공인 상용 벤치 마크툴로
실제 웹 사이트와 유사한 환경을 자동 생성한 후 통계적 기법으로 시뮬레이션 하는 툴로
객관적인 평가 자료로 많이 활용 되어진다.
5.3. 벤치마크 시나리오 수립 및 분석 하기
5.4. 웹 시스템 튜닝 하기
6. 리눅스 클러스터를 이용한 대용량 웹 클러스터 시스템 구성 하기 ( 시스템 컨설팅 )
6.1. 인터넷 웹 클러스터 개론
6.2. 대규모 인터넷 사이트 구축 설계