= ipvsadm/QuickStart = [[TableOfContents]] == Notice == * 작성 자 : 김석원 ''' {segenny (at) gmail.com} ''' * 작성 시작 : 2008-05-20 * 마감 예정일 : 2008-05-29 ※ ipvsadm 을 이용하는 로드 밸런싱은 이미 google에서도 많이 찾아 볼 수 있다. 이 글을 쓴 이유는 * doc문서 관리 보단 이게 편하다. * 초보로서 google에서 찾아본 자료로는 이해 안되는 부분을 정리함(언제!) == 구현 환경 == 1. 서버 * vmware * redhat enterprise 4 (update5) Linux Kernel 2.6.9 2. vmware 을 이용한 리눅스 설치 * vmware을 이용하여 RHEL-4.5을 두번 설치한다.(한번 설치 후 복사하여 사용해도 뭐...) 3. 서버 환경 * 아래 192.168.0.50 아래의 IP주소는 두개의 노드가 동일하게 같는 아이피 주소이다. 세팅이 진행 되면서 확인하고 아래의 그림은 참조만 한다. {{{ =============================================================== | | | +-------------------------------+------------------- Client | 192.168.0.50:eth0:1 dummy0:192.168.0.50 | ======== | 192.168.0.10:eth0 eth0:192.168.0.11 |/---- | | | /-------------\ / ======== | ==================== ==================== /| | | | Linux Box Master | | Linux Box Slave | / | | | | Direct Routing | | | / | | | | | | |/ | | | | RealServer 1 | | RealServer 2 | | | | ==================== ==================== | | | +---------------------------------------------------------+ | hosts: cnode1 hosts: cnode2 | | | =============================================================== }}} == Master Node == === Whatis ipvsadm === 1. 2개 이상의 노르를 가진 클러스터링 시스템에서 커널내부의 IPVS테이블을 설정하고 유지하는 유틸리티 2. IPVS테이블은 커널이 로드밸런서(Director)로 들어오는 패킷을 각각의 리얼서버 노드로 전달하기 위해 참조 3. 2개의 프로토콜 지원 - TCP 와 UDP 4. 3가지 방식의 패킷 포워딩 방식 지원 - NAT, tunneling, direct routing 5. 4가지 스케둘링 알고리즘 지원 * '''round robin''' * 순차적 방식을 이용해 네트워크 연결을 서로 다른 서버에 연결 * 실제 서버의 연결 개수나 반응시간 등은 고려를 하지 않음 * '''weighted round robin''' * 가중치기반 라운드 로빈 스케줄링 * 서버에 서로 다른 처리 용량(가중치)을 지정 가능. 기본 가중치는 1이다. * 예) 서버가 A,B,C 이고 각각의 가중치가 4,3,2 일 경우 스케줄링 순서는 ABCABCABA * 라운드 로빈 스케줄링은 가중치 기반 라운드 로빈 스케줄링의 특별한 한 종류이며 모든 가중치가 도일한 경우 * 장단점 * 실제 서버의 네트워크 접속 수를 계산할 필요가 없음 * 스케줄링의 과부하가 적어 더 많은 실제 서버를 운영 가능 * 요청에 대한 부하가 매우 많을 경우 실제 서버사이에 동적인 부하 불균형 상태 발생 가능 * '''least-connection''' * 최소 접속 스케줄링 * 가장 접속이 적은 서버로 요청을 직접 연결 하는 방식 * 각 서버에서 동적으로 실제 접속한 숫자를 세어야 하므로 동적인 스케줄링 알고리즘 중의 하나이다. * 접속 부하가 매우 큰 경우에도 아주 효과적 * 가장 빠른 서버에서 더 많은 네트워크 접속을 처리할 수 있음 * 실제로는 TCP의 TIME_WAIT 상태때문에 아주 좋은 성능을 낼 수는 없음 * 다양한 처리용량을 지난 서버로 구성되었을 경우 부하분산이 효율적으로 되지 못할 수 있음 * '''weighted least-connection''' * 가중치 기반 최소 접속 스케줄링 * 최소 접속 스케줄링 한 부분으로서 각각의 실제 서버에 성능 가중치를 가능 * 가중치가 높은 서버에서 더 많은 요청을 받을 수 있음 * 가중치의 비율인 실제 접속자수에 따라 네트워크 접속이 할당된다. 기본 가중치는 1 * 서버들이 같은 처리 용량을 가졌을 때는 최소 접속 스케줄링과 동일 ※발췌 : http://it.dsu.ac.kr/pdf/ha_webservice.pdf [[BR]] ※참고 : http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.ipvsadm.html === Install ipvsadm === 1. RPM 설치 * 여기서 필자는 ipvsadm-1.24-6.i386.rpm 아주 쉽게 인스톨 하였다. 물론 소스로 빌도 하여도 상관 없다. 소스 빌드 시 "make rpm"으로 하여 다음 번 사용시 유용하게 설치 하여도 상관없다. {{{ 작업 서버 [Master] =================================================================================== [root@cnode1 ~]# rpm -Uvh ipvsadm-1.24-6.i386.rpm warning: ipvsadm-1.24-6.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821 Preparing... ########################################### [100%] 1:ipvsadm ########################################### [100%] [root@cnode1 ~]# [root@cnode1 ~]# ipvsadm -version ipvsadm v1.24 2003/06/07 (compiled with popt and IPVS v1.2.0) // 설치를 확인 한다. [root@cnode1 ~]# _ }}} === Conguration - ipvsadm === * ipvs테이블에 Real Server(클라이언트에 데이터를 공급할 서버)를 지정한다. * 아래와 같은 설정으로는 Master & Slave node를 Real Server 로 등록한 상태이다. * 참고로 두개의 리얼서버 가중치를 1을 줬을 경우 lc의 알고리즘과 같다. {{{ 작업 서버 [Master] =================================================================================== [root@cnode1 ~]# ipvsadm -A -t 192.168.0.50:80 -s wlc [root@cnode1 ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.11:80 -g -w 1 [root@cnode1 ~]# ipvsadm -a -t 192.168.0.50:80 -r 192.168.0.10:80 -g -w 1 [root@cnode1 ~]# /etc/init.d/ipvsadm save [root@cnode1 ~]# _ }}} === Conguration - ip_forward === * 패킷 포워드를 위해 다음과 같이 세팅을 한다. {{{ 작업 서버 [Master] =================================================================================== [root@cnode1 ~]# vi /etc/sysctl.conf net.ipv4.ip_forward = 1 // 0 에서 1로 수정 [root@cnode1 ~]# sysctl -p net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 [root@cnode1 ~]#_ }}} == Slave Node == === Whatis arptables_jf === 1. 준비중 .... === Install arptables_jf === 1. RPM 설치 * 여기서 필자는 arptables_jf-0.0.8-2.i386.rpm 아주 쉽게 인스톨 하였다. * ifconfig에 NOARP 옵션이 있다. (ex: ''' ifconfig -a {dev} -arp ''' ) {{{ 작업 서버 [Slave] =================================================================================== [root@cnode2 ~]# rpm -Uvh arptables_jf-0.0.8-2.i386.rpm warning: arptables_jf-0.0.8-2.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e Preparing... ########################################### [100%] 1:arptables_jf-0.0.8-2 ########################################### [100%] [root@cnode2 ~]# [root@cnode2 ~]# arptables -V arptables v0.0.8 // 설치를 확인 한다. [root@cnode2 ~]# _ }}} === Configuration - arptables === 1. 192.168.0.50 를 요청하는 나른 노드의 "Arp Request" 패킷은 모두 무시한다. * 이러므로서, 같은 네트워크(콜리전 도메인)안에서 두개 이상의 아이피를 가질 수 있다. {{{ 작업 서버 [Slave] =================================================================================== [root@cnode2 ~]# arptables -A IN -j DROP -d 192.168.0.50 [root@cnode2 ~]# /etc/init.d/arptables_jf save Saving current rules to /etc/sysconfig/arptables: [ OK ] [root@cnode2 ~]# _ }}} === Configuration - Set virtual IP === * Dummy0 net/dev 만들고 확인 한다. {{{ 작업 서버 [Slave] =================================================================================== [root@cnode2 ~]# ifconfig dummy0 192.168.0.50 netmask 255.255.255.255 broadcast 192.168.0.50 up [root@cnode2 ~]# ifconfig dummy0 Link encap:Ethernet HWaddr 00:01:02:03:04:03 inet addr:192.168.0.50 Bcast:192.168.0.120 Mask:255.255.255.255 UP BROADCAST RUNNING NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:210 (210.0 b) eth0 Link encap:Ethernet HWaddr 00:01:02:03:04:02 inet addr:192.168.0.11 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:54613114 errors:0 dropped:0 overruns:0 frame:0 TX packets:154669808 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4190538150 (3.9 GiB) TX bytes:524576645 (500.2 MiB) Interrupt:11 Base address:0xc000 [root@cnode2 ~]# }}} == Test == 1. 준비 * Master & Slave 각 node 80포트로 서비스할 웹 서버를 설치 한다. * 각 서버의 동일한 index.html파일을 만들고 파일 내용은 hostname 을 적어 준비한다. 2. 접속 * http://192.168.0.50/index.html 접속 3. 확인 * Refresh를 통해 index.html 파일을 보고 로드 밸런싱이 되는지 확인 한다. 4. 참조 * (정확히 말하면 리눅스 다이렉트 라우팅에 의한 로드 밸런싱이지, 클라이언트 대상으로 한 로드 밸런싱은 아니다. 다만 로드 밸런싱 하는 비슷한 효과를 낼뿐.....)