LINUX.ORG.RU
ФорумAdmin

Keepalived: VIP и real_server'а на тех же хостах

 ,


0

1

Пытаюсь таки немножечко разбалансировать нагрузку(TCP/UDP) на два сервера посредством keepalived, но так как серваков под балансирщик нет, то изучаю вариант совмещения балансировщика и real_server на тех же серваках.
Тестирую на такой конфигурации:
Система: Centos 7, keepalived 2.0.7, один сетевой интерфейс, нагрузка идёт из локальный сети.
Первая нода

! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
}

vrrp_instance TEST {
    state MASTER
    interface bond0
    virtual_router_id 51
    priority 150
    advert_int 1
    virtual_ipaddress {
        192.168.1.13
    }
}

virtual_server 192.168.1.13 8010 {
    delay_loop 10
    lvs_sched rr
    lvs_method DR
    persistence_timeout 5
    protocol TCP

    real_server 192.168.1.11 8000 {
       TCP_CHECK {
       }
    }

    real_server 192.168.1.12 8000 {
       TCP_CHECK {
       }
    }

Вторая нода
! Configuration File for keepalived
global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
}

vrrp_instance TEST {
    state BACKUP
    interface bond0
    virtual_router_id 51
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.1.13
    }
}

virtual_server 192.168.1.13 8010 {
    delay_loop 10
    lvs_sched rr
    lvs_method DR
    persistence_timeout 5
    protocol TCP

    real_server 192.168.1.11 8000 {
       TCP_CHECK {
       }
    }

    real_server 192.168.1.12 8000 {
       TCP_CHECK {
       }
    }


Плюс дополнительный тюнинг sysctl и лупбэка по этому гайду: http://kb.linuxvirtualserver.org/wiki/Building_Two-Node_Directors/Real_Server...

В идеале при запросах к 192.168.1.13:8010 я ожидаю увидеть пакеты поочерёдно на 192.168.1.11 и 192.168.1.12
Всё что есть - прилетает SYN на 192.168.1.13, дальше пусто, в логах keepalived тоже ноу криминалити.
В какую сторону копать?

Ping vel

★★★★★

lvs_method DR - это магия :)

Оно изначально заточено на такое http://www.linuxvirtualserver.org/VS-DRouting.html

Посмотри на дату этой статьи - 2007 год. С тех пор МНОГО чего изменилось.

Меня сильно напрягает постоянное наличие vip на lo. Если бы оно присутствовало только на бекапе - это было бы логично.

IMHO наличие 2-х одинаковых ip на разных интерфейсах - это бомба замедленного, непредсказуемого поведения. Т.ч. в настройках vrrp я бы назначал vip на lo в backup через notify_master/notify_backup.

Я бы начал такие эксперименты сначала без vrrp.

Думаю, что за последние 13 лет ip sysctl изменился и нужно искать, что крутить еще кроме net.ipv4.conf.eth0.arp_ignore = 1 && net.ipv4.conf.eth0.arp_announce = 2

rp_filter и accept_local однозначно нужно проверять.

vel ★★★★★
()

Обновил keepalived до 2.1.5, судя по ченжлогу там диагностики улучшали. Плюс заменил 8010 на 8000, в новой версии это считается варнингом, если порт на VIP отличается от порта на RS
Что вижу теперь:

Oct 18 12:03:35 host1 Keepalived[4593]: Starting Keepalived v2.1.5 (07/13,2020)
Oct 18 12:03:35 host1 Keepalived[4593]: Running on Linux 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020 (built for Linux 3.10.0)
Oct 18 12:03:35 host1 Keepalived[4593]: Command line: '/snap/keepalived/1538/usr/sbin/keepalived-310'
Oct 18 12:03:35 host1 Keepalived[4593]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 18 12:03:35 host1 Keepalived[4617]: NOTICE: setting config option max_auto_priority should result in better keepalived performance
Oct 18 12:03:35 host1 Keepalived[4617]: Starting Healthcheck child process, pid=4618
Oct 18 12:03:35 host1 Keepalived[4617]: Starting VRRP child process, pid=4619
Oct 18 12:03:35 host1 systemd: Started Service for snap application keepalived.daemon.
Oct 18 12:03:35 host1 Keepalived_healthcheckers[4618]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: Registering Kernel netlink reflector
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: Registering Kernel netlink command channel
Oct 18 12:03:35 host1 Keepalived_healthcheckers[4618]: Gained quorum 1+0=1 <= 2 for VS [192.168.1.13]:tcp:8000
Oct 18 12:03:35 host1 Keepalived_healthcheckers[4618]: Activating BFD healthchecker
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: Opening file '/etc/keepalived/keepalived.conf'.
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: (TEST) State MASTER must match being address owner
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: Warning - firewall needed due to use_vmac or no_accept/strict but not configured
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: Adding iptables rules to default chains, but chains not configured
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: Registering gratuitous ARP shared channel
Oct 18 12:03:35 host1 Keepalived_vrrp[4619]: (TEST) Entering BACKUP STATE (init)
Oct 18 12:03:36 host1 Keepalived_vrrp[4619]: (TEST) received lower priority (100) advert from 192.168.1.12 - discarding
Oct 18 12:03:37 host1 Keepalived_vrrp[4619]: (TEST) received lower priority (100) advert from 192.168.1.12 - discarding
Oct 18 12:03:38 host1 Keepalived_vrrp[4619]: (TEST) received lower priority (100) advert from 192.168.1.12 - discarding
Oct 18 12:03:39 host1 Keepalived_vrrp[4619]: (TEST) Entering MASTER STATE

Смущает варнинг про iptables, но что именно требуется не понял.
Сейчас там следующее
# iptables-save                                                                                                                                                                      12:42:08
*filter
:INPUT ACCEPT [27965710:55829642949]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5005679:62274532527]
-A INPUT -m set --match-set keepalived dst -j DROP
-A OUTPUT -m set --match-set keepalived src -j DROP
COMMIT

Адреса:
Нода1
# ip -br -4 a
lo               UNKNOWN        127.0.0.1/8 192.168.1.13/32
bond0            UP             192.168.1.11/24 192.168.1.13/32

Нода2
# ip -br -4 a                                               
lo               UNKNOWN        127.0.0.1/8 192.168.1.13/32
bond0            UP             192.168.1.12/24


+ mky, blind_oracle

zolden ★★★★★
() автор топика
Ответ на: комментарий от vel

lvs_method DR - это магия :)
Оно изначально заточено на такое
http://www.linuxvirtualserver.org/VS-DRouting.html

Я так понимаю, в моём случае других вариантов то и нет, у меня же всё в локалке

Я бы начал такие эксперименты сначала без vrrp

То есть добавить «как бы флоат» просто статикой?

zolden ★★★★★
() автор топика
Последнее исправление: zolden (всего исправлений: 1)
Ответ на: комментарий от zolden

Да. Сначала vip адрес статикой и добиться работы локального сервиса, потом балансировки серверов, а потом настроить vrrp.

Порты должны быть одинаковы для DR. Это для nat они могут быть разные.

А что, они починили use_vmac в vrrp? Он достаточно долго был сломан.

Собственно вот в чем проблема:

На RS сервис должен слушать порт без привязки к IP - иначе он не будет принимать пакеты для VIP (в случае DR).

Приходящий пакет должен попасть сначала в lvs, а не напрямую в сервер на мастере, а пересланный пакет должен попасть в сервис и не должен попасть в lvs. В случае DR у них теоретически будут отличаться только indev, что делает возможным фильтрацию входящих и пересылаемых пакетов.

Где в этой схеме lvs - я не знаю.

Если все совсем непонятно, то -t raw -I PREROUTING -d vip -j TRACE возможно даст подсказки.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 2)
Ответ на: комментарий от vel

А что, они починили use_vmac в vrrp? Он достаточно долго был сломан

В ченлжлоге куча упоминаний про это, чуть ли не в каждом релизе, но, так как я никогда до этого keepalived не использовал, то не берусь судить

zolden ★★★★★
() автор топика
Ответ на: комментарий от vel

Что-то хрень какая-то.
Вообще убрал секцию про VRRP, оставил только часть про VS/RS.
Первая нода - чисто VS, вторая - чисто RS.

virtual_server 192.168.1.11 8000 {
    delay_loop 10
    lvs_sched rr
    lvs_method DR
    persistence_timeout 5
    protocol TCP

    real_server 192.168.1.12 8000 {
       TCP_CHECK {
       }
    }

И даже так не работает, да ну как так-то o_0
До RS бесконечно идут SYNы и всё
# ipvsadm -ln                                                        
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.11:8000 rr persistent 5
  -> 192.168.1.12:8000           Route   1      0          1

zolden ★★★★★
() автор топика
Ответ на: комментарий от vel

Мм...что-то я думал что VIP на lo нужен только для случая с VRRP?
На всякий случай - сейчас у меня максимально упрощённый стенд:
Одна нода под VS, на ней один интерфейс, на нём статика 192.168.1.11 и всё. Нужно и на lo его повесить?
Вторая нода под RS, на ней интерфейс и на нём статика 192.168.1.12 и всё.
С первоначального теста остались
arp_ignore = 1
arp_announce = 2

zolden ★★★★★
() автор топика
Ответ на: комментарий от zolden

На всех RS.

При vrrp VIP будет на мастере, а на бекапе его кто-то должен добавить.

Оно (ipvs) в режиме DR форвардит пакет без изменений на уровне L3 и выше (это дешево и сердито).

Что делает RS если ему приходит пакет адресованный VIP и VIP отсутствует на машине?

Судя по исходникам ipvs находится в этой схеме между local process и input filter.

Не смотря на то, что ipvs это честь netfilter, TRACE на него не действует :(

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.