Для повышения надежности сетевых соединений в 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

7 комментариев на запись “IPMP без головной боли”

  1. nopius пишет:

    > Конфигурация 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.

  2. ikorolev пишет:

    Рассмотрим, что значит флаг «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-шников на этом интерфейсе.

  3. nopius пишет:

    > Рассмотрим, что значит флаг “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

    цитировать не могу ибо нет права.

  4. ikorolev пишет:

    Вы ссылаетесь на документ, описывающий особенности 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 кейс по такому интересному багу.

  5. nopius пишет:

    Вот пример рабочей исходящей балансировки на 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 не висит) и станет понятно что с него трафик отдается довольно активно.

  6. nopius пишет:

    wodpress съел флаги на интерфейсах, вот они:
    ce2: UP,BROADCAST,RUNNING,MULTICAST,IPv4
    ce2:1: UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER
    ce8: UP,BROADCAST,RUNNING,MULTICAST,DEPRECATED,IPv4,NOFAILOVER

  7. ikorolev пишет:

    Без snoop — вывод статистики вообще ничего не значит. Например, у вас бэкап или листенер настроен на конкретный ip. Просто, для себя, запустить snoop на интерфейс — посмотреть, что за трафик там прет.