<a id="adc-configuring-ha"></a>

# Настройка высокой доступности в паре

После объединения двух устройств Angie ADC в пару
необходимо настроить механизмы высокой доступности на узлах этой пары.

Для этого необходимо выбрать механизм обеспечения высокой доступности.
Поддерживаются следующие механизмы:

- VRRP;
- OSPF;
- BGP.

Можно одновременно использовать несколько механизмов на разных интерфейсах устройства.

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

## VRRP

Настройки, относящиеся к VRRP, необходимо продублировать на двух узлах пары,
запустив [синхронизацию пары](https://angie.software//adc/docs/high-availability/managing-ha-pair.md#adc-ha-sync).

На активном узле виртуальный VRRP-интерфейс будет находиться состоянии `UP`,
а на резервном узле соответствующий виртуальный интерфейс будет выключен.
При смене ролей меняется состояние виртуальных VRRP-интерфейсов на узлах
(виртуальный VRRP-интерфейс узла, принявшего на себя роль Active, перейдет в состояние `UP`).
Таким образом можно дополнительно организовать резервирование пары высокой доступности
другим устройством или группой.

Пример вывода команды `ip a`, выполненной на активном узле
(интерфейс `vrrp4-ens33-1@ens33` находится в состоянии `UP`):

```console
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 203.0.113.1/32 brd 203.0.113.1 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:96:0c:dc brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.65.1.7/24 brd 10.65.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe96:cdc/64 scope link
valid_lft forever preferred_lft forever
3: vrrp4-ens33-1@ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:00:5e:00:01:01 brd ff:ff:ff:ff:ff:ff
inet 10.65.1.5/24 metric 1000 scope global vrrp4-ens33-1
valid_lft forever preferred_lft forever
inet6 fe80::200:5eff:fe00:101/64 scope link
valid_lft forever preferred_lft forever
```

Пример вывода команды `ip a`, выполненной на резервном узле
(интерфейс `vrrp4-ens33-1@ens33` находится в состоянии `DOWN`):

```console
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 203.0.113.1/32 brd 203.0.113.1 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:c1:36:b4 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.65.1.8/24 brd 10.65.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec1:36b4/64 scope link
valid_lft forever preferred_lft forever
5: vrrp4-ens33-1@ens33: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 00:00:5e:00:01:01 brd ff:ff:ff:ff:ff:ff protodown on protodown_reason <7>
inet 10.65.1.5/24 metric 1000 scope global vrrp4-ens33-1
valid_lft forever preferred_lft forever
inet6 fe80::200:5eff:fe00:101/64 scope link
valid_lft forever preferred_lft forever
```

Далее вы можете настроить высокую доступность двумя способами:

- Назначение адреса сервиса на виртуальный VRRP-интерфейс.
- Назначение адреса сервиса на интерфейс `lo`.

### Назначение адреса сервиса на виртуальный VRRP-интерфейс

При смене роли узла сервис будет перенесен на тот узел, который взял на себя роль Active.
Допускается назначение нескольких IP-адресов одновременно
на один виртуальный интерфейс. Для маршрутизатора адрес сервиса находится в подключенной сети,
то есть доступен напрямую:

![VRRP](../../_images/adc_help/image53_ha.png)

Если клиенты находятся в одной IP-сети с адресом сервиса,
этот способ будет наиболее удобным:

![VRRP](../../_images/adc_help/image54_ha.png)

### Назначение адреса сервиса на интерфейс lo

При настройке статического маршрута на маршрутизаторе необходимо указать
виртуальный VRRP-адрес как адрес следующего перехода (next-hop)
для префикса, содержащего адрес сервиса.
На интерфейс `lo` может быть назначено несколько адресов одновременно.
Мы рекомендуем использовать этот способ как более гибкий:

![VRRP](../../_images/adc_help/image55_ha.png)

## OSPF

Если в сети используются протоколы динамической маршрутизации,
то вы можете добавить пару высокой доступности Angie ADC в OSPF-домен.
При этом только основной узел пары будет анонсировать маршрут на адрес сервиса.

![OSPF](../../_images/adc_help/image56_ha.png)

### Пример

Сервис доступен по адресу `203.0.113.1`.
Необходимо, чтобы основной узел пары анонсировал маршрут на префикс `203.0.113.1/32`.

Сначала нужно вручную назначить адрес `203.0.113.1/32` на интерфейсы loopback
обоих узлов пары высокой доступности.

Интерфейсы основного узла:

```console
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 203.0.113.1/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:96:0c:dc brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.65.1.7/24 brd 10.65.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe96:cdc/64 scope link
valid_lft forever preferred_lft forever
```

Интерфейсы резервного узла:

```console
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 203.0.113.1/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:c1:36:b4 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.65.1.8/24 brd 10.65.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec1:36b4/64 scope link
valid_lft forever preferred_lft forever
```

Далее необходимо добавить поддержку протокола OSPF на интерфейсе `ens33`
и включить процесс маршрутизации OSPF, в котором анонсируются все подключенные сети.

```console
interface ens33
ip ospf 1 area 0
router ospf 1
redistribute connected
distribute-list %ha%pair% out connected
```

После внесения изменений [синхронизируйте конфигурации в паре](https://angie.software//adc/docs/high-availability/managing-ha-pair.md#adc-ha-sync).

#### NOTE
Последняя строка добавляется в момент выполнения синхронизации.
Не нужно вносить эту строку вручную, а также удалять или изменять ее.

### Проверка

Проверка на маршрутизаторе или L3-коммутаторе (список OSPF-соседей):

```console
R1#sho ip ospf nei

Neighbor ID     Pri   State           Dead Time   Address         Interface
1.1.1.1           1   FULL/BDR        00:00:39    10.65.1.7       GigabitEthernet0/0
2.2.2.2           1   FULL/DR         00:00:38    10.65.1.8       GigabitEthernet0/0
```

Соседство по протоколу OSPF устанавливают оба узла пары одновременно:

```console
R1#sho ip ro os
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set
203.0.113.0/32 is subnetted, 1 subnets
O E2     203.0.113.1 [110/20] via 10.65.1.7, 00:52:39, GigabitEthernet0/0
```

Маршрут анонсируется только одним узлом. В этом можно убедиться,
если просмотреть список LSA5 в LSDB маршрутизатора:

```console
R1#sho ip os database external
    OSPF Router with ID (10.65.1.140) (Process ID 1)

        Type-5 AS External Link States
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 1341
Options: (No TOS-capability, No DC, Upward)
LS Type: AS External Link
Link State ID: 203.0.113.1 (External Network Number )
Advertising Router: 1.1.1.1
LS Seq Number: 80000005
Checksum: 0x575B
Length: 36
Network Mask: /32
Metric Type: 2 (Larger than any link state path)
MTID: 0
Metric: 20
Forward Address: 0.0.0.0
External Route Tag: 0
```

Теперь выключите основной узел и проверьте изменения:

```console
R1#sho ip os ne

Neighbor ID     Pri   State           Dead Time   Address         Interface
2.2.2.2           1   FULL/DR         00:00:33    10.65.1.8       GigabitEthernet0/0
```

```console
R1#sho ip os da ex
    OSPF Router with ID (10.65.1.140) (Process ID 1)

        Type-5 AS External Link States
Routing Bit Set on this LSA in topology Base with MTID 0
LS age: 114
Options: (No TOS-capability, No DC, Upward)
LS Type: AS External Link
Link State ID: 203.0.113.1 (External Network Number )
Advertising Router: 2.2.2.2
LS Seq Number: 80000001
Checksum: 0x139B
Length: 36
Network Mask: /32
Metric Type: 2 (Larger than any link state path)
MTID: 0
Metric: 20
Forward Address: 0.0.0.0
External Route Tag: 0
```

```console
R1#sho ip ro os
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set
203.0.113.0/32 is subnetted, 1 subnets
O E2     203.0.113.1 [110/20] via 10.65.1.8, 00:01:57, GigabitEthernet0/0
R1#
```

Остался только один OSPF-сосед, который стал основным узлом пары.
Теперь он анонсирует маршрут до префикса `203.0.113.1/32`.

## BGP

Маршрутизатор устанавливает BGP-сессии с обоими узлами пары.
Обе BGP-сессии активны одновременно, но анонс префикса производится только с основного узла.

Пример типовой схемы:

![BGP](../../_images/adc_help/image57_ha.png)

### Пример

Сервис доступен по адресу `203.0.113.1`. Основной узел пары
будет анонсировать маршрут на префикс `203.0.113.1/32`.

Сначала необходимо вручную назначить адрес `203.0.113.1/32`
на интерфейсы loopback обоих узлов пары высокой доступности.

Интерфейсы основного узла:

```console
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 203.0.113.1/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:96:0c:dc brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.65.1.7/24 brd 10.65.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe96:cdc/64 scope link
valid_lft forever preferred_lft forever
```

Интерфейсы резервного узла:

```console
ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 203.0.113.1/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:c1:36:b4 brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 10.65.1.8/24 brd 10.65.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec1:36b4/64 scope link
valid_lft forever preferred_lft forever
```

На основном узле настройте процесс BGP так,
чтобы он устанавливал соединение с маршрутизатором (`10.65.1.140`).
Также перераспределите подключенные сети в BGP:

```console
router bgp 65001
neighbor 10.65.1.140 remote-as 65001
!
address-family ipv4 unicast
redistribute connected
exit-address-family
exit
```

Запустите [синхронизацию конфигураций](https://angie.software//adc/docs/high-availability/managing-ha-pair.md#adc-ha-sync) между узлами пары высокой доступности,
чтобы настроить процесс маршрутизации BGP на резервном узле.

#### NOTE
Ручная настройка конфигурации на резервном узле не должна использоваться.

### Проверка

Пример конфигурации со стороны маршрутизатора:

```console
router bgp 65001
bgp log-neighbor-changes
neighbor 10.65.1.7 remote-as 65001
neighbor 10.65.1.8 remote-as 65001
```

Убедитесь, что маршрутную информацию отправляет только основной узел (`10.65.1.7`):

```console
R1#sho ip bg su
BGP router identifier 10.65.1.140, local AS number 65001
BGP table version is 17, main routing table version 17
2 network entries using 296 bytes of memory
2 path entries using 128 bytes of memory
1/1 BGP path/bestpath attribute entries using 136 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 560 total bytes of memory
BGP activity 4/2 prefixes, 13/11 paths, scan interval 60 secs

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.65.1.7       4        65001    3283    3206       17    0    0 02:43:57        2
10.65.1.8       4        65001      28      29       17    0    0 00:01:17        0
R1#sho ip bgp
BGP table version is 17, local router ID is 10.65.1.140
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network          Next Hop            Metric LocPrf Weight Path
r>i 10.65.1.0/24     10.65.1.7                0    100      0 ?
*>i 203.0.113.1/32   10.65.1.7                0    100      0 ?
R1#sho ip ro bgp
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set
203.0.113.0/32 is subnetted, 1 subnets
B        203.0.113.1 [200/0] via 10.65.1.7, 02:45:34
R1#
```

Теперь выключите основной узел и проверьте изменения:

```console
R1#sho ip bg su
BGP router identifier 10.65.1.140, local AS number 65001
BGP table version is 21, main routing table version 21
2 network entries using 296 bytes of memory
2 path entries using 128 bytes of memory
1/1 BGP path/bestpath attribute entries using 136 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 560 total bytes of memory
BGP activity 6/4 prefixes, 15/13 paths, scan interval 60 secs

Neighbor        V           AS MsgRcvd MsgSent   TblVer  InQ OutQ Up/Down  State/PfxRcd
10.65.1.7       4        65001       0       0        1    0    0 00:07:13 Active
10.65.1.8       4        65001     228     222       21    0    0 00:11:04        2
```

Остался только один BGP-сосед (`10.65.1.8`),
который стал основным узлом пары.
Теперь он анонсирует маршрут до префикса `203.0.113.1/32`:

```console
R1#sho ip bg
BGP table version is 21, local router ID is 10.65.1.140
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, m multipath, b backup-path, f RT-Filter,
x best-external, a additional-path, c RIB-compressed,
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network          Next Hop            Metric LocPrf Weight Path
r>i 10.65.1.0/24     10.65.1.8                0    100      0 ?
*>i 203.0.113.1/32   10.65.1.8                0    100      0 ?
R1#sho ip ro bg
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
ia - IS-IS inter area, * - candidate default, U - per-user static route
o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
+ - replicated route, % - next hop override

Gateway of last resort is not set
203.0.113.0/32 is subnetted, 1 subnets
B        203.0.113.1 [200/0] via 10.65.1.8, 00:05:50
```

За анонс отвечает distribute-list с именем `%ha%pair%`,
который автоматически прикрепляется ко всем BGP-соседям, описанным в конфигурации.
Соответствующая конфигурационная строка добавляется
в момент синхронизации конфигурации между узлами пары:

```console
router bgp 65001
neighbor 10.65.1.140 remote-as 65001
!
address-family ipv4 unicast
redistribute connected
neighbor 10.65.1.140 distribute-list %ha%pair% out
exit-address-family
exit
```

Если узел является основным, то distribute-list ссылается на разрешающий список доступа:

```console
access-list %ha%pair% seq 5 permit any
```

Если узел является резервным, то distribute-list ссылается на запрещающий список доступа:

```console
access-list %ha%pair% seq 5 deny any
```
