Резервирование accel-ppp

В этой статье я приведу пример балансировки пользователей на нескольких серверах accel-ppp, или другими словами это можно еще назвать резервированием серверов accel-ppp.

Все сервера accel-ppp будут обслуживать пользователей в одних и тех же VLAN, просто у серверов будет разный шлюз и к какому серверу быстрее подключится клиент, тот шлюз ему и будет выдан по DHCP. Например на одном сервере шлюз 10.0.0.1/24, на втором 10.0.0.2/24 и т.д. Через Radius не нужно передавать шлюз, по этому заранее уберем его в настройках биллинга. Нужные сети и шлюз нужно указать в конфигурации accel-ppp. Маршруты пользователей между серверами я передаю по iBGP. В биллинге также необходимо запретить выдавать пользователям IP адреса шлюзов, например в ABillS можно исключать IP адреса из пользовательский IP Poll, если же пользователю пытаться выдать IP адрес который является шлюзом на Accel-ppp, то в логах будет ошибка и сессия не запустится:

info: ipoe2071: .[0;39mf8:0d:ac:00:26:00: authentication succeeded
error: ipoe2071: .[0;39mcan't determine Server-ID
info: ipoe2071: .[0;39mipoe: session finished

В ABillS динамический гостевой IP Pool необходимо привязать ко всем серверам доступа, можно один и тот же к разным серверам.

Для резервирования серверов accel-ppp можно использовать параметр weight либо offer-delay.
При offer-delay оба сервера accel-ppp пришлют клиенту DHCPOFFER, при weight — только один, что снизит нагрузку на radius и базу данных, ну если база данных на хорошем raid массиве, то это не играет роли. При использовании offer-delay неактивные сессии которые находятся в процессе запуска завершатся по истечению offer-timeout, если он не указан, то значение по умолчанию 10 секунд, то есть сессия запустится только на одном сервере и в биллинге будет тоже одна.

Я настраивал offer-delay, так как кроме серверов accel-ppp использовал еще JuniperMX, в котором тоже можно делать искусственную задержку DHCPOFFER, но скорее всего это даже не понадобится так как на серверах мощнее CPU и он будет быстрее выдавать IP адреса клиентам, по этому offer-delay нужно настраивать как раз на серверах с Accel-ppp. Для примера, когда я взял 10 000 пользователей и запустил сервер HP DL380 G10 с двумя CPU Xeon5120 и в этих же VLAN запустил Juniper MX204, то Juniper успел авторизовать только 30 пользователей, а все остальные авторизовались на сервере с accel-ppp, только лишь когда я указал offer-delay примерно в 500mc на сервере с accel-ppp, то сессии пользователей начали равномерно распределяться.

offer-delay указывается в секции ipoe (по умолчанию не используется), приведу пример указания:

offer-delay=0,100:1000,200:3000,500:10000

На примере который я указал, пользователи с 1 по 999 получат DHCPOFFER без задержки, пользователи с 1000 по 2999 получат DHCPOFFER с задержкой в 100мс, с 3000 по 9999 с задержкой в 200мс, после 10000 для все остальных будет задержка 500мс (пол секунды).

Можно указать -1 чтобы сервер перестал принимать новые подключения, например при достижении 12000 подключенных устройств:

offer-delay=0,100:1000,200:3000,500:10000,-1:12000

Применить изменение offer-delay можно выполнив reload:

telnet 127.0.0.1 2000
reload

Если необходимо плавно завершить сессии на одном из Accel-ppp, то выполним (в секции ipoe заранее должен быть указан параметр soft-terminate=1):

telnet 127.0.0.1 2000
shutdown soft

После этого сервер не будет принимать новые соединения, а старые завершаться когда пользователи отключатся сами. Этот процесс может длиться долго, по этому например в ночное время можно пометить сессии пользователей как finish и когда они будут продлевать аренду IP адреса, то Accel-ppp ответит им DHCPNAK, что по сути должно спровоцировать клиента выполнить DHCPDISCOVER и авторизоваться на другом сервере.

Пометим сессии как finish:

terminate all soft

Если что можно отменить завершение работы Accel-ppp:

shutdown cancel

Также желательно чтобы все сервера выдавали разный первый DNS сервер, так как если он будет одинаковый, то я встречал что некоторые маршрутизаторы от TP-Link, Tenda на старых версиях прошивки после авторизации на новом сервере получали новый шлюз, а в их таблице маршрутизации оставался маршрут по умолчанию к старому шлюзу, этот баг конечно исправлен в новых версиях прошивки, но тогда придется обновлять прошивки на роутерах пользователей или пользователям постоянно перезагружать свой маршрутизатор.

Сессии также можно завершить используя скрипт:
Accel-ppp скрипт завершения сессий

Второй механизм балансировки/резервирования, это weight=n (по умолчанию не указан), может указываться в секции ipoe для каждого интерфейса, либо глобально для всех сразу, желательно запускать парное количество серверов с Accel-ppp.
Если указать weight=0, то Accel-ppp будет считаться резервным и будет держать сессии только если нет ответа от других серверов Accel-ppp.
Можно указать одинаковый вес для обеих серверов, например weight=1.
Принцип работы «weight» описанный в официальной документации:

On reception of DHCPDISCOVER accel-ppp sends broadcast DHCP message to port 67 with same xid and add special vendor-specific option where encodes its current session count multiplied by weight. On reception of such message accel-ppp searches session with same xid and compares weight. If received weight is less than session’s weight then it terminates this session.

Приведу еще пример секции radius одного из моих серверов с Accel-ppp:

[radius]
dictionary=/usr/share/accel-ppp/radius/dictionary
nas-identifier=accel-ipoe2
nas-ip-address=192.168.5.11
server=192.168.5.5,pass,auth-port=1812,acct-port=0,req-limit=110,fail-timeout=0,max-fail=0,weight=1
server=192.168.5.5,pass,acct-port=1813,auth-port=0,req-limit=0,fail-timeout=0,max-fail=0,weight=1
dae-server=192.168.5.11:3799,pass
acct-timeout=0
verbose=0
timeout=10
max-try=9
acct-interim-jitter=60

Еще пример секции ipoe одного из моих серверов:

[ipoe]
verbose=0
unit-cache=0
offer-delay=0,300:999,500:2500,700:14999
interface=re:(?!(^vlan500$))(?!(^vlan501$))(^vlan[2-9][0-9][0-9]+$),mode=L2,start=dhcpv4,shared=1,ifcfg=1,ip-unnumbered=1,proxy-arp=1
interface=re:^vlan1[0-2][0-9][0-9]$,mode=L2,start=dhcpv4,shared=1,ifcfg=1,ip-unnumbered=1,proxy-arp=1
gw-ip-address=172.18.0.2/19
gw-ip-address=172.16.0.2/19
gw-ip-address=172.19.0.2/20
gw-ip-address=172.17.0.2/21
gw-ip-address=10.10.0.2/20
lease-time=600
max-lease-time=660
renew-time=300
username=lua:username
lua-file=/etc/accel-ppp.lua
nas-identifier=ixnfo.com
soft-terminate=1

Смотрите также мои статьи:
Сборка и установка accel-ppp
Установка и настройка accel-ppp (IPoE) для ABillS
Настройка iBGP в Bird
Другие мои статьи про accel-ppp

Оставьте комментарий

Добавить комментарий