Intereting Posts
Как распознать состояние праздности в течение определенного периода в сценарии? извлекать линии в соответствии с конкретным столбцом Как назначить сочетание клавиш для конкретного приложения в Openbox? Где я могу найти «Формат маски доступа» для разрешений POSIX и ACL в Linux? Немигающий курсор в xmonad Обрезка дерева пакетов с помощью apt-get и yum Параллель GNU: событие не найдено (! ~) Заставить wget создать пустой файл для всего, что он скачивает? Каковы эти строки% (…) в файле jail.conf fail2ban и как они работают? как заставить gnome использовать мою домашнюю папку в качестве папки рабочего стола? Поиск и замена пути стиля Windows с помощью sed stderr отправляется по конвейеру, но я этого не хочу Является ли «устройство» синонимом «диска» в Unix-подобных ОС? Поиск и замена чего-либо, содержащегося в ‘(одинарные кавычки) Установка R-базы в Linux Mint 17.1 Cinnamon

Пропустить маршрутизацию через интерфейс `lo` для исходящих пакетов

Введение

У меня есть следующая конфигурация балансировки нагрузки:

10.0.1.31 - lb 10.0.1.35 - virtual IP 10.0.1.32 - node1 (tomcat + mysql) 10.0.1.33 - node2 (tomcat + mysql) 

Я использую keepalived который перенаправляет пакеты на активные узлы – общий IP-адрес – 10.0.1.35. lb имеет конфигурацию config:

 echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf 

node1 и node2 для корректной обработки входящих пакетов необходимо иметь 10.0.1.35 на lo

 [root@lb-node1 ~]# ip addr list dev lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet 10.0.1.35/32 scope global lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 

проблема

В связи с тем, что у нас есть 10.0.1.35 на lo если locale tomcat пытается подключиться к mysql через lb – соединение устанавливается на локальный экземпляр.

Я хотел бы пропустить lo для исходящих пакетов

Контрольная работа

От узла1, который отключил службу mysql и 10.0.1.35 ip on lo interface, я пытаюсь подключиться к mysql на узле2. К сожалению, результат

  [root@lb-node1 ~]# telnet 10.0.1.35 3306 Trying 10.0.1.35... telnet: connect to address 10.0.1.35: Connection refused 

конечно, если я удалю 10.0.1.35 IP из lo интерфейса, я могу подключиться к экземпляру mysql на узле2

Решение(?)

Я пытался добавлять маршруты с соответствующими метриками, но это не помогает: /

  [root@lb-node1 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.1.0 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 10.0.1.0 0.0.0.0 255.255.255.255 UH 100 0 0 lo 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 0.0.0.0 10.0.1.1 0.0.0.0 UG 0 0 0 eth0 

Решение @Patrick

 vip=10.0.1.35 ip route add local $vip dev lo table 10 proto kernel scope host ip rule add to $vip lookup 10 prio 1 ip route del local $vip dev lo table local ip rule add to $vip iif lo lookup main prio 0 

Проблема с выпуском Patrick

Начальное состояние

VIP + конфигурация вашего IP-маршрута, mysql работает на обоих узлах


 P Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.1.35:http rr persistent 6 TCP 10.0.1.35:mysql rr persistent 6 -> 10.0.1.32:mysql Route 10 0 0 -> 10.0.1.33:mysql Route 10 0 2 UDP 10.0.1.35:snmptrap rr persistent 6 -> 10.0.1.32:snmptrap Route 10 0 0 -> 10.0.1.33:snmptrap Route 10 0 1 root@lb-node1 ~]# mysql -h 10.0.1.35 -u test -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 126 Server version: 5.5.36-MariaDB-wsrep-log MariaDB Server, wsrep_25.9.r3961 Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name = 'hostname'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | hostname | lb-node2 | +---------------+----------+ 1 row in set (0.00 sec) MariaDB [(none)]> [root@lb-node2 ~]# mysql -h 10.0.1.35 -u test -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 133 Server version: 5.5.36-MariaDB-wsrep-log MariaDB Server, wsrep_25.9.r3961 Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. ariaDB [(none)]> ; ERROR: No query specified MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name = 'hostname'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | hostname | lb-node2 | +---------------+----------+ 1 row in set (0.00 sec) MariaDB [(none)]> 

Как видите, все работает правильно.

вопрос

Но когда я закрыл текущий активный сервер mysql:

 [root@lb-node2 ~]# service mysql stop Shutting down MySQL.... SUCCESS! [root@lb-node2 ~]# Every 2.0s: ipvsadm -l Fri May 9 10:20:49 2014 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.1.35:http rr persistent 6 TCP 10.0.1.35:mysql rr persistent 6 -> 10.0.1.32:mysql Route 10 0 0 UDP 10.0.1.35:snmptrap rr persistent 6 -> 10.0.1.32:snmptrap Route 10 0 0 -> 10.0.1.33:snmptrap Route 10 0 1 

Я не могу подключиться к mysql из обоих узлов

 [root@lb-node2 ~]# mysql -h 10.0.1.35 -u test -p Enter password: ..... 

Мне кажется, что node1 не принимает входящие пакеты, потому что балансировка нагрузки правильно перенаправляет пакеты

 [root@lb-node1 ~]# tcpdump -i eth0 'port 3306' and src 10.0.1.33 or dst 10.0.1.33 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 10:35:26.915640 ARP, Reply 10.0.1.35 is-at 52:54:00:30:a3:4b (oui Unknown), length 28 10:35:26.915987 IP 10.0.1.33.38517 > 10.0.1.35.mysql: Flags [S], seq 2024730796, win 14600, options [mss 1460,sackOK,TS val 1298907 ecr 0,nop,wscale 7], length 0 10:35:27.914788 IP 10.0.1.33.38517 > 10.0.1.35.mysql: Flags [S], seq 2024730796, win 14600, options [mss 1460,sackOK,TS val 1299907 ecr 0,nop,wscale 7], length 0 10:35:29.914784 IP 10.0.1.33.38517 > 10.0.1.35.mysql: Flags [S], seq 2024730796, win 14600, options [mss 1460,sackOK,TS val 1301907 ecr 0,nop,wscale 7], length 0 

Что странно, потому что у меня есть VIP на lo

 [root@lb-node1 ~]# ip addr list dev lo 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet 10.0.1.35/32 scope global lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever [root@lb-node1 ~]# ip route 10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.32 169.254.0.0/16 dev eth0 scope link metric 1002 default via 10.0.1.1 dev eth0 

Я выкопал какой-то действительно старый код, который сделал что-то похожее на то, что вы пытаетесь выполнить. Вот что вы можете сделать, чтобы получить нужный эффект:

 vip=10.0.1.35 ip route add local $vip dev lo table 10 proto kernel scope host ip rule add to $vip lookup 10 prio 1 ip route del local $vip dev lo table local ip rule add to $vip iif lo lookup main prio 0 

Это приведет к тому, что поле отправит любой трафик на 10.0.1.35 в сеть (и, следовательно, на балансировщик нагрузки, который отвечает на запросы ARP для этого IP- 10.0.1.35 ). Но коробка все равно примет любой трафик, который дает балансировщик нагрузки.


объяснение

Я собираюсь объяснить их не по порядку, поскольку они имеют больше смысла.

 ip route del local $vip dev lo table local 

Это удаляет маршрут, который говорит, чтобы отправить весь трафик на 10.0.1.35 на локальный хост через lo .

 ip route add local $vip dev lo table 10 proto kernel scope host 

Это заменяет ту, которую мы только что удалили, но она помещает ее в новую таблицу ( 10 ).

 ip rule add to $vip iif lo lookup main prio 0 

Это сообщает системе, что при отправке трафика из локального поля ( iif lo ) в 10.0.1.35 для использования основного маршрута вместо «локального» маршрута. Это приведет к 10.0.1.35 трафик 10.0.1.35 маршрут для подсети 10.0.1.0/24 (или независимо от вашей локальной подсети, если нет /24 ).

 ip rule add to $vip lookup 10 prio 1 

Это правило добавляется с более низким приоритетом (большее число), чем указанное выше правило, чтобы оно соответствовало ему. Если трафик не соответствует приведенному выше правилу (не iif lo ), он проверит таблицу 10 для соответствующего маршрута, который подберет маршрут, который мы добавили ранее.
Причиной правила (и маршрута, который мы добавили в таблицу 10 ) является то, что любой трафик, который балансировщик нагрузки отправляет в это поле (таким образом, не iif lo ), не будет отклонен. В основном он сообщает ядру «да, этот IP принадлежит мне».

Причина, по которой мы переместили «местный» маршрут в таблицу 10 состоит в том, что мы хотим, чтобы наше iif lo lookup main prio 0 правило iif lo lookup main prio 0 соответствовало. Но «локальная» таблица имеет наивысший приоритет, поэтому она всегда совпадает с первым.

Причина, по которой мы добавляем правила в том порядке, который мы делаем, заключается в предотвращении прерывания. Если вы добавили их в порядок, описанный в объяснении, у вас будет пробел, когда нет маршрута до 10.0.1.35 что приведет к 10.0.1.35 что любой 10.0.1.35 трафик будет отправлен в локальный блок, который будет отклонен.