IPMP без головной боли
26.11.2008
Для повышения надежности сетевых соединений в Solaris можно использовать link aggregations или IPMP. Ниже по тексту — шпаргалка по IPMP.
Есть два варианта определения сетевого сбоя — Link-based и Probe-based. Link-based просто проверяет — есть линк или нет (горит лампочка в сетевухе или нет :), Probe-based проверяет работу сетевых служб — пингует хост (или хосты) в сети.
Link-based
# cat /etc/hostname.ce0
192.168.10.10 netmask + broadcast + group ipmp0 up
# cat /etc/hostname.ce1
group ipmp0 up
Probe-based
Конфигурация active-active (требуется 2 основных ip-адреса и 2 тестовых )
# cat /etc/hostname.hme0
192.168.85.19 netmask + broadcast + group ipmpgroup up addif 192.168.85.21 deprecated -failover netmask + broadcast + up
# cat /etc/hostname.hme1
192.168.85.20 netmask + broadcast + group ipmpgroup up addif 192.168.85.22 deprecated -failover netmask + broadcast + up
Конфигурация active-standby (требуется 1 основной ip-адреса и 2 тестовых )
# cat /etc/hostname.hme0
19.16.85.19 netmask + broadcast + group test up addif 19.16.85.21 deprecated -failover netmask + broadcast + up
# cat /etc/hostname.hme1
19.16.85.22 netmask + broadcast + deprecated group test -failover standby up
По умолчанию, IPMP пингует «роутер по умолчанию». Для надежности можно добавить скрипт, в котором будут прописаны статические IP-шники, которые следует пинговать (обычно это маршрутизаторы, коммутаторы итд):
cat < < EOF > /etc/init.d/ipmp.targets
#!/bin/sh
TARGETS="192.168.85.117 192.168.85.127 192.168.85.137"
case "$1" in
'start')
/usr/bin/echo "Adding static routes for use as IPMP targets"
for target in $TARGETS; do
/usr/sbin/route add -host $target $target
done
;;
'stop')
/usr/bin/echo "Removing static routes for use as IPMP targets"
for target in $TARGETS; do
/usr/sbin/route delete -host $target $target
done
;;
esac
EOF
chmod 744 /etc/init.d/ipmp.targets
chown root:sys /etc/init.d/ipmp.targets
ln /etc/init.d/ipmp.targets /etc/rc2.d/S70ipmp.targets
Проверить работоспособность IPMP можно с помощью команды if_mpdadm
# if_mpdadm -d hme0
# ifconfig -a
# if_mpdadm -r hme0
UPDATE: 2009.11.10 Добавлен абзац о Link-based failure detection
26.04.2009 в 14:08
> Конфигурация active-active (требуется 2 основных ip-адреса и 2 тестовых )
Как показала практика достаточно только 2 тестовых и 1 основной:
# cat /etc/hostname.hme0
19.16.85.19 netmask + broadcast + group test up
addif 19.16.85.21 deprecated -failover netmask + broadcast + up
# cat /etc/hostname.hme1
19.16.85.22 netmask + broadcast + deprecated group test -failover up
Трафик с 19.16.85.19 пойдет через оба интерфейса несмотря на то что висит он только на hme0.
27.04.2009 в 09:05
Рассмотрим, что значит флаг «deprecated»:
man inconfig
…
deprecated
Marks the logical interface as deprecated. An address
associated with a deprecated interface will not be used
as source address for outbound packets unless either
there are no other addresses available on the interface
or the application has bound to this address explicitly.
The status display shows DEPRECATED as part of flags.
…
Т.е. ip, с таким установленным флагом, будет отвечать, только в случае, если обращаются непосредственно к нему или нет других ip-шников на этом интерфейсе.
27.04.2009 в 17:54
> Рассмотрим, что значит флаг “deprecated”:
> unless either there are no other addresses available on the interface
почему вы думаете что адрес 19.16.85.19 не available на hme1?
http://sunsolve.sun.com/search/document.do?assetkey=1-61-204569-1
цитировать не могу ибо нет права.
28.04.2009 в 17:06
Вы ссылаетесь на документ, описывающий особенности ipmp в солярис 8. В солярис 8 ipmp появился не с самого начала, а только с версии 2/02, если не ошибаюсь. И был реализован только вариант active-active. Так что отсылка к данному документу немного некорректна.
Ну еще там много буков, типа вот этого «If the source address has not been specified by transport layer source address selection, then IP will randomly select a source address from the available interfaces in the interface group. IP addresses associated with interfaces marked as deprecated will not normally be used as source addresses by IP unless deprecated interfaces are all that is available in which case they will be used.»
Вообщем, в варианте «2 тестовых и 1 основной» трафик не пройдет ;)
Хотя, если пришлете вывод snoop-ы, arp-ы, ifconfig-и, доказывающие обратное и описание экперимента — можно будет открыть в Sun кейс по такому интересному багу.
29.04.2009 в 18:28
Вот пример рабочей исходящей балансировки на Solaris 10:
ifconfig -a
…
ce2: flags=1000843 mtu 1500 index 3
inet 10.147.110.7 netmask ffffff00 broadcast 10.147.110.255
groupname CRM
ether 0:14:4f:69:12:16
ce2:1: flags=9040843 mtu 1500 index 3
inet 10.147.110.191 netmask ffffff00 broadcast 10.147.110.255
…
ce8: flags=9040843 mtu 1500 index 6
inet 10.147.110.192 netmask ffffff00 broadcast 10.147.110.255
groupname CRM
ether 0:14:4f:69:12:ee
…
netstat -in:
Name Mtu Net/Dest Address Ipkts Ierrs Opkts Oerrs Collis Queue
…
ce2 1500 10.147.110.0 10.147.110.7 30891445 0 8627979 0 0 0
…
ce8 1500 10.147.110.0 10.147.110.192 19805 0 17352366 0 0 0
…
Снупом не снимал — это продакшн довольно загруженный, не к чему еще и этим грузить. Достаточно посмотреть на дисбаланс iPkts/oPkts на ce8 (на котором ничего кроме тестового IP не висит) и станет понятно что с него трафик отдается довольно активно.
29.04.2009 в 18:32
wodpress съел флаги на интерфейсах, вот они:
ce2: UP,BROADCAST,RUNNING,MULTICAST,IPv4
ce2:1: UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
ce8: UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
30.04.2009 в 02:20
Без snoop — вывод статистики вообще ничего не значит. Например, у вас бэкап или листенер настроен на конкретный ip. Просто, для себя, запустить snoop на интерфейс — посмотреть, что за трафик там прет.