[클러스터] 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 에 관한 설명을 마치도록 하겠다.