'round-robin'에 해당되는 글 3건

  1. 2009.11.27 ipvsadm을 이용한 LVS 시스템 구축
  2. 2009.09.06 Linux Native Multipathing (Device Mapper-Multipath)
  3. 2009.05.07 Equal-Cost / Weighted Round-Robin Multi-Path (ECMP/WRRMP) Routing
2009.11.27 22:29

ipvsadm을 이용한 LVS 시스템 구축

Linux Virtual Server 란?

1대의 서버로 증가하는 사용자들을 처리하기 힘들때 2대이상의 서버를 구축하여 로드  하는 운영 시스템이다.

 

일반적으로 DNS의 라운드 로빈  로드 밸런싱 하는 방법이 있으나, LVS 시스템은 라운드 로빈 방식  아니라 총 4가지 방법으로 로드 밸런싱을 할수 있어 사용자의 상황에  대처할수 있다.

 

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

로드 밸런서로 들어오는 요청들을 차례대로 순차적으로 각각의 서버로 할당하는 

DNS 로도 쉽게 구현이 가능한 방식이다.

 

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

동작 자체는 라운드 로빈 방식이지만, 로드 밸런싱을 할 서버들이 각각  사양일 경우 서로 다른 가충치를 설정하여 요청들을 할당하는 방식이다.

 

3. 최소 연결(least connection)

 서버들중에서 가장 적은 수의 요청을 처리하고 있는 서버를 선택하여 요청을  할당하는 방식이다. 이 방식의 장점은 서버들의 현재 부하 상태를 동적으로  요청을 처리할수 있다.

 

4. 가중  연결 (weighted least connection)

 연결 방식을 따르지만, 가중 라운드 로빈 방식과 마찮가지로 각 서버에  다른 가중치를 설정하여 요청들을 할당할수 있다.

 

 시스템에서 NAT, DR(Direct routing) IP터널링 으로 구성이 가능하지만 여기서는 DR방식으로 

 

DR(Direct rounting) 기본 구성도는 아래 링크를 참고  바랍니다.

http://wiki.kldp.org/Translations/html/Virtual_Server-KLDP/VS-DRouting.gif

 

 

이제  시스템을 구축해보자

 

모든 설명은 레드햇 기반인 CentOS  버전을 기준으로 설명한다.

웹서버 2대에 대해서 1대의 LVS 가  밸런싱을 하는 방식에 대해서 설명한다.

 

Virtual IP  192.168.10.10

Real IP(Web1) = 192.168.10.20

Real IP(Web2) = 

 

LVS 서버에 yum명령을 사용하여 ipvsadm 을 설치한후 

 

#yum -y install ipvsadm

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

#

 

이렇게 나오면 제대로 설치가 된것이다.

 

이제 LVS 서버에 사용할 Virtual IP를 설정해보자.

 

# ifconfig eth0:1 192.168.10.10 netmask 255.255.255.0 up

 

ifconfig 를 사용한 네트워크 설정은 서버가 재부팅이 되면 사라지기때문에,

 파일을 생성해주자.

 

또한 해당 시스템을 통해 다른  패킷이 포워딩 될수 있도록 수정하자.

 

#vi 

net.ipv4.ip_forward=1

 

#sysctl 

 

이제 설치한 ipvsadm 에 새로운 서비스를 

 

#ipvsadm -A -t 192.168.10.10:80 -s rr

192.168.10.10 IP의 tcp 80번포트를 라운드 로빈(rr) 방식으로 새로운 서비스로 

자세한 명령어 옵션은 ipvsadm --help 로 확인해보자

참고로  언급된 4가지 스케쥴링 방법을 모두 적용가능하다

예) ipvsadm  -t 192.168.10.10:80 -s wlc (가중 최소 연결)

 

 추가가 끝났으면, 로드 밸런싱을 할 대상 서버들의 Real IP를 추가해준다.

 

#ipvsadm -a -t 192.168.10.10:80 -r 192.168.10.20:80 -g

#ipvsadm -a -t 192.168.10.10:80 -r 192.168.10.30:80 -g

#ipvsadm -L

IP Virtual Server version  (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.10:http rr
   ->           Route   1      0         0
   -> 192.168.10.30:http         Route   1      0          

 

LVS서버의 설정은 끝났다. 하지만 이 정보는  재부팅이 되면 날아간다.

재부팅후에 정보가 남아 있도록 약간의 작업을  진행해주자.

 

#/etc/rc.d/init.d/ipvsadm save

 ipvsadm on

참고) ipvsadm save 명령을 내리면 /etc/sysconfig/ipvsadm  설정 값이 저장된다.

 

이제 LVS 서버의 설정은  끝이 났다.

 

이제 서비스 되어질 웹서버 2대에  설정한다.

설정방법은 2대다 동일하기 때문에 1대만 설명하겠다.

 

먼저 웹서버에서도 가상 디바이스를 설정하여 Virtual IP를 추가해야한다.

 위에 설명되어 있다. 참고바란다.

 

여기서 의문점이 생긴다.  가상 디바이스를 추가하여 Virtual IP를 할당해주어야 하는데.

여기서 ARP  발생할수 있다. 그렇다면 ARP는 무엇인가.

 

ARP란?

IP주소를 해당 MAC주소로 바꿔주는 프로토콜을 말한다. 네트워크장비는 기본적으로  통신을 하기때문에 IP주소를 MAC주소로 변환을 해줘야 통신이 가능해진다.

클라인트가 가상 IP를 요청했을 때 동일 네트워크에 Virtual  2개 이상 갖고 있기 때문에 경우에 따라서 Real Server에서 응답을  경우가 있다고 한다. 이렇게 되면 로드밸런싱이 되지 않기 때문이다.
arptables_jf를 이용해서 응답하지 않도록 해줘야 한다.

#yum -y arptables_jf

#arptables -i  -A IN -d 192.168.10.10 -j DROP
#arptables -i eth0 -A  -d 192.168.10.10 -j mangle --mangle-ip-s 192.168.10.20
#/etc/rc.d/init.d/arptables_jf save
#chkconfig arptables_if 

 

arptables_jf save 명령 사용시에도  /etc/sysconfig/arptables 파일에 값이 기록되어 저장된다.

 

 을 이용하여 LVS 시스템을 Direct Routing 구성으로 구축해보았다.

ps) 단순히 rr(라운드 로빈) 방식만을 취한다면 차라리 DNS  로빈 설정이 훨신 수월하고 편리하다는 느낌이다. 하지만 위에 언급된 4가지  운영 상황에 맞게 설정할수 있어 충분히 장점이 될것 같고, L4 등도 고가라 도입하기가 쉽지 않을떄 한번 고려해볼만한 LVS 시스템이라 생각된다.


출처 : 리눅스포탈


Trackback 0 Comment 0
2009.09.06 04:00

Linux Native Multipathing (Device Mapper-Multipath)




Over the past couple of years a flurry of OS Native multipathing solutions have become available. As a result we are seeing a trend towards these solutions and away from vendor specific multipathing software.

The latest OS Native multipathing solution is Device Mappper-Multipath (DM-Multipath) available with Red Hat Enterprise Linux 4.0 U2 and SuSE SLES 9.0 PS2.

I had the opportunity to configure it in my lab a couple of days ago and I was pleasantly surprised as to how easy was to configure it. Before I show how it's done, let me talk a little about how it works.

The multipathing layer sits above the protocols (FCP or iSCSI), and determines whether or not the devices discovered on the target, represent separate devices or whether they are just separate paths to the same device. In this case, Device Mapper (DM) is the multipathing layer for Linux.

To determine which SCSI devices/paths correspond to the same LUN, the DM initiates a SCSI Inquiry. The inquiry response, among other things, carries the LUN serial number. Regardless of the number paths a LUN is associated with, the serial number for the LUN will always be the same. This is how multipathing SW determines which and how many paths are associated with each LUN.

Before you get started you want to make a sure the following things are loaded:

  • device-mapper-1.01-1.6 RPM is loaded
  • multipath-tools-0.4.5-0.11
  • Netapp FCP Linux Host Utilities 3.0

Make a copy of the /etc/multipath.conf file. Edit the original file and make sure you only have the following entries uncommented out. If you don't have Netapp the section then add it.


defaults {
user_friendly_names yes
}
#
devnode_blacklist {
devnode "sd[a-b]$"
devnode "^(ramrawloopfdmddm-srscdst)[0-9]*"
devnode "^hd[a-z]"
devnode "^cciss!c[0-9]d[0-9]*"
}


devices {
device {
vendor "NETAPP "
product "LUN"
path_grouping_policy group_by_prio
getuid_callout "/sbin/scsi_id -g -u -s /block/%n"
prio_callout"/opt/netapp/santools/mpath_prio_ontap /dev/n"
features "1 queue_if_no_path"
path_checker readsector0
failback immediate
}
}

The devnode_blacklist includes devices for which you do not want multipathing enabled. So if you have a couple of local SCSI drives (i.e sda and sdb) the first entry in the blacklist will exclude them. Same for IDE drives (hd).


Add the multipath service to the boot sequence by entering the following:

chkconfig --add multipathd
chkconfig multipathd on


Multipathing on Linux is Active/Active with a Round-Robin algorithm.

The path_grouping_policy is group_by_prio. It assigns paths into Path Groups based on path priority values. Each path is given a priority (high value = high priority) based on a callout program written by Netapp Engineering (part of the FCP Linux Host Utilities 3.0).

The priority values for each path in a Path Group are summed and you obtain a group priority value. The paths belonging to the Path Group with the higher priority value are used for I/O.

If a path fails, the value of the failed path is subtracted from the Path Group priority value. If the Path Group priority value is still higher than the values of the other Path Groups, I/O will continue within that Path Group. If not, I/O will switch to the Path Group with highest priority.

Create and map some LUNs to the host. If you are using the latest Qlogic or Emulex drivers, then run the respective utilities they provide to discover the LUN:
  • qla2xxx_lun_rescan all (QLogic)
  • lun_scan_all (Emulex)

To view a list of multipathed devices:

# multipath -d -l 

[root@rhel-a ~]# multipath -l

360a9800043346461436f373279574b53
[size=5 GB][features="1 queue_if_no_path"][hwhandler="0"]
\_ round-robin 0 [active] \
\_ 2:0:0:0 sdc 8:32 [active] 
\_ 3:0:0:0 sde 8:64 [active]
\_ round-robin 0 [enabled] 
\_ 2:0:1:0 sdd 8:48 [active] 
\_ 3:0:1:0 sdf 8:80 [active]

The above shows 1 LUN with 4 paths. Done. It's that easy to set up.

출처 : storagefoo.blogspot.com

Using Device-Mapper Multipath
http://www.centos.org/docs/5/html/5.2/DM_Multipath/


Trackback 0 Comment 0
2009.05.07 20:18

Equal-Cost / Weighted Round-Robin Multi-Path (ECMP/WRRMP) Routing

ecmp는 equal-cost multipath 라고 하는 것으로 dynamic routing protocol에서는 목적지에 대한 경로가 여러개 이더라도 가장 metric 이 낮은 경로를best path로 설정 합니다. 이렇게 했을 경우에는 여러경로가 같은 metric을 가졌다 하더라도 하나의 경로만을 사용하게 됩니다.
이 때 같은 metric의 경로가 여러개 있을 때 이 경로를 모두 사용하도록 하는 방법입니다.
일반적으로 per-destination을 기본으로 load balancing이 되는데 packet별로도 할수 있습니다.

하여간 가장 적절한 경로를 선정할 때 사용되는 metric의 값이 서로 같은 여러 경로에 대하여 그 경로를 모두 사용하도록 하는 방법이 ecmp 입니다. 라우팅 프로토콜마다 사용하는 metric이 다르고 지원하는 multi path의 수도 조금씩 다릅니다.

ECMP/WRRMP는 kernel_menuconfig의 networking 옵션에서 advanced router를 선택하면 활성화된다. 이 옵션을 통해 라우터는 default 루트를 한개 이상 지정할 수 있게 되고, 패킷 헤더의 ip address들을 hash한 결과를 이용해 여러개의 루트 중 한개로 라우팅을 하게 된다. 이 때, hash의 결과값들은 디폴트로 각 루트에 동일하게 (equal-cost) 할당하며, weight 파라미터를 이용하면 특정 루트에 더 많은 weight를 줄 수 있다. 또한 mpath 파라미터로 next hop를 결정하는 특정한 방법을 선택할 수도 있다.

패킷이 라우터에 도착하면 라우터는 먼저 라우팅캐쉬에 패킷의 도착IP주소와 관련된 라우팅정보가 들어있는지 확인한다. 만일 캐쉬에 이 정보가 들어있으면 그 라우팅정보에 따라 패킷을 포워딩한다. 만일 캐쉬에 들어있지 않으면 라우팅테이블의 default 라우팅정보를 참조하게 되는데, 이때 multipath로 설정이 되어 있다면 next hop을 결정하는 알고리즘에 따라 루트를 결정한다. 가장 기본적인 round-robin 알고리듬은 다음과 같다.

(1) 초기화: 각 루트(route_1,route_2,...,route_n)에 할당된 weight값들(W1,W2,...,Wn)과 이 값들의 총합(Wt=SUM(Wk))을 계산한 후, 이를 power라는 변수(P1,...Pn,Pt)에 각각 저장한다. 그리고, 각 루트는 [0,...,Wt-1]의 숫자들을 각 power 크기만큼 순서대로 나눠가지게 되는데, 각각이 포함하는 숫자의 초기범위는 route_1:[0,...,W1-1], route_2:[W1,....,W2-1],...,route_n:[Wt-Wn,...,Wt-1]이 된다.

(2) 루트 선택: [0,...,Pt-1]중의 한 숫자를 임의로 고른 후에 그 숫자가 포함되는 루트를 선택한다. 그리고나서, 그 루트에 해당되는 power값에서 1을 뺀다. 만일 route_k가 선택되었다면, Pk=Pk-1, Pt=Pt-1를 실행한후, 이를 바탕으로 각 루트가 가지는 숫자의 범위를 새로 계산한다. 만일 Pt=0이 되면 (1)의 초기화과정을 반복한다.

[커널 컴파일시 도움말]

CONFIG_IP_ROUTE_MULTIPATH:
Normally, the routing tables specify a single action to be taken in
a deterministic manner for a given packet. If you say Y here however,
it becomes possible to attach several actions to a packet pattern,
in effect specifying several alternative paths to travel for those
packets. The router considers all these paths to be of equal "cost"
and chooses one of them in a non-deterministic fashion if a matching
packet arrives.

Symbol: IP_ROUTE_MULTIPATH [=y]
Prompt: IP: equal cost multipath
  Defined at net/ipv4/Kconfig:107
  Depends on: NET && INET && IP_ADVANCED_ROUTER
  Location:
    -> Networking
      -> Networking support (NET [=y])
        -> Networking options
          -> TCP/IP networking (INET [=y])


[스크립트 설정]

### Wired Router (2 DL, 1 UL) ###

# Set up wired interfaces (DL)
ifconfig eth1 10.10.0.1 netmask 255.255.255.0
ifconfig eth2 10.10.1.1 netmask 255.255.255.0

# Set the routing table
ip route del 10.10.2.0/24
ip route add 10.10.2.0/24 mpath rr nexthop via 10.10.0.2 dev eth1 weight 2 nexthop via 10.10.1.2 dev eth2 weight 1
ip route del default
ip route add default via *.*.*.* dev eth0
ip route show


### Wireless Router (2 UL, 1 W-DL) ###

# Set up wired (UL) and wireless (W-DL) interfaces
ifconfig eth0 10.10.0.2 netmask 255.255.255.0
ifconfig eth1 10.10.1.2 netmask 255.255.255.0
wlanconfig wlan0 create wlandev wifi0 wlanmode master
iwconfig wlan0 essid test-ecmp
iwconfig wlan0 chan 156
ifconfig wlan0 10.10.2.1 netmask 255.255.255.0

# Set the routing table
ip route del default
ip route add default nexthop via 10.10.0.1 dev eth0 weight 2 nexthop via 10.10.1.1 dev eth1 weight 1
ip route show


### Wireless Client (1 W-UL) ###

# Set up a wireless (W-UL) interface
ifconfig eth0 down
ifconfig eth1 down
wlanconfig wlan0 create wlandev wifi0 wlanmode managed
iwconfig wlan0 essid test-ecmp
iwconfig wlan0 chan 156
ifconfig wlan0 10.10.2.2 netmask 255.255.255.0

# Set the routing table
ip route del default
ip route add default via 10.10.2.1 dev wlan0
ip route show


root@failsafe:/etc/quagga# cat zebra.conf
hostname router
password xiocom
enable password xiocom
!
debug zebra events
debug zebra kernel
!
interface lo
        ip address 127.0.0.1/32
interface wlan0
        ip address 10.10.2.1/24
interface eth0
        ip address 10.10.0.1/24
interface eth1
        ip address 10.10.1.1/24
!
ip route 0.0.0.0/0 10.10.0.1
ip route 0.0.0.0/0 10.10.1.1


root@failsafe:/etc/quagga# cat ospfd.conf
hostname router-ospf
password xiocom
enable password xiocom
!
interface wlan0
        no ip ospf authentication-key
!
interface eth0
        ip ospf cost 20
        no ip ospf authentication-key
!
interface eth1
        ip ospf cost 20
        no ip ospf authentication-key
!
router ospf
  ospf router-id 127.0.0.1
  network 10.10.2.0/24 area 0
  network 10.10.0.0/24 area 0
  network 10.10.1.0/24 area 0
!
log file /etc/quagga/ospfd.log


출처 : http://loveyuna.egloos.com


## Cisco

Enabling Native Load Splitting Across Equal-Cost Paths

Perform this task to load split IP multicast traffic across multiple equal-cost paths.

Native Multicast Load Splitting Across Equal-Cost Paths

If two or more equal-cost paths from a source are available, unicast traffic will be load split across those paths. However, by default, multicast traffic is not load split across multiple equal-cost paths. In general, multicast traffic flows down from the Reverse Path Forwarding (RPF) neighbor. According to Protocol Independent Multicast (PIM) specifications, this neighbor must have the highest IP address if more than one neighbor has the same metric.

Configuring load splitting with the ip multicast multipath command causes the system to load split multicast traffic across multiple equal-cost paths. When the ip multicast multipath command is configured and multiple equal-cost paths exist, the path in which multicast traffic will travel is selected based on the source IP address. Multicast traffic from different sources will be load split across the different equal-cost paths. Load splitting will not occur across equal-cost paths for multicast traffic from the same source sent to different multicast groups.


Note The ip multicast multipath command load splits the traffic and does not load balance the traffic. Traffic from a source will use only one path, even if the traffic far outweighs traffic from other sources.


The ip multicast multipath command does not support configurations in which the same PIM neighbor IP address is reachable through multiple equal-cost paths. This situation typically occurs if unnumbered interfaces are used. Use different IP addresses for all interfaces when configuring the ip multicast multipath command.

SUMMARY STEPS

1. enable

2. configure terminal

3. ip multicast multipath

4. Repeat Steps 1 through 3 on all the routers in a redundant topology.

DETAILED STEPS

 
Command or Action
Purpose

Step 1 

enable

Example:

Router> enable

Enables privileged EXEC mode.

Enter your password if prompted.

Step 2 

configure terminal

Example:

Router# configure terminal

Enters global configuration mode.

Step 3 

ip multicast multipath

Example:

Router(config)# ip multicast multipath

Enables load splitting of IP multicast traffic across multiple equal-cost paths.

Because this command changes the way an RPF neighbor is selected, it must be configured consistently on all routers in a redundant topology to avoid looping.

Step 4 

Repeat Steps 1 through 3 on all the routers in a redundant topology.


Trackback 0 Comment 0