Introduction to NFS Load Balance Clustering using Linux

Introduction to NFS Load Balance Clustering using Linux

*

*            작성자 : 클루닉스 서 진우 ( alang@clunix.com )

*            작성일 : 2005년 1월 7일

*            Clunix Home page : http://www.clunix.com

*            Private Homepage : http://www.syszone.co.kr

*

*            문서 작성자의 동의 없는 무단 배포 및 복사는

*            절대 금지합니다.

*

NFS 의 정상적인 서비스 동작 방식은 Portmap 에 의해 유동적으로 생성되는 rpc service

( rquota, nlockmgr, mountd ) 의 port 정보를 서로 공유하여 nfs 해당 서비스가 연결이

가능하게 된다.

이런 서비스들은 TCP, UDP 모든 프로토콜을 사용하게 되는데 LVS 로 NFS를 부하분산하기

위해서는 NFS, Portmap 서비스를 분산하는거 이외도 위의 rpc 관련 서비스 들 역시 분산이

되어져야 한다.

NFS 와 portmap 의 경우는 static service port 를 사용하기 때문에 문제가 되지 않지만..

rpc 의 경우에는 dynamic service port 를 생성하기에 LVS 에서 이부분을 알아서 정의

할수 없기에 어려움이 있다.

이 문제를 해결하기 위해서는 iptables 의 mangle 를 이용하여 ipvs 의 forward mark

를 사용하면 어느정도 해결이 가능하지만 iptables 의 mangle 을 5개 밖에 정의 하지

못하는 제한때문에 근본적인 문제 해결은 아니다. ( 본문 참조 )

persistent 를 이용하면 server by server 로 정의를 할수 있기 때문에

유동되는 서비스 Port 에 대한 정의가 필요 없다. 그러므로 위 문제는 해결이

되겠지만..persistent time out 의 limit 이 48 hour 로 정해저 있기 때문에

이후 새로운 connection 을 맺어야 하는 문제가 발생할 수는 있다.

( 디스크 동기화가 이루어 진다고 하면 re-connection 의 문제는 그리 중요치

않다고 생각된다 )

이 문제 밖에 NFS 서비스를 위해 TCP 1 connection, UDP 3 connection 이 맺어

지는데 이 모든 서비스가 동일한 real server 에 연결이 되어야 정상적인

서비스가 가능하다. 하지만 부하분산 환경에서는 종종 TCP connection 가

UDP connection 이 서로 다른 real server 로 연결 되는 경우가 발생한다.

이러면..persistent time 값이 정해져 있어서 계속 잘못된 연결을 시도하므로

문제가 발생이 되어진다.

위 문제를 해결 하기 위해서 nfs.mountd 의 proto option 으로 가능하다.

proto option 은 nfs mount 에 사용되는 protocol 을 TCP, UDP 중 하나를 지정

하여 접속이 가능한 것이다. 즉 하나의 protocol 만으로도 NFS mount 를 할수

있는 것이다.

NFS Load balancing 을 위해서 여러가지 아이디어와 방법을 제시하고 있기는

한데 언제나 수수께끼 같은 QnA 와 이해되지 않는 의미 심장한 HOWTO 문서만

이 존재한다.

실무적인 방법으로 아래 방법을 제시한다.

LB Server

ipvsadm -A -t 192.168.123.170 -p 10 -s lc

ipvsadm -a -t 192.168.123.170 -r 192.168.123.165

ipvsadm -a -t 192.168.123.170 -r 192.168.123.166

NFS Server

/etc/exports

———————————————–

/home   *(rw,sync,no_root_squash,fsid=1)

( 이설정 안하면 fail over 시 nfs handling 이 유지 되지 않는다 – 끊어진 핸들링)

NFS Clients

mount -t nfs -o proto=tcp,soft,rsize=1024,wsize=8192 192.168.123.170:/home /data3

여기서 또 하나의 문제로서 LB 서버에서 tcp, udp idle connection 을 기본 15분

으로 잡는데 이 시간이 지나면 자동으로 NFS Connection 이 끊어진다.

위의 fsid 설정이 되어져 있으면 끊어진 후에도 nfs mount point 로 접근 시 자동

으로 reconnection 을 맺게 되는데 만일 끊어지기 전에 NFS 서버의 문제 발생으로

fail over 될때 계속 문제의 서버 측으로 접속을 시도 하게 된다. 이래서..즉~

입/출력 에러가 발생한다.

해결 방법으로는 ipvsadm 의 tcp, udp idle timeout 값을 조정해 주면 된다.

ipvsadm –set tcp tcpfin udp

만일 10 시간 유지 하고 싶다면 # ipvsadm –set 36000 0 0 으로 해주면 된다.

0 의 의미는 default 당..

만일 이 설정에서 ipvsadm –set 3600 0 0 으로 설정을 하게 되면 특정 서버에 문제 발생 시

NFS Client 에서는 1시간동안 지속적인 Connection 을 맺으려고 시도 한다.

그렇기 때문에 이 설정을 최대한 짧게 설정하여야 take over 시간이 짧게 걸리게 된다.

ipvsadm –set 10 0 0

으로 설정하면 nfs mountd 가 idle 상태일 경우 다시 mount point 접근 시도 시 NFS 서버에

문제가 발생한 상태라면 정상적인 connection 이 맺어질때 까지 접속을 시도 하지만 위 설정

으로 되어져 있으면 초기 접속 시도 이후 10초 지나면 다시 재 접속을 시도 한다.

그래서 ipvsadm table 에 등록되어져 있는 정상적인 서버로 re-connection 이 맺어지게 된다.

ipvsadm 의 tcp,udp default idle timeout 값은 15분이다.

ipvs 의 스케줄링에서 source hashing (sh) option 이 있다. source hashing 스케줄링은

접속 클라이언트의 접속 IP ( source ip address )별로 작업을 분산하는 방식이다.

즉 초기 접속 시 ipvs 에서에서 특정 클라이언트를 특정 작업 서버로 분산을 시키게 되면

이 클라이언트의 ip 를 ipvs 스케줄링 hashing 에 포함 시켜 놓고 이 클라이언트에서 들어오는

모든 네트워크 패킷을 특정 작업 서버로만 보내게 된다.

ipvsadm -A -t 192.168.123.170 -p 10 -s sh

와 같은 방식으로 정의 하며 이는 NFS 서버를 TCP 전용으로 서비스 하는게 아니라 TCP, UDP

두 protocol 모두를 사용해서 서비스 할 경우 TCP 접속 서버와 UDP 접속 서버가 분리 되는 것을

막아주는 역활을 하는 하나의 방법이 될수 있다.

이밖에 이런 비슷한 역활을 하는 것이 iptables 의 mangle 방식을 ipvs 에 연동해서 사용할수

있는 fwmark ( forward mark ) 를 이용할 수 있을 것이다.

fwmark 는 주로 두개의 서비스가 연동해서 하나의 통합 서비스를 구현하는 시스템의 경우

주로 사용되는 기능이다.

예를 들면 전자 상거래의 web 서비스  와 전자 결재 서비스 같은 경우 두개의 서비스가 같은

시스템에서 이루어져야 하는 경우가 있다. 이럴때 ipvsadm 에서는 80 port 와 전자 결재 서비스

port 가 같은 서버에 접속한 클라이언트에 한해 처리 될 경우 80 port 로 접속 시 해당 connection

이 분배되어지는 서버 쪽으로 전자 결재 서비스 connection도 같이 동일 서버로 보내 지는 역활

을 하는 것이다.

예를 하나 더 들면 windows 의 terminal service 를 부하분산할 경우 terminal service client

방식을 TSWEB 으로 할 경우 terminal service 가 구동되어지는 서버의 웹서버에서 TSWEB 이 구동

되어지기 때문에 웹서비스 포트인 80 과 터미널 서비스 포트인 3389 는 항상 같은 서버로 보내져

야 한다.

사용 방법은 다음과 같다 ( LB 서버에서 정의 )

iptables -t mangle -A PREROUTING -i eth0 -p tcp  -s 0/0 -d VIP –dport <Port> -j MARK –set-mark 1

ipvsadm -a -f 1 -r <real server>:0 -g -w 1

과 같은 방식이다. 즉…

LB 서버의 eth0 를 통해 들어오는 tcp packet 중 destination 이 VIP 일 경우 MARK 1 이라는 rule 로 가라

하는 iptables 정의가 있다.

그리고 MARK 1 로 보내진 packet 은 ipvsadm 에 의해 realserver 로 분배되어진다. 라는 방식이다.

다른 방법 예제이다.

iptables -t mangle -A PREROUTING -s 10.1.1.1/32 -m mark –mark 1

iptables -t mangle -A PREROUTING -s 10.1.1.3/32 -m mark –mark 1

iptables -t mangle -A PREROUTING -s 10.10.0.2/32 -m mark –mark 1

iptables -t mangle -A PREROUTING -s 10.1.1.2/32 -m mark –mark 2

ipvsadm -A -f 1

ipvsadm -A -f 2

ipvsadm -a -f 1 -r 10.1.5.7

ipvsadm -a -f 2 -r 10.1.5.12

즉 -j MARK –set-mark < number > 과 -m mark –mark < number > 방식이 있다.

mangle 설정이 확인은 다음 구문으로 가능하다.

# iptables -t mangle -n -L PREROUTING

위의 iptable 의 mangle 방식과 ipvs 의 fwmark 방식을 이용하면 NFS 서비스 Port 인 2049 Port 로

들어 오는 Packet이 분산 되는 서버로 나머지 NFS 서비스에 필요한 다른 Port < portmap, mountd, rpc >

를 이쪽 서버로 보내 버릴수가 있는 것이다.

하지만 이 mangle 정의는 5개 밖에 정의 할 수 없기 때문에 많은 real server 와 port 가 필요한 서비스

의 경우 적용에 제한이 있게 된다.

이밖에 NFS 서비스의 원할한 Load balancing 을 위해서는 NFS 의 설정과 nfs.mountd 설정에 의해

영향을 많이 받는다 아래 NFS Client 의 nfs.mountd option 에 대해 설명을 하였다. 참고해서

사이트 별 NFS 서비스 특정에 맞게 조정하면 최적의 NFS Clustering 을 구축 할수 있을 것이다.

NFS Clients 에서의 nfs.mountd option 으로 이밖에 soft,hard,timeo,rsize,wsize

… 등등 많은 option 이 있는데 이중에서 가장 최적화된 옵션을 찾아 되는 것은

남겨진 숙제이다.

주요 옵션 설명이다.

  rsize=n        NFS 서버로부터 읽어들이는 바이트 수를 지정 한다. 기본값은

                                    커널에 따라다른데 현재로서는1024 바이트이다.

  wsize=n        NFS 서버에 쓰기를 할 때 사용하는 바이트  수 를  정한다.

                                 기본값은 커널에 따라다른데 현재 로서는 1024 바이트이다.

  timeo=n        RPC 타임아웃이 생기고 나서 첫번째 재전송 요 구를 보낼 때 사용되는 시간으로서

                                1/10 초 단 위이다. 기본값은 7 * 1/10 초이다. 첫번째 타 임 아웃이 생기고 나서는

                                타임아웃 시간이 최대 치인 60 초에 이르거나 너무 많은 재전송 요구 가 벌어질때까지

                                타임아웃 시간이 2 배로 변화 한다. 만약 화일 시스템이 hard ( hard 옵션을 참고 )

                                마운트되어있다면 각각의 타 임 아웃 시간은 2 배로 증가하고 재전송 시도 가 일어날

                                때도 2 배로 증가한다. 최대 타임아 웃 시간은 60 초이다. 네트웍 속도가 느리거나

                                서버자체가 느리다든지 여러 개의 라우터와 게 이트웨이를 거칠 때는 마운트 당시 타임

                                아 웃 시간을 늘려주는 것이 좋다.

  retrans=n      주 타임아웃을 발생시키는 부 타임아웃과 재전 송 횟수를 정한다. 기본값은 3 번의

                                타임아웃이 다.  주 타임 아웃이 일어나면 화일 작업이 중 지되거나 콘솔 상에 “서버가

                                반응하지   않 음 “server  not responding””이라는 메시지가 출 력된다.

  retry=n        백그라운드에서 진행 중인 NFS 마운트 작업 이 포기하기 전까지 실행할 횟수를정한다.

                                기본값 은 10000 번이다.

  namlen=n       NFS 서버가 RPC 마운트 프로토콜의 버전 2  를 지원하지 않을 때 원격 화일시스템에서

                                지원되 는 화일명의 길이를 명시한다. POSIX pathconf 함 수 를  지원하기위해서 사용된다.

                                기본값은 255 개의 문자이다.

  port=n         NFS 서버와 연결할 수 있는 포트 번호를 정 한 다.   만약 0 이라면( 기본값 ) 원격 호스트의

                 포트매퍼(portmapper) 에게 질의하여알아내 도 록  한다. 만약 포트매퍼에 NFS 데몬이 등록되

                 어 있지 않은 경우에는 2049 라는 표준 NFS 포 트 번호가 사용된다.

  mountport=n    mountd 포트 번호 지정하기.

  mounthost=name mountd 를 실행 중인 호스트 명을 정한다.

  mountprog=n     원 격 호스트의 마운트 데몬과 접속하기 위해 사용할 수 있는 별도의 RPC 프로그램번호를 정

                 한다. 만약 여러 개의 NFS 서버를 운영하고 있 을 때 사용한다.  기본값은 표준 RPC 마 운 트

                 데몬 프로그램 번호인 100005 이다.

  bg             만약 첫번째 NFS 마운트 시도가 타임아웃 걸리 면 백그라운드에서 실행을 계속한다.  기본 값

                 은   백그라운드로 실행하지 않고 그냥 포기한 다.

  fg             첫번째 NFS 마운트 시도에서 타임아웃이 걸 리 면 그 즉시 포기해버린다.  기본값이다.

  soft           NFS 화일 작업에서 주 타임아웃이 걸리면 프로 그램에게 I/O 에러를 보고한다.  기본값은  무

                 한히 NFS 화일 작업을 재시도 하는 것이다.

  hard           NFS 화일 작업에서 주 타임아웃이 걸리면 콘솔 상에 “server not responding”, “서버가 반 응

                 하 지  않음”이라고 출력하고 무한히 재시도한 다.  이것이 기본값이다.

  intr           주 타임아웃이 생기고 하드 마운트된 상태라면 화 일 작업을 중지하도록 시그널을보내도록 허

                 용하고 EINTR 시그널을 보내다. 기본값은 화일 작업을 인터럽트하지않는 것이다.

  tcp            NFS   화 일 시스템을 기본값인 UDP 가 아니라 TCP 프로토콜을 사용하여 마운트하도록 한 다.

                 많은 NFS 서버들이 오로지 UDP 만을 지원한다.

  udp            NFS 화일 시스템을 UDP 프로토콜로 마운 트 한 다. 기본값.

마지막으로 NFS Load balancing 을 위해서는 반드시 NFS 서버간의 디스크 동기화가 필요할 것이다.

이는 여러가지 방법이 있는데 여기서는 방법 제시만 하도록 하겠다.

돈이 많은 경우는 Fire channel Card 와 SAN Switch 를 이용한 SAN DISK 를 사용하면 가장 이상적일

것이다.

하지만 돈이 없을 경우는 NFS 서버와 연관성이 많은 PVFS 를 이용하는 방법이 있을 것이다.

하지만 PVFS 의 경우 System Call 방식에 따라 성능에 문제가 큰 경우가 있기 때문에 이보다는

GFS 와 GNBD 를 이용하여 디스크 동기화를 구현하는 것이 이상적이라 생각된다.

이것으로 NFS Load balancing Cluster 에 관한 설명을 마치도록 하겠다.

서진우

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

You may also like...

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