솔라리스/리눅스

IPMP: IP Multipathing(랜카드 이중화) Solaris

지니아부지 2011. 11. 14. 19:32

출처 :  http://hanguy.egloos.com/1924684

네 트워크에 대한 안정성은 이제, 데이터 만큼이나 중요해 졌습니다. 사실, 시스템에서 운영되어 그 안정성이 절하되는 부분은 없다고 할 수 있습니다. 모든 시스템은 이제 안정성 확장성 고가용성에 초점이 맞추어 졌다고 볼 수 있습니다.

본 주제에서 다루고자 하는 것은 IPMP입니다.
IPMP 란 IP MultiPathing의 약자입니다. IPMP는 하나의 서비스 IP를 복수개의 물리적 NIC(Network Interface Card)을 통하여 어떤 하나의 NIC 이나 HUB 등 네트워크 장비에 의한 장애요인을 스스로 극복하고 지속적인 네트워크 서비스를 유지함을 목적으로 합니다.

이는 부하분산(Load Blancing)은 포함하지 않으며, 오로지 장애극복(Fail Over)만 고려합니다. 만약 부하분산까지 포함한다면, 비용이 지불해야 하는 상용 패키지 구입을 권장합니다. Sun에서 사용되는 것으로는 훌륭한 Trunking 이라는 소프트웨어가 있습니다. 물론 Trunking 에서 권장하는 하드웨어 환경을 만족해야 합니다.

IPMP를 위한 선제 조건

10/100 이상을 지원하는 복수개 이상의 NIC
Solaris 8 U2 10/00 (2000년 10월 버전 이상)
전제 가정: 본 예제는 ce0 ce1이라는 NIC을 사용함을 가정합니다.

IPMP 설정:

각 NIC 마다 고유의 Mac Address를 부여해야 합니다.
이는 두가지 방법이 있으며, 첫번째 방법은 시스템의 재시작(reboot)이 필요합니다.


# cd /usr/platform/`uname -i`/sbin/ ; ./eeprom local-mac-address?=true
- or -
OK> setenv local-mac-address? true


시스템 재시작 이후 대상의 NIC을 사용가능하게 만듭니다. plumb 한다라고도 합니다. 미리 plumb 되어 있으면 이 부분을 건너뜁니다.


# ifconfig ce0 plumb
# ifconfig ce1 plumb


앞서 설정해 둔 각기 별개의 Mac Address를 확인하기 위해서, root 권한으로 아래의 명령을 입력하고 결과를 확인합니다.


# ifconfig -a
-
lo0: flags=1000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
ge0: flags=1000843 mtu 1500 index 4
inet 192.9.200.10 netmask ffffff00 broadcast 10.1.8.255
ether 0:3:ba:1:ec:cf
ce0: flags=1000843 mtu 1500 index 6
inet 0.0.0.0 netmask ff000000
ether 8:0:20:e3:3a:de
ce1: flags=1000843 mtu 1500 index 7
inet 0.0.0.0 netmask ff000000
ether 8:0:20:e3:3a:df


위와 같이 상호 Mac Address가 다르게 설정되어 있으면 설정이 제대로 된 것입니다. 이제 ce0와 ce1을 위한 hostname 파일을 작성합니다. 그 내용에 IPMP 설정의 핵심이 있습니다.


# touch /etc/hostname.ce0
# touch /etc/hostname.ce1


그 리고 위에서 만든 파일 두개를 각각 vi 편집기로 열어서 아래의 내용을 기입합니다. 만약 이미 존재하는 hostname 파일이 있으면, 새로운 설정을 위해 아래와 같이 변경해 주시기 바랍니다. 해당되는 NIC 이외의 hostname.* 파일은 조작하실 필요는 없습니다.


/etc/hostname.ce0
::::::::::::::
host-int0 netmask + broadcast + group test deprecated
-failover up addif host-ori netmask + broadcast + failover up
-
/etc/hostname.ce1
::::::::::::::
host-int1 netmask + broadcast + group test deprecated
-failover standby up


위 의 문법은 ce0 가 master로 작동되며, ce1은 standby 형식이입니다. 위 파일에서 host-init0 는 ce0의 이름이 되고, host-init1은 ce1의 이름으로 설정됩니다. test는 두 NIC을 하나의 그룹으로 묶에 사용하는 이름이며, host-ori는 서로 주고 받을(take over) IP를 말합니다. 이 4개는 모두 개인적인 취향에 따라 입력이 가능합니다. 특정 이름에 연결되어 있는 특정 기능은 없습니다. 아래의 설정을 따라가면 더욱 이해가 빠르게 될 것입니다.

/etc/hosts 에 각 NIC을 위한 설정과 주고 받을(take over) IP를 설정합니다.


/etc/hosts
::::::::::::::
#
# Internet host table
#
127.0.0.1 localhost
192.9.200.10 test test.solarisinsider.com loghost
192.9.200.199 host-ori
192.9.200.220 host-int0
192.9.200.221 host-int1


host- ori가 실재 서비스되는 IP 주소이며, 본 문서에서 다루고자 하는 IPMP의 대상이 되는 IP 주소입니다. 이는 가상적으로 존재하며 실재 NIC에는 부여되지 않습니다. host-init0 는 ce0, host-init1 은 ce1 에 각각 부여된 IP 주소와 이름입니다.

위의 설정이 완료되었으면, 아래의 명령을 따라 입력하여 실재 서비스에 들어갑니다.


# ifconfig ce0 `cat /etc/hostname.ce0` up
# ifconfig ce1 `cat /etc/hostname.ce1` up


그리고 ifconfig 로 확인합니다.


# ifconfig -a
-
lo0: flags=1000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
ge0: flags=1000843 mtu 1500 index 4
inet 192.9.200.10 netmask ffffff00 broadcast 10.1.8.255
ether 0:3:ba:1:ec:cf
ce0: flags=9040843 mtu 1500 index 6
inet 192.9.200.220 netmask ffffff00 broadcast 192.9.200.255
groupname test
ether 8:0:20:e3:3a:de
ce0:1: flags=1000843 mtu 1500 index 6
inet 192.9.200.199 netmask ffffff00 broadcast 192.9.200.255
ce1: flags=69040843 mtu 1500 index 7
inet 192.9.200.221 netmask ffffff00 broadcast 192.9.200.255
groupname test
ether 8:0:20:e3:3a:df


위 에서 보면, host-ori의 IP 주소는 가상의 NIC으로 ce0에 할당되어 있음을 할 수 있습니다. 실재 서비스는 ce0를 통하여 이루어지며 ce0의 장애가 감지될 때까지는 ce1은 유휴 상태로 대기(standby)를 유지합니다. 이렇게 되면 설정을 끝나게 됩니다.

장애시연

만약 ce0의 네트워크 라인에 문제가 생겼을 경우 나타나는 메시지와 자동 변화되는 설정을 살펴보겠습니다.


# tail -f /var/adm/messages
-
Nov 30 16:03:50 test genunix: [ID 408822 kern.info] NOTICE: ce0: no fault external to device; service available
Nov 30 16:03:50 test genunix: [ID 611667 kern.info] NOTICE: ce0: xcvr addr:0×01 - link up 100 Mbps full duplex
Nov 30 16:03:52 test genunix: [ID 408822 kern.info] NOTICE: ce1: no fault external to device; service available
Nov 30 16:03:52 test genunix: [ID 611667 kern.info] NOTICE: ce1: xcvr addr:0×01 - link up 100 Mbps full duplex
Nov 30 16:18:44 test genunix: [ID 408789 kern.warning] WARNING: ce0: fault detected external to device; service degraded
Nov 30 16:18:44 test genunix: [ID 451854 kern.warning] WARNING: ce0: xcvr addr:0×01 - link down
Nov 30 16:18:52 test in.mpathd[38]: [ID 594170 daemon.error] NIC failure detected on ce0 of group test
Nov 30 16:18:52 test in.mpathd[38]: [ID 832587 daemon.error] Successfully failed over from NIC ce0 to NIC ce1
Nov 30 16:20:50 test genunix: [ID 408789 kern.notice] NOTICE: ce0: fault cleared external to device; service available
Nov 30 16:20:50 test genunix: [ID 451854 kern.notice] NOTICE: ce0: xcvr addr:0×01 - link up 100 Mbps full duplex
Nov 30 16:21:06 test in.mpathd[38]: [ID 299542 daemon.error] NIC repair detected on ce0 of group test
Nov 30 16:21:06 tset in.mpathd[38]: [ID 620804 daemon.error] Successfully failed back to NIC ce0


16:03:50 ~ 16:03:52 까지는 ce0 ce1 을 up 했을 때 나타나는 메시지입니다.
정상적으로 NIC이 사용가능하다는 이야기를 담고 있습니다.

16:18:44 에 ce0의 네트워크의 문제를 감지하고,
16:18:52 에 in.mpathd 가 작동을 시작한다. 이에 걸리는 시간은 단, 8초 뿐입니다.
16:18:52 같은 시각에 in.pathd가 ce0의 서비스를 ce1을 성공적으로 넘깁니다. (take over)

이를 보면, ipmp의 장애 감지와 복구는 아주 신뢰할 만큼 짧은 시간에 내에 이루어진다는 것을 알 수 있습니다.

그 이후 16:20:50 부터 기록된 메시지는 ce0 의 네트워크가 복구가 되어 다시 ce1의 서비스를 ce0로 이전하는 내용입니다. 여기에서 알 수 있는 것은 ce0 는 언제나 master가 되며 ce0의 장애가 극복되는 즉시 사용된다는 것입니다. 그리고 ce0의 장애극복은 ce1의 즉각적인 유휴상태로 전환됨도 알 수 있습니다. 이 또한 in.mpathd에서 자동적으로 이루어집니다.

ifconfig 를 통해 본 NIC 상태의 변화 정상 상태


lo0: flags=1000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
ge0: flags=1000843 mtu 1500 index 4
inet 192.9.200.10 netmask ffffff00 broadcast 10.1.8.255
ether 0:3:ba:1:ec:cf
ce0: flags=9040843 mtu 1500 index 6
inet 192.9.200.220 netmask ffffff00 broadcast 192.9.200.255
groupname test
ether 8:0:20:e3:3a:de
ce0:1: flags=1000843 mtu 1500 index 6
inet 192.9.200.199 netmask ffffff00 broadcast 192.9.200.255
ce1: flags=69040843 mtu 1500 index 7
inet 192.9.200.221 netmask ffffff00 broadcast 192.9.200.255
groupname test
ether 8:0:20:e3:3a:df


ce0 장애 상태 , ce1 으로 남겨 받은 상태 (take over)


lo0: flags=1000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
ge0: flags=1000843 mtu 1500 index 4
inet 192.9.200.10 netmask ffffff00 broadcast 10.1.8.255
ether 0:3:ba:1:ec:cf
ce0: flags=19040843 mtu 1500 index 6
inet 192.9.200.220 netmask ffffff00 broadcast 192.9.200.255
groupname test
ether 8:0:20:e3:3a:de
ce1: flags=29040843 mtu 1500 index 7
inet 192.9.200.221 netmask ffffff00 broadcast 192.9.200.255
groupname test
ether 8:0:20:e3:3a:df
ce1:1: flags=21000843 mtu 1500 index 7
inet 192.9.200.199 netmask ffffff00 broadcast 192.9.200.255


ce0:1 이 사라지고 ce1:1 이 나타남을 알 수 있습니다.
ce0와 ce1은 host-ori에 설정되어 있는 IP 주소, 192.9.200.199를 가상의 NIC으로 잡아 서로 주고 받는 형식입니다.

저 의 개인적인 경험으로는 master NIC의 신호 차단이 있고 약 5~10초 후에 slave가 작동되는 것을 목격했습니다. 그리고 복합적인 장애-예를 들자면, master, slave 모두 신호 단절과 복원을 반복하는 일정한 패턴 없이 반복되는-에서도 훌륭하게 작동됨을 보았습니다. 비용을 들이지 않고 Network Fail Over를 구성하는 데에는 이보다 좋은 것은 없으리라 생각합니다.

참고 자료
————-
http://www.sun.com/solutions/blueprints/1102/806-7230.html
http://www.samag.com/documents/s=1441/sam0111i/0111i.htm
http://docs.sun.com/
http://www.eng.auburn.edu/~doug/howtos/multipathing.html


* KXXX에 적용을 해야 하나 고민 해야 겠당.

'솔라리스/리눅스' 카테고리의 다른 글

Solaris 10 hostname 변경  (0) 2011.11.24
솔라리스 리눅스화 시키기  (0) 2011.11.23
prstat manpage  (0) 2011.10.12
What is NLWP on Solaris?  (0) 2011.10.12
pthread_setschedparam, pthread_getschedparam  (0) 2011.10.10