잊지 않겠습니다.

출처 : http://www.cyberlation.net/entry/LVS-IPVS-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-DR-Direct-Routing
----------------------------------------------------------------------------------

IPVS Configuration : DR (Direct Routing)


LVS 에서 부하를 분산하는 방법 즉, 패킷을 다른 노드로 전달해 버리는 방법(IP Packet Forwarding Method)에는 크게 NAT (Network Address Translation), TUN (IP Tunneling), DR (Direct Routing) 등 3가지가 있으며, 여기에서는 가장 널리 사용되는 Direct Routing 방법을 위한 설정 사항을 정리한다.

1. Dispatcher Node 설정

Dispatcher Node (또는 Director)는 Clients로부터 서비스 요청 패킷을 받아 미리 설정된 Scheduling 방식으로 Real Servers에게 부하를 분산하는 역할을 수행한다.
1.1. VIP 및 DIP 설정
Dispatcher Node에서는 크게 DIP (Director IP)와 VIP (Virtual IP)를 설정해야 한다. 여기에서 DIP는 Dispatcher Node가 고유하게 가질 IP 주소로서, NIC의 기본 IP 주소가 된다. 반면 VIP는 외부 Clients에게 서비스를 제공하기 위해 사용될 인터페이스 IP 주소 (즉, 외부 Clients가 접속할 IP 주소)로서, Aliasing을 통해 설정할 수 있으며, 부하를 상호 분산할 Real Server도 이 VIP를 반드시 가져야 한다.

따라서, 우선 VIP가 123.234.1.101 이고, DIP가 123.234.1.102 이라고 가정할 때,

>$ su -
Password :
># ifconfig eth0 123.234.1.102 netmask 255.255.255.0 up
># ifconfig eth0:1 123.234.1.101 netmask 255.255.255.0 up
># ifconfig

위와 같이, ifconfig 명령을 이용하여 VIP와 DIP를 각각 설정한 다음, ifconfig로 설정사항을 확인한다. 단, 이미 eth0에 DIP가 설정되어 있는 경우가 대부분이므로, 이 단계에서는 VIP 만을 설정해도 된다.

1.2. Packet Forwarding 활성화
Dispatcher 는 Client로부터 전송된 요청 메시지를 Real Server로 전달해야 하므로, 반드시 Packet Forwarding 기능이 활성화되어 있어야 한다. 이는 proc의 ip_forward의 값을 1로 설정함으로써 가능하다.

># echo 1 > /proc/sys/net/ipv4/ip_forward
1.3. IPTABLES 및 IPVSADM 설정 초기화

Virtual Service를 본격적으로 등록하기 전에 IPTABLES와 IPVSADM의 설정을 다음과 같이 초기화한다. 단, 현재의 설정 사항이 문제를 야기할 소지가 없을 때에는 본 단계를 생략할 수 있다.

># iptables -F                // Clear all iptables rules
># iptables -Z                // Reset iptables counters
># ipvsadm -C               // Clear all ipvsadm rules and services
1.4. Virtual Service 등록 (IPVSADM 설정)
이미 Dispatcher Node에 IPVS Admin이 설치되었다고 가정한다. 정상적으로 설치된 경우, root 계정으로 쉘에서ipvsadm 명령을 실행하면 다음과 같은 화면이 출력되면 정상이다.

># ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
>#

이 상태에서 부하를 분산시킬 Dispatcher Node의 VIP와 Port 번호 그리고 Scheduling 방식을 다음과 같이 입력한다. 단, 여기에서는 VIP로 접속하는 Web Requests (80 port)를 Round-Robin 방식으로 부하 분산시키는 것을 가정한다.

># ipvsadm -A -t 123.234.1.101:80 -s rr

여기에서 각 옵션은 다음과 같다.
  • -A, --add-service : 가상 서비스의 추가를 위한 옵션으로서, 임의의 가상 서비스는 IP 주소, Port 번호, 프로토콜의 조합으로 유일하게 정의된다.
  • -t, --tcp-service : TCP 서비스를 의미하며, 가상 서비스를 규정하는 한 요소이다.
  • -s, --scheduler : TCP 연결과 UDP Datagram을 Real Server에게 전달(할당)하기 위한 알고리즘으로서, LVS에서는 Kernel 모듈로서 총 10개의 방식이 구현되어 있다.
    • rr : Round Robin
    • wrr : Weighted Round Robin
    • lc : Least-Connection
    • wlc : Weighted Least-Connection
    • lblc : Locality-Based Least-Connection
    • lblcr : Locality-Based Least-Connection with Replication
    • dh : Destination Hashing
    • sh : Source Hashing
    • sed : Shortest Expected Delay
    • nq : Never Queue


2. Real Server 설정

Real Server는 실제 Client에게 서비스를 제공하는 노드로서, Dispatcher Node로부터 전달된 요청을 처리한 뒤 바로 Client에게 응답 메시지를 전송한다.

2.1. ARP Problem 해결 : ARP Hidden
패 킷 전달 방식에 있어 NAT를 제외한 TUN 및 DR 방식은 모두 ARP Flux Problem을 해결해야 한다. 기본적으로 Dispatcher Node와 Real Server 모두 VIP를 갖고 있기 때문에, 클라이언트가 VIP의 MAC 주소를 묻는 ARP Request를 전송했을 때 Dispatcher와 Real Server 모두 이에 응답하게 되면 클라이언트는 이들 중 특정 서버의 MAC 주소를 해당 VIP에 해당하는 MAC 주소로 기억(ARP Caching)하고는 이 서버에게만 모든 서비스 요청 메시지를 전송한다. 결국 부하 분산을 더 이상 제공할 수 없으며, 임의의 클라이언트가 어떤 서버로부터 서비스를 제공받는지 관리할 수 없다. 

결국 이를 해결하기 위해서는 클라이언트가 ARP 요청 메시지를 전송했을 때 Dispatcher만이 이에 응답하고, Real Server는 모두 ARP 요청 메시지를 무시해야 한다. 여기에서는 가장 간단한 ARP Hidden 방식을 소개한다.

일반적으로 Real Server에 VIP는 lo 장치에 Aliasing으로 설정되기 때문에, lo 장치와 다른 모든 인터페이스에 대해 ARP를 무시하도록 설정한다.

># echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
># echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
># echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
># echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

2.2. VIP 및 RIP 설정
Real Server는 고유의 IP 주소인 RIP (Real Server IP)를 갖고 있으며, Dispatcher는 RIP 주소를 기반으로 서비스 요청을 분산시킨다. 다만, Direct Routing 방식의 특성상 처리된 클라이언트의 요청은 Real Server에서 클라이언트로 직접 전달되므로(NAT 방식에서 Dispatcher를 거치는 것과는 달리), Real Server는 VIP 주소도 함께 lo 장치로서 갖고 있어야 한다. 
따라서, 우선 VIP가 123.234.1.101 이고, RIP가 123.234.1.111 이라고 가정할 때,

># ifconfig eth0 123.234.1.111 netmask 255.255.255.0 up
># ifconfig lo:0 123.234.1.101 netmask 255.255.255.255 up
># ifconfig

위와 같이, ifconfig 명령을 이용하여 VIP와 RIP를 각각 설정한 다음, ifconfig로 설정사항을 확인한다. 단, 이미 eth0에 RIP가 설정되어 있는 경우가 대부분이므로, 이 단계에서는 VIP 만을 설정해도 된다.

2.3. Routing Table 설정
lo:0 장치에 VIP를 설정했으므로, Destination이 VIP인 요청 메시지를 lo:0 장치로 전달해야 한다. 그런 다음에는 이를 Real Server의 커널에 의해 처리된다.

># route add -host 123.234.1.101 dev lo:0


3. Real Server를 Virtual Service에 등록 (on Dispatcher Node)

Dispatcher Node 및  Real Server의 설정이 완료되었고, Virtual Service도 등록되었으므로, 이제 실제 Virtual Service를 제공할 Real Server 노드를 Virtual Service에 등록한다. 일반적으로 Dispatcher Node 또한 부하 분산의 기능 외에 Real Server와 같이 Virtual Service를 제공할 수 있기 때문에, 여기에서는 Dispatcher Node가 Real Server로서 Virtual Service에 등록되는 경우와 일반적인 Real Server가 Virtual Service에 등록되는 경우로 구분하여 정리한다.

참고로 Real Server가 Virtual Service에 등록되는 시점부터 바로 클라이언트는 VIP를 통해 서비스를 제공받을 수 있다.

3.1. Dispatcher를 Real Server로서 등록하기
Dispatcher Node가 Real Server로서 Virtual Service를 제공하기 위해서는 클라이언트로부터 전송된 요청 메시지를 다음과 같이 Local host (127.0.0.1) 로 전송할 수 있도록 등록하면 된다.

># ipvsadm -a -t 123.234.1.101:80 -r 127.0.0.1 -g

여기에서 각 옵션은 다음과 같다.
  • -a, --add-server : 가상 서비스에 Real Server를 추가하기 위한 옵션으로서, 임의의 가상 서비스를 나타내는 IP 주소, Port 번호, 프로토콜의 조합 (Virtual Service 등록시 입력한 값)과 더불어 추가할 Real Server의 IP 주소로서 추가된다.
  • -t, --tcp-service : TCP 서비스를 의미하며, 가상 서비스를 규정하는 한 요소이다.
  • -r, --real-server : Virtual Service에 등록할 Real Server의 IP 주소 또는 호스트명으로서, 경우에 따라 Port 번호를 추가할 수 있다.
  • Packet-forwarding-method : Dispatcher Node에 전달된 클라이언트의 요청 메시지를 Real Server에게 전달하기 위한 방식으로서, LVS에서는 3가지 방식이 있다.
    • -g, --gatewaying : Direct Routing (gatewaying 방식 사용, Default)
    • -i, --ipip : Tunneling (ipip encapsulation 방식 사용)
    • -m, --masquerading : NAT (Masquerading 방식 사용)
3.2. Real Server를 등록하기

일반적인 Real Server를 Virtual Service에 등록하는 방식도 위와 동일하다. 다만 local host 대신 RIP를 입력하는 것만 차이가 있다.

># ipvsadm -a -t 123.234.1.101:80 -r 123.234.1.111 -g
3.3 Virtual Service 설정 확인

위와 같이 Real Server를 Virtual Service에 등록한 다음에는 정상적으로 등록되었는지 그 결과를 확인한다.

># ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  123.234.1.101:80  rr
  ->  127.0.0.1:80                    Route    1         0               0 
  ->  123.234.1.111:80             Route    1         0               0 
>#


4. Virtual Service 상태 모니터링

이상과 같이 Virtual Service에 Real Server가 등록된 이후에는 즉시 VIP를 통한 서비스 제공이 가능하다. 이때 Dispatcher Node에서 주기적으로 서비스 상태(# of Active Connection and # of Inactive Connection)를 계속해서 모니터링하고 싶은 경우 watch 명령을 이용한다.

># watch ipvsadm -Ln



Posted by Y2K
,

LVS 관련 자료 (2)

OS 자료들 2009. 6. 30. 11:56


Linux Virtual Server(LVS)




ㅇ 제작 리눅스포털(www.superuser.co.kr) 수퍼유저코리아 서버


ㅇ SULINUX 홈페이지 : www.sulinux.net

ㅇ 리눅스포털 홈페이지 www.superuser.co.kr




http://www.linuxvirtualserver.org/


The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system.

March 31, 2007 SUPERUSER.CO.KR 이창목


1. Linux Virtual Server(LVS)?


리눅스 가상 서버란한대의 서버로 증가하는 인터넷 사용자를 처리하기가 힘들어 지면서 고가용성 서버를 구축하기 위해 리눅스 머신을 로드 발랜스 하도록 해주는 운영시스템이다.

만약 하나의 노드에서 처리량이 너무 많아서 서비스가 불가능할 경우 간단히 하나의 노드를 병렬 구성으로 추가 함으로써 부하분산을 하도록 하는 것을 말한다공개소스로서 이러한 기능을 담당하고 있는 것이다.


2. Linux Virtual Server 스케쥴링


    1)라운드-로빈(round-robin)

    라운드-로빈 방식은 로드밸런서에 들어오는 요청 패킷들을 차례대로 실제 서버에 할당하는 방식이 다이 방식에서 실제 서버의 현재 부하 상황 등은 고려되지 않는다단지 차례대로 할당할 뿐이다하지만이렇게 하더라도 로드밸런싱을 위해 이전에 사용되던 라운드-로빈 DNS 방식에 의해 서버를 할당하는 방식에 비해서는 우수한데, DNS의 경우는 한번 서버가 지정되면 해당 서버에 수많은 요청 패킷이 몰릴 수 있기 때문이다.

    2)가중 라운드-로빈(weighted round-robin)

    가중 라운드-로빈 방식은 기본적으로 라운드-로빈 방식인데각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다이 방식을 사용해야 하는 경우는 실제 서버들이 CPU의 수와 성능메모리 용량 등 서로 다른 성능을 가지고 있어서각 서버를 동등하게 취급할 수 없는 경우이다.

    3)최소 연결(least connection)

    최소 연결 방식은 실제 서버들 중에서 현재 가장 적은 수의 요청을 처리하고 있는 서버를 선택하여 요청 패킷을 할당하는 방식이다이 방식은 실제 서버의 현재 부하 상황을 동적으로 판단하여 요청을 처리하기 때문에앞의 두 방식에 비해서 동적으로 우수한 부하 분산 효과를 얻을 수 있다.

    4)가중 최소 연결(weighted least connection)

    가중 최소 연결 방식은 기본적으로 최소 연결 방식인데가중 라운드-로빈 방식과 마찬가지로 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다.


3. 시스템 구성 및 ipvsadm 설치


1)Load Balancer Server

운영체제 : SULinux1.5

커널 : kernel-2.6.9-42.0.2.ELsmp

IP : 210.224.223.1

가상IP : 210.224.223.10

2)Real Server1(RS1)

운영체제 : Sulinux1.5

커널 : kernel-2.6.9-12.0.2.ELsmp

IP : 210.224.223.11

IP : 192.168.0.11 [NAT 설정시 부여할 사설 ip]


3)Real Server1(RS2)

운영체제 : CentOS4

커널 : kernel-2.6.9-42.0.2.ELsmp

IP : 210.224.223.12

IP : 192.168.0.12 [NAT 설정시 부여할 사설 ip]


4)Load Balancer Server ipvsadm 설치

Load Balancer Server에서 ipvsadm을 다운로드 후 설치를 한다.

커널 2.4.x 이하 버젼에서는 커널 컴파일 및 hidden 패치를 해야 했으나 커널 2.6.x에서는

Virtual Server 기능들이 기본 포함되어 있으므로 아주 간단하다.

shell>wget http://mirror.centos.org/centos/4/extras/i386/RPMS/ipvsadm-1.24-6.i386.rpm


shell>rpm -ivh ipvsadm-1.24-6.i386.rpm


shell>ipvsadm

IP Virtual Server version 1.2.0 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn


설치가 정상적으로 되었다면 위와같이 나타날 것이다.여기서부터 ipvsadm을 이용하여 아래 방식 으로 설정하여 테스트 해보도록 하겠다.


  • Direct Routing

  • NAT 방식

A.Direct Routing 방식

실제 서버와 부하분산 서버에서 가상 IP 주소를 부여하여 서로 공유한다부하분산 서버에도

마찬가지로 가상 IP 주소를 설정한 인터페이스가 있어야하며 이 인터페이스를 이용요청

패킷을 받아들이고 선택한 서버에 직접 라우팅할 수 있게 된다.

모든 실제 서버는 가상 IP주소로 설정한 non-arp alias 인터페이스가 있거나 가상 IP 주소로

향하는 패킷을 지역 소켓으로 재지향한다그래서 실제 서버 에서 패킷을 지역적으로 처리할

수 있는 구조를 가지게 된다.


Direct Routing 방식의 구조도는 아래와 같다.










A-1.Load Balancer Server 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


shell>ipvsadm -A -t 210.224.223.10:80 -s rr

라운드-로빈방식으로 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.11:80 -g

RS1 서버로 다이렉트 라우팅 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.12:80 -g

RS2 서버로 다이렉트 라우팅 설정



A-2.Real Server(RS1) 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경하여야 하며

#for ipvs

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

#end of ipvs

#for ipvs ~ #end of ipvs 부분을 추가한후

shell>sysctl -p

커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


A-3.Real Server(RS2) 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경하여야 하며

#for ipvs

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

#end of ipvs

#for ipvs ~ #end of ipvs 부분을 추가한후

shell>sysctl -p

커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만

rr(라운드-로빈)방식을 이용해서 RV1,RV2 서버에 접속하게 된다.

RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.


B.NAT 방식

NAT는 특정한 IP 주소를 한 그룹에서 다른 그룹으로 매핑하는 기능이다.

클라이언트가 가상 아이피로 접근시 사설 아이피로 구성된 부하분산 서버 RS1,RS2로 패킷이 향 하게 된다사설 아이피로 구성된 부하분산 서버는 패킷의 목적지와 포트 번호를 검사한다.

NAT 방식의 구조도는 아래와 같다





B-1.Balancer Server 설정법


네트웍 디바이스 eth0,eth1 정보

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=210.224.223.11

NETMASK=255.255.255.0

GATEWAY=210.223.223.1

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.1

NETMASK=255.255.255.0


/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


shell>ipvsadm -A -t 210.224.223.10:80 -s lc

최소연결 방식으로 설정



shell>ipvsadm -a -t 210.224.223.10:80 -r 192.168.0.11:80 -m

RS1 서버로 NAT 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 192.168.0.12:80 -m

RS2 서버로 NAT 설정


B-2.Real Server(RS1,RS2) 설정법


RS1

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.11

NETMASK=255.255.255.0

GATEWAY=192.168.0.1


RS2

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.12

NETMASK=255.255.255.0

GATEWAY=192.168.0.1


클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만

최소연결 방식을 이용해서 RV1,RV2 서버 중에 접속자가 작은 서버로 된다.

RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.

NAT 방식의 경우 패킷 Load Balancer Server를 반드시 거쳐가야 하므로 20대 이상 구성해야

할때는 문제가 발생할 수 있는 단점이 있다.

C.IP Tunneling 방식

IP 터널링 (IP encapsulation)은 IP 데이터그램안에 IP 데이터그램을 넣는 기술로서어떤 IP  소를 향하는 데이터그램을 감싸 다른 IP 주소로 재지향할 수 있다. IP encapsulation은 현재 엑 스트라넷모빌-IP, IP-멀티캐스트, tunnled 호스트나 네트웍 등에 일반적으로 사용되고 있다.

IP Tunneling 방식의 구조도는 아래와 같다




C-1.Balancer Server 설정법

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:0 210.224.223.10 up

가상아이피 등록


shell>ipvsadm -A -t 210.224.223.10:80 -s wlc

가중치 최소연결 방식으로 설정



shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.11:80 -i

RS1 서버로 Tunneling


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.12:80 -i

RS2 서버로 Tunneling


C-2.Real Server(RS1,RS2) 설정법


RS1

DEVICE=tunl0

ONBOOT=yes

BOOTPROTO=static

IPADDR=210.224.223.10

NETMASK=255.255.255.0


RS2

DEVICE=tunl0

ONBOOT=yes

BOOTPROTO=static

IPADDR=210.224.223.10

NETMASK=255.255.255.0


또는 각 리얼서버에서


RS1

shell>ifconfig tunl0 210.224.223.10 up

가상아이피를 IPIP Tunnel에 등록한다.

RS2

shell>ifconfig tunl0 210.224.223.10 up

가상아이피를 IPIP Tunnel에 등록한다.


클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만

가중치 최소연결 방식을 이용해서 RV1,RV2 서버 중에 접속자가 작은 서버로 된다.

RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.


http://www.linux.co.kr/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=10904 에서 긁기

Posted by Y2K
,
셋팅하기위해서 아래와 같이 설정하겠다. 공인 아이피대신 그냥 사설아이피를 쓰겠다.
웹서비스를 위한 예제이다.
 
▶ 로드밸런싱 서버 IP : 192.168.1.10    eth0
▶ Real 서버 1번 IP   : 192.168.1.11    eth0 
▶ Real 서버 2번 IP   : 192.168.1.12    eth0
▶ Virtual IP : 192.168.1.5 (DNS에 셋팅할 도메인과 맵핑할 Web IP 예를들어 192.168.1.5 = 
www.empas.com  ...ㅋ )
 
★ 로드밸런싱 서버 설정
LBSERVER# yum intall ipvsadm             ==> RPM으로 ipvsadm 설치
LBSERVER# ifconfig eth0:0 192.168.1.5 netmask 255.255.255.255 up  
                                                   ==> 물리 랜카드 하나에 2개 아이피셋팅 etho 192.168.1.10, eth0:0 192.168.1.5           
LBSERVER# ipvsadm -A -t 192.168.1.5:80 -s wlc
                                                             --라운드로빈(rr)-차례대로 리얼서버로                                                    
                                                             --가중라운드로빈(wrr)-라운드로빈+가중치                               
                                                             --최소연결(lc)-리얼 서버들중 가장 적은 수의 요청을 처리하는 서버 선택.
                                                             --가중최소연결(wlc)-최소연결+가중치                                   
LBSERVER# ipvsadm -a -t 192.168.1.5:80 -r 192.168.1.11:80 -g -w 5     ==> ipvs 테이블 설정
LBSERVER# ipvsadm -a -t 192.168.1.5:80 -r 192.168.1.12:80 -g -w 10
                                                 -a 추가, -t 대상타겟, -r 리소스 주소, -g 다이렉트 라우팅, -w 가중치 설정
LBSERVER# vi /etc/sysctl.conf
----------------------------------------------------------------
net.ipv4.ip_forward = 1               ===>  0을 1로 변경후 저장
----------------------------------------------------------------
LBSERVER# sysctl -p           ====> sysctl.conf 설정 적용    
LBSERVER# ipvsadm  ==>설정확인 , ipvsadm -C 설정 모두 삭제, ipvsadm -e -t ..설정 수정 
----------------------------------------------------------------------
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  211.233.5.72:http wlc
  -> 211.233.5.71:http            Route   10      0          0         
  -> 211.233.5.70:http            Route   10      0          0   
----------------------------------------------------------------------

★ Real 1번 서버 설정 ★
Real_1# ifconfig lo:0 192.168.1.5 netmask 255.255.255.255 up
Real_1# vi /etc/sysctl.conf 
-------------------------------------------------------------
net.ipv4.ip_forward = 1            ===>  0을 1로 변경
#linux-1 part
# ARP 문제 해결을위해 arp에 대한 응답 없음으로 설정(추가부분)
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
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
------------------------------------------------------------------
Real_1# sysctl -p       ====> sysctl.conf 설정 적용
Real_1# vi /usr/local/apache/conf/httpd.conf 에서 virtualhost를 가상아이피(192.168.1.5)로 설정을 한다.
 
★ Real 2번 서버 설정 ★
리얼서버 1번과 같이 설정한다.
 
★ 확인하기 
그리고 나서 로드밸런싱서버, 리얼 서버1, 리얼서버2 에서 /etc/rc.d/init.d/network restart 해준다.
당연히 웹서비스 로드밸런싱이기 때문에 리얼서버 1,2 번에는 웹이 돌아가야지 테스트 확인이가능하다.
리얼1에는 index.htm 파일에 리얼1번이라는 웹피이지를 만들어주고 리얼2에는 index.htm 파일에 리얼2번이라는 웹피이지를
만들어준다. 
이제 www.empas.com 도메인으로 접속하면 한번은 리얼1번에가따가 또 한번은 리얼2번으로 갈것이다.
위에서 지정한  rr, wrr, lc, wlc 를 용도에 맞게 바꿔 가면서 스케줄링을 하면된다.
Posted by Y2K
,

 



6 블록 이상의 테이블에 적용하라.
  오라클 데이터베이스에서 1개의 블록크기는 init<SID>.ora 파일에 정의되어 있는 DB_BLOCK_SIZE 파라메터의 값에 의해 결정됩니다. 만약 이 파라메터의 값이 8K (8192 byte)라면 9152 BYTE (8k X 6 블록) 이상 되는 크기의 테이블일 때 인덱스를 사용하는 것이 좋습니다. 다시 말하면, 테이블의 크기가 작은 경우라면 인덱스를 사용하지 않는 것이 더 효과적인 방법입니다. 

이유는 "PARALLEL OPTION"에서 소개된 것 처럼 전체 테이블 스캔인 경우 빠른 검색을 위해 DB_FILE_MULTIBLOCK_READ_COUNT 파라메터가 제공되고 이 파라메터에 의해 한 번에 읽을 수 있는 데이터 블록의 크기가 결정되기 때문에 테이블의 크기가 작은 경우에는 테이블 전체 스캔이 더 유리할 수 있습니다.

다른 예를 한가지 들어 보겠습니다. 만약, 2페이지 밖에 되지 않는 한 권의 책이 있다고 가정해 보겠습니다. 인덱스라는 타이틀이 설명되어 있는 페이지를 찾으려고 합니다.

첫 번째 방법은 먼저 목차를 검색하여 원하는 페이지를 찾은 다음 해당 페이지로 이동하는 방법입니다. 두 번째 방법은 직접 2 페이지를 검색하여 찾는 방법입니다. 한 권의 책을 테이블이라고 생각해 봅시다. 테이블의 크기가 작은 경우에는 인덱스를 찾고 해당 페이지를 검색하는 것이 직접 페이지를 검색하는 것 보다 빠르지 않을 수도 있습니다. 즉, 테이블의 크기가 6블록 이하(크기가 작음)인 경우에는 테이블 전체스캔이 더 빠를 수 있습니다.

컬럼의 분포도가 10 ~ 15% 이내인 경우
  분포도란 WHERE 조건절을 만족하는 행수가 테이블의 전체 행수에서 차지하는 비율을 의미합니다. 다음 공식을 참조하십시오.

 
  분포도 = ( 조건을 만족하는 행수 / 전체행수 ) X 100
   
  즉, 테이블에 100개의 행이 있고 WHERE 조건절을 만족하는 행수가 10개일 때 분포도는 10%가 됩니다. 인덱스를 통해 데이터를 빠르게 검색하는 메커니즘은 10 ~ 15% 의 분포도가 좋은 컬럼에 보다 빠르게 데이터를 찾아줍니다.

분포가 범위 이내라고 하더라도 절대량이 많은 경우에는 해쉬 클러스트를 검토하라.
  데이터를 검색하는 방법 중에 인덱스를 통한 검색방법으로 좋은 성능이 기대되지 않을 때 사용되는 검색기법이 클러스트를 이용한 방법입니다. 인덱스의 구조적 문제로 인해 더 이상의 성능향상이 기대되지 못한다면 클러스트 기법을 고려해야 합니다.

분포도가 범위이상 이더라도 부분범위의 검색이 가능하다면 인덱스를 사용하라.
  테이블의 데이터 분포를 살펴보면 매우 다양합니다. 컬럼의 값들이 골고루 좋은 분포를 보이는 테이블, 컬럼의 어떤 값은 좋은 분포도를 보이지만 어떤 값은 분포도가 너무 나쁜 경우의 테이블 등 매우 다양합니다. 모든 조건이 좋은 경우에는 별 문제가 없겠지만, 좋은 조건과 나쁜 조건이 같이 저장되어 있는 경우에는 분포도는 나쁘더라도 인덱스를 사용하는 것이 유리합니다. 

이런 경우에는, 분포도가 좋은 컬럼은 인덱스를 통해 검색하게 하고, 분포도가 나쁜 컬럼은 테이블 전체 스캔방법으로 검색하게 하는 실행계획을 결정하면 됩니다.

 
SQL > CREATE INDEX i_big_emp_deptno ON big_emp (deptno)
SQL > SET AUTOTRACE ON
SQL > SELECT empno, ename FROM big_emp
WHERE deptno = 80;    분포도가 좋은 컬럼은 인텍스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > SELECT /*+FULL(big_emp)*/
 

empno, ename

  FROM big_emp
  WHERE deptno = 10;     분포도가 나쁜 컬럼은 전체 인덱스 스캔으로 검색
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP'

인덱스 만을 검색할 수 있다면 분포도가 나쁘더라도 인덱스를 생성하라.
  인덱스를 통해 데이터를 검색하는 방법에는 2가지가 있습니다. 첫 번째 방법은 인덱스를 먼저 검색한 후 테이블로부터 조건을 만족하는 행을 검색하는 방법입니다. 다음 예제를 보십시오.

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP'
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
Select절에 열거된 컬럼들을 index에 존재하지 않기 때문에 인덱스 검색후 테이블로부터 해당 컬럼을 검색해야 함니다.
 
이번 예제도 인덱스를 통해 검색하는 방법입니다. 하지만 조금전에 실행된 SQL문과 차이점은 개발자가 실행한 SQL문의 SELECT절에 정의된 컬럼이 검색하려는 인덱스에 존재하기 때문에 인덱스만 검색하면 조건을 만족하는 행을 모두 찾게 되는 경우입니다. 
이러한 검색 방법을 빠른 인덱스 스캔(Fast Index Scan) 이라고 합니다. 

 
SQL > SELECT empno, ename FROM big_emp
  WHERE deptno = 10;
   결과
 
Execution Plan
0   SELECT STATEMENT Optimizer=CHOOSE
1 0 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO'
 
SQL > DROP INDEX i_big_emp_depton;

https://www.dbguide.net/dbqa/oracle_tune/common/detail1-2.html 에서 무단으로 긁어오기..
언제나 느끼는 것이지만.. 아는 것이 없다. 난. -_-
Posted by Y2K
,
Using Powershell, You cannot use get-credential without some type of user-prompt. 

But! 
I found the method without user-prompt window!!

Here is my code
function Get-PSCredential
{
    param($userName, $password)    
    $secured_password = ConvertTo-SecureString $password -AsPlainText -Force
    New-object Management.Automation.PSCredential($userName, $secured_password)    
}

$cred = Get-PSCredential -userName "Administrator" -password "abcdefghijk"


Posted by Y2K
,
.NET 3.0 Framework을 내놓으면서 LINQToSQL을 발표하면서 데이터와 모델간의 하나의 큰 전환점을 MS는 가지고 왔다. Java 진형의 Hybernate나 iBatis에 대항한 LINQToSQL이 바로 이것인데.. Visual Studio에서 특별한 코딩이 없이, 바로 Db의 Schema를 데이터의 Type으로 얻어오는 것이 가능하고, 그 Type의 생성 및 수정, 삭제가 Data와 같이 연동되어서 사용되어 질 수 있는 MS 진형에서는 나름 혁명적인 사건이라고도 할 수 있다.; (개인적으로는.;)

물리적 Model인 Database의 data를 개념적인 모델인 class로 변경시키고, 개발자들은 보다더 개발에 대해서 Application과 object에 대한 관점을 높이는 것이 보다 더 나은 application을 만들 수 있다는 것이 기본적인 발상인데.. 

이번에 발표된 내용으로는 Visual Studio 2008에 있던 LINQToSQL을 조금은 버리고, ADO .NET Entity Model을 중점으로 갈 것 같다는 느낌이 든다. 

무엇보다 MS SQL Server에 치중된 LINQToSQL이 아닌, ADO .NET 에서 얻을 수 있는 모든 데이터는 다 사용 가능한 ADO .NET Entity Model이 더욱더 좋은 모델이겠지만, 이거 얼마 안지나서 또 바뀌는 것에 대한 이 찜찜함은.;;;

기본적인 사용법은 ADO .NET Entity Model과 LINQToSQL이 거의 같다. 
차이가 있다면 DataContext로 연결된 데이터 모델이 ObjectContext로 변경되었고, Generate되던 코드들의 차이점정도 이외에는 큰 차이가 나타나지 않는다. 

큰 차이가 하나 있다. 기본적으로 LINQToSQL은 DataContext에서 Table에 Insert, Delete가 가능하지만, ADO .NET Entity Model에서는 ObjectContext에서 AddTo{Table}, DeleteObject method를 이용해서 Insert, Delete를 한다. 좀 더 접근성을 높인 명명법을 만든 것인지 모르겠지만.... 기존것이 더 직관적이긴 했는데.;

MS에서 발표하기로는 속도면에서는 LINQToSQL이 훨씬 낫다고 하는데..
이건 기본적으로 ADO .NET에서 SqlConnection, SqlCommand 자체가 MS Sql에서 훨씬 빨랐던 그 차이를 그대로 가지고 온 것에 불과하고.... 

그럼 나머지는 모두 DbConnection, DbCommand가 내부적으로 구현되어서 사용되고 있는 것인가??? ;;
한번 뒤져볼 내용일 것 같다. 
Posted by Y2K
,
회사에서 난생처음 linux에서의 web 작업을 하는 도중에 php를 사용하면 더 편할 것 같은 예감이 들어서, php로 뚝딱뚝딱. 

linux의 언어설정은 unicode로 되어있고, php의 언어설정은 되어있지 않아서, 한글이 깨지는 문제가 계속해서 발생해서 조금 고생한 듯. 기종간 최고의 문제는 역시 언어설정인것을 다시 한번 느끼게 되었다. 

#메일 보내기
<?
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}

function customer_sendmail($email_str, $userName, $subject, $message)
{
    mb_internal_encoding('EUC-KR'); 

    $from_name = $userName;
    $from_name = encode_2047(iconv("UTF-8","EUC-KR",$from_name));

    $subject = iconv("UTF-8","EUC-KR",$subject);
    $message = iconv("UTF-8","EUC-KR",$message);

    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'X-Mailer: PHP' . "\r\n";
    $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
    $headers .= 'From: '.$from_name.' < test@smtp.co.kr >'. "\r\n";

    // 메일 보내기
    $result = mb_send_mail($email_str, $subject, $message, $headers) ;
    return $result; 
}

// 멋진 코드. Post로 보내진 모든 데이터를 $Name 형태로 모두 만들어준다. 
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

$to = "to@smpt.co.kr";
$subject = "[코로케이션] 시스템 무료 점검 신청_" . $companyName;

$body="
====================================
* 회사 이름 : $companyName
* 사용자 이름 : $userName
* 연락처 : $phoneNumber1-$phoneNumber2-$phoneNumber3
* 운영체제(os) 버젼 : $osVersion
* DB 버젼 : $dbVersion
* 서버 용도 : $useService
* 기타 점검 요청 사항 : $etc   
=====================================
";
customer_sendmail($to, $userName, $subject,$body);
?>


#메일 & 첨부파일 보내기
<?php
function encode_2047($subject) {
    return '=?euc-kr?b?'.base64_encode($subject).'?=';
}
foreach($_POST as $key=>$value)
{
       $$key=$value;
}

if($_SERVER['REQUEST_METHOD']=="POST"){
mb_internal_encoding('EUC-KR'); 
  $to = "to@smtp.co.kr";
  $subject=encode_2047(iconv("UTF-8","EUC-KR","[코로케이션]시스템 무료 점검 사전정보_".$companyName));
$from = iconv("UTF-8","EUC-KR",$companyName);
  $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
  // 파일 이름 얻어오기. 넘기는 페이지의 input="file"의 name 속성으로 넘엉
  $tmp_name = $_FILES['filename']['tmp_name'];
  $type = $_FILES['filename']['type'];
  $name = $_FILES['filename']['name'];
  $size = $_FILES['filename']['size'];

  $headers = 'MIME-Version: 1.0' . "\r\n";
  $headers .= 'X-Mailer: PHP' . "\r\n";
  $headers .=  "Content-Type: text/html; charset='ks_c_5601-1987'\r\n";
  $headers .= 'From: '.$from."<test@smtp.co.kr>\r\n";
$engineer = "아니오";
if($rdEngineer == "true") {
$engineer = "예";
}
$protect = "아니오";
if($rdProtect == "true") {
$protect = "예";
}
$duplication = "아니오";
if($rdDuplication == "true") {
$duplication = "예";
}
$backup = "아니오";
if($rdBackup == "true") {
$backup = "예";
}
$message = "";
if($rdEngineer == "true") {
 $message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
else {
$message = "
  ==================================== <br/>
* 회사 이름 : $companyName<br/>
* 서비스 유형 : $serviceType<br/>
* 구매 날짜 : $buyDate<br/>
* 전문 엔지니어 관리 : $engineer<br/>
- 서버 관리 : $noEngineer<br/>
* 보안 설정 : $protect<br/>
* 이중화 구성 : $duplication<br/>
* 백업 구성 : $backup<br/>
* 기타 문의 사항 : $etc<br/>
====================================
";
}
$message = iconv("UTF-8","EUC-KR",$message);
if (file_exists($tmp_name)){
if(is_uploaded_file($tmp_name)){
$file = fopen($tmp_name,'rb');
$data = fread($file,filesize($tmp_name));
fclose($file);
$data = chunk_split(base64_encode($data));
    }
$headers = "From: $from\r\n" .
         "MIME-Version: 1.0\r\n" .
         "Content-Type: multipart/mixed;\r\n" .
         " boundary=\"{$mime_boundary}\"";
$message = "This is a multi-part message in MIME format.\n\n" .
         "--{$mime_boundary}\n" .
         "Content-Type: text/html; charset='ks_c_5601-1987'\n\n" .
         $message . "\n\n";
$message .= "--{$mime_boundary}\n" .
         "Content-Type: {$type};\n" .
         " name=\"{$name}\"\n" .
         //"Content-Disposition: attachment;\n" .
         //" filename=\"{$fileatt_name}\"\n" .
         "Content-Transfer-Encoding: base64\n\n" .
         $data . "\n\n" .
         "--{$mime_boundary}--\n";
}
mail($to, $subject, $message, $headers);
}
?>

php를 사용하건, ruby를 사용하건, 어떤 언어를 사용하더라도...
가장 중요한 것은 일단 해보자라는 용기?? ^^


Posted by Y2K
,
식별자 (PK, FK)
: database에서의 index.

대표헝 여부에 따른 분류 : 주식별자, 보조 식별자
생성 여부 : 내부 식별자, 외부 식별자
단일 속성 여부 : 단일 식별자, 복합 식별자
대체 여부 : 원조 식별자, 대리 식별자

주식별자 / 보조 식별자
: Entity type을 유일하게 식별할 수 있게 하는 특징을 가짐.
: 해당 업무에 적합한 식별자를 주 식별자로 이용한다. (카드사에서 카드번호와 주민번호 중에서 카드 번호를 주 식별자로 이용하는 경우)

내부 식별자 / 외부 식별자
: 내부 식별자 : 자신의 entity type에서 스스로 생성되서 존재하는 식별자
: 외부 식별자 : 다른 entitiy type에서 관계에 의해 주식별자 속성을 상속받아서 사용되는 경우(FK)

단일 식별자 / 복합 식별자
단일 식별자 : 주식별자의 속성이 한가지 속성으로 구성된 경우
복합 식별자 : 주식별자의 속성이 두가지 이상의 속성으로 구성된 경우

원조 식별자 / 대리 식별자 
대리 식별자 : 여러개의 속성을 묶어서 하나의 속성을 만들어 주식별자로 사용하는 경우


관계(Relationship)
: 행위에 의한 관계, 존재에 의한 관계로 분류 가능
존재에 의한 관계 : 기본 entity type 사이의 관계를 의미
행위에 의한 관계 : event의 발생에 따라 생성되는 성격을 가지고 있다. 

정규화
특징
1. 정규화는 적절한 Entity type에 각각의 속성을 배치하고 Entity type을 충분히 도출해가는 단계적인 분석 방법이다.
2. 정규화 기술은 Entity type에 속성들이 상호 종속적인 관계를 갖는 것을 배경으로 종속관계를 이용하여 Entity type을 정제하는 방법이다.
3. 각각의 속성들이 데이터 모델에 포함될 수 있는 정규화의 원리를 이용하여 데이터를 분석하는 방법에서 활용될 수 있다. 
4. 정규화는 현재 데이터를 검증할 수 있고, 데이터의 표현관점에서 Entity type을 정의하는 데 이용할 수 있다. 
5. 정규화는 Entity type을 object 별로 분석하는 법이 아닌 개별 데이터를 이용한 수학적 접근 방법을 이용해 분석 한다. 

: 일반적으로 Object 분석 방법에 의해서 도출하게 된다. 그러나, Object 분석 방법에 의한 도출 역시 제 3 정규화 규칙이 모델링 작업의 기초에 관여하고 있다. 
: 정규화 규칙을 이용한 검증이 가능하다. 

정규화 단계
1차 정규화
: 복수의 속성값을 분리
: 복수의 속성값이 없는 경우에는 1차 정규화 대상이 아니다.

2차 정규화
: 주 식별자에 종속적이지 않은 속성의 분리
: 부분 종속적 속성의 분리
: 자신의 Table에 주식별자를 구성하는 속성이 복합 식별자인 경우에만 해당된다. 

3차 정규화
: 속성에 종속적인 속성의 분리
: 이전 속성(Transitive Dependency)의 분리
: 주식별자가 아닌 속성중에서 식별자가 되는 경우에 그 식별자와 그에 종속된 속성을 분리한다.

보이스-코드 정규화
다수의 주 식별자 분리
: 1, 2, 3차 정규화가 모두 마쳐진 후에 가능
: 주 식별자가 다수가 되는 경우에는 삭제, 업데이트, 입력시에 에러가 발생할 수 있기 때문에 최대한 없애는 것이 좋다.

4차 정규화
: Multi-Valued Dependency 속성 분리

5차 정규화
: 결합 종속인 경우는 두개 이상의 N으로 분리





Posted by Y2K
,

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

굽시니스트(http://homa.egloos.com)님의 글.
새로운 아이콘의 탄생. 새로운 표상의 확립. 
드디어 박정희에 대적할 민주개혁 진영의 새로운 영웅의 확립..

뜻을 이루셨습니다. 구시대의 막내가 아닌 새시대의 맏형이 되어버리셨군요..


Posted by Y2K
,