'만화·애니'에 해당되는 글 4건

  1. 2009.03.25 일일빌드 시스템 의 장점
  2. 2009.03.17 LVS 설치 및 사용기
  3. 2009.03.16 Inhertiance와 composition
  4. 2008.09.27 CPAN 이용하기

일일빌드 시스템을 만들고 나서, 어느 정도 시간을 지내고 나서, 이 시스템의 장점이 무엇인가 생각해보았다. 200여개나 되는 프로젝트를 관리를 기준으로 생각한 것이다.

 

장점

 

1. 소스의 검증

2. 소스의 검색 용이

   공통 모듈을 쓸 때, 이게 어디서 쓰는지, 참조하기가 어렵거나 잘못된 자바 스크립트나 자바 소스를 찾아낼 수 있다는 점이 아주 훌륭하다. 소스 검색은 역시 acl!!

3. 한번에 소스 commit이 용이

  200여개나 되는 프로젝트에서 특정 패턴에 맞는 DB 설정에 대해서 수정을 하려고 할 때, 담당자들에게 일일히 연락하지 않고, 직접 수정이 가능하다.

4. 소스 복잡도 측정 가능

 

단점

1. 서버의 사용률이 좀 적다.

서버를 여기저기 함께 사용해야 하나 싶다.

 

 

사실 허드슨과 같이 좋은 툴들이 있어서 과연 일일빌드 시스템이 의미가 있겠냐마는..

사실은 내가 원하는 형태로 구현가능하고, 일일빌드 시스템의 의미에 대해서 생각해 볼 필요는 있는 것 같다.

 

 

 

Posted by 김용환 '김용환'

LVS 라는 게 있는데. L4의 대체 소프트웨어라고 하면 되겠다. 다양한 알고리즘도 쓸 수 있다.

사실 ,L4대신 LVS를 쓰고 싶은데..

 

다음에서 현재 사용중이고, 돈이 안되는 것들은 이녀석으로 쓰면 돈도 아껴쓸 수 있다. 생각해보면 L4를 사용하는 것은 정치적인 이슈일지도 모르겠다.

 

LVS 설치 좋은 예)

https://www.sulinux.net/bbs/board.php?bo_table=success_2&wr_id=49&page=2

http://jikime.tistory.com/290

 

L4가 LVS보다 좋은 이유는 상용 솔루션이고, 이에 맞는 소프트웨어가 쉽게 제공되고, 로깅기능이 좋다. 한 장비에서 여러 서비스를 관리할 수 있다는 점. 반면 비싸다.

하지만, LVS는 L4보다는 로깅이 쉽지 않지만, 시스템 관리자의 입장에서 보면 귀찮은 작업이 많지만, 가격이 싸다.

 

 

회사에서 사용하는 L4 설정은 아주 간단하다.

앞단에 L4 switch를 두고 웹 서버에 대해서 L7 헬쓰 체킹을 하도록 설정하고,

NAT가 아닌 directrouting 방법을 사용하고, loop back을 L4 ip로 설정한다.

그 이유는 부하를 줄이기 위해서이다.

 ifconfig lo:0 <l4ip> up

 

 

 

특히 수세리눅스의 나진이 아빠 글은 너무 좋은 글이라서 강추한다.

출처 : https://www.sulinux.net/bbs/board.php?bo_table=success_2&wr_id=49&page=2

 

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 nazin


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 방식

  • IP Tunnling

A.Direct Routing 방식

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

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

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

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

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

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


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



A-1.Load Balancer Server 설정법

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

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:1 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.confnet.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 lo:0 210.224.223.10 up

가상아이피 등록


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

/etc/sysctl.confnet.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 lo: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.confnet.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:1 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.confnet.ipv4.ip_forward = 0 부분을 1로 변경후

shell>sysctl -p

커널파라미터 적용


shell>ifconfig eth0:1 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) 설정법

/etc/sysctl.confnet.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

커널파라미터 적용


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 서버로 접속하게 된다.


4. 참고 문헌 & 사이트 정보


http://www.linuxvirtualserver.org

http://linux-ha.org/

http://eelco.maljaars.net/ultramonkey-rhel4.html

 

Posted by 김용환 '김용환'

개발을 하다 보면, 늘 이렇게 짤까 저렇게 짤까 고민을 하기도 한다.

특히 Inheritance로 개발할지 composition으로 개발할지 고민은 여전히 지금까지도 있다.

 

Spring IOC을 쓰는 사람은 자연스럽게 interface 1개, 구현체 1개 이렇게 만들어서 bo와 dao를 쓰고 있는 현실을 보게 된다. 볼 때 마다. 나는 좀 갑갑스럽기 하다.

 

interface나 abtract class는 기본적으로 상속이기 때문에

super를 수정할려면 좀 귀찮다. (managability가 많이 떨어진다.) 재 사용성을 위해서 쓴다는 장점과 함께~

보통 이 정도 수정되면, 크게 바뀌는 개념이라 할 수 있겠다.

 

반면 Composition을 쓰면, 쓰기가 참 편한데. 재사용성이 떨어진다는 점. (polymophism은 기본적으로 reusability를 위해서 만들어짐 개념이다.) 이 가장 떨떨하다.

또한 더 많은 인스턴스를 양산할 수 있는 소지가 발생한다.

 

항상 이런 고민인데. Effective java의 authour인 Joshua는 이렇게 써놨다.

 

 

Inheritance is a powerful way to achieve code reuse, but it is not always the best tool for the job. Used inappropriately, it leads to fragile software. It is safe to use inheritance within a package, where the subclass and the superclass implementation are under the control of the same programmers. It is also safe to use inheritance when extending classes specifically designed and documented for extension (Item 15). Inheriting from ordinary concrete classes across package boundaries, however, is dangerous. As a reminder, this book uses the word
“inheritance” to mean implementation inheritance (when one class extends another).

The problems discussed in this item do not apply to interface inheritance (when a class implements an interface or where one interface extends another).

 

 

패키지 내에서 상속관계, 세부적인 디자인이나 확장을 위해서 상속을 쓰는 것이 안전하다고 했다.

최대한 상속의 개념은 제한적으로 쓰는 것이 좋다는 것이 그의 주장이다.

 

아티마의 글을 볼까나?

http://www.artima.com/designtechniques/compoinhP.html

http://www.artima.com/designtechniques/interfaces.html

 

어쩌면, 정확히 이럴 때는 이렇게 쓰는 것이야 라는 고민보다는 수많은 시행착오를 통해서 겪는 것들은 정말 우리에게 도전을 주는 거 같다. 시도해보고 자신만의 노하우를 습득하고 타인의 스킬들에 대해서 인정해보면서 생각해보는 것 외에는 특별한 방법이 없긴 하다.

 

 

Posted by 김용환 '김용환'

CPAN 이용하기

perl 2008.09.27 03:28

1. cpan 싸이트에서 검색해서 다운로드

 

 

2. 리눅스에서 다음의 명령어 사용

perl -MCPAN -e 'shell'

 

쉘에서 다음과 같이 사용
install DBD::mysql


 

Posted by 김용환 '김용환'