[Из песочницы] Динамическое перенаправление сетевого трафика

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


Корни вопроса начали расти из предыдущего проекта socmetr.ru, где понадобилось собирать большой объем информации из социальных сетей, и таким образом забивая единственный канал с интернетом. Анализ показал, что даже при наличии сжатия, объем поступающей информации так велик, что происходит его блокировка, при этом мощности CPU и Memory не задействованы и на 20%, а дисковая подсистема почти все время простаивает, то есть мы упёрлись в ширину канала, которую нам предоставляет провайдер.


Первая мысль была пойти экстенсивным путём и просто увеличить его возможности, немного остыв и призадумавшись, поняли, что перекладываем проблему на будущее. Само собой, возник вопрос: «Каким путём пойдем товарищи?». В результате реализовали следующую идею:


image

Настройка сервера


Поскольку конфигурация выглядит однообразно, имеет смысл ввести символьные обозначения, пусть:


    A1 это первый сетевой интерфейс, A2 — второй… AN — поcледний
    IP1 это IP-адрес связанный с сетевым интерфейсом A1, IP2 — адрес связанный с A2… IPN — адрес связанный c AN
    GW1 это IP-адрес шлюза провайдера P1 (Provider 1), GW2 — адрес шлюза провайдера P2… GWN — адрес шлюза PN
    GW1_NET это IP-адрес сети провайдера P1, GW2_NET IP-адрес сети провайдера P2… GWN_NET IP-адрес сети провайдера PN


Тогда настройку можно осуществить следующим образом:


Создаем N-таблиц маршрутизации (где N - это количество подведенных каналов с интернетом)
  ip route add {GW1_NET} dev {A1} src {IP1} table T1
  ip route add default via {GW1} table T1
  ...
  ip route add {GWn_NET} dev {An} src {IPn} table Tn
  ip route add default via {GWn} table Tn

Описываем маршруты в основной таблице маршрутизации:
  ip route add {GW1_NET} dev {A1} src {IP1}
  ...
  ip route add {GWn_NET} dev {An} src {IPn}
  ip route add default via {GW1}

Описываем правила:
  ip rule add from {IP1} table T1
  ...
  ip rule add from {IPn} table Tn 

И дело в шляпе, получаем конфигурацию, которая гарантирует что все запросы к конкретному интерфейсу получат от него ответ.


Использование


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


socket.bind(new InetSocketAddress(InetAddress.getByName("network-adapter"), port));

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


Плюсы:


  • возможность гибкого масштабирования интернет-канала (мы получаем возможность в любой момент нарастить или уменьшить общий интернет канал, как за счёт подключения новых провайдеров, так и за счет увеличения полосы пропускания текущих, появляется возможность планировать и прогнозировать его мощность)
  • возможность управления нагрузкой, каждого из них
  • возможность использования любого канала или их последовательности в любой момент времени любой подсистемой

Минусы:


  • изначальные траты на покупку соответствующего оборудования
  • обязательное наличие множества провайдеров интернет услуг

Возможно, кто-то уже сталкивался с подобной проблемой, и мы построили велосипед, так что критика решения только приветствуется.

Комментарии (10)

  • 12 января 2017 в 19:32

    +2

    В вашем решении отсутствует балансировка и обработка отказов провайдеров.
    • 12 января 2017 в 22:14

      0

      Что есть то есть, как сделать балансировку подсказал yosemity
      А с обработкой отказов — мы держим один канал всегда свободным, на тот случай если один из провайдеров откажет, это конечно не спасет если резервный канал тоже будет не доступным, но вероятность события значительно меньше.
  • 12 января 2017 в 19:44

    +2

    А почему на картинке Интернет ни к чему не подключен?
    • 12 января 2017 в 22:15

      0

      Я все таки надеюсь, вы догадались что связь с интернетом всё таки нужна? (Улыбка)
  • 12 января 2017 в 21:20 (комментарий был изменён)

    +1

    Хм. http://www.opennet.ru/docs/RUS/LARTC/x348.html
    • 12 января 2017 в 22:02

      0

      Похоже в сообщество надо было обращаться значительно раньше, а то мы себе мозги над стандартными вещами съели) (вот оригинал указанной ссылки http://lartc.org/howto/lartc.rpdb.multiple-links.html)
      • 12 января 2017 в 23:44

        0

        Ну если честно, вы тут абзац из «букваря» описали. Особенно забавляют плюсы и минусы. Например, минус работы через нескольких провайдеров — необходимость нескольких провайдеров.
        • 13 января 2017 в 07:34

          0

          Например, минус работы через нескольких провайдеров — необходимость нескольких провайдеров.

          Возможно так будет не много понятнее:
          «Под минусами данного решения по динамическому перенаправлению сетевого трафика можно выделить необходимость наличия нескольких провайдеров»

          Возможно требуется пояснение:
          «Чтобы в принципе иметь возможность реализовать данную схему, необходимо наличие нескольких независимых провайдеров, а поскольку это не везде достижимо, то и не везде применимо».

  • 13 января 2017 в 03:06

    0

    Вопрос, зачем, есть стандартные решения балансировки трафика в BGP например:
    http://www.cisco.com/c/en/us/support/docs/ip/border-gateway-protocol-bgp/13762–40.html
    • 13 января 2017 в 07:48

      0

      Знание — сила!

© Habrahabr.ru