[클러스터] 리눅스 부하분산 클러스터링에 대하여 – 아랑저

==============================================================================

     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. 대규모 인터넷 사이트 구축 설계

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

1 Response

  1. los angeles night jazz 말해보세요:

    los angeles night jazz

페이스북/트위트/구글 계정으로 댓글 가능합니다.