1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-dpvs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Введение

DPVS — это высокопроизводительный балансировщик нагрузки 4-го уровня, основанный на DPDK. Он происходит от Linux Virtual Server (LVS) и его модификации alibaba/LVS.

Примечание: название DPVS происходит от «DPDK-LVS».

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

  • обход ядра (реализация в пользовательском пространстве);
  • «share-nothing», данные для каждого процессора (без блокировок);
  • управление направлением приёма и привязка к процессору (избегание переключения контекста);
  • пакетная обработка TX/RX;
  • нулевое копирование (избегание копирования пакетов и системных вызовов);
  • опрос вместо прерывания;
  • высокопроизводительное IPC с помощью сообщений без блокировок;
  • другие технологии, улучшенные с помощью DPDK.

Основные функции DPVS включают:

  • балансировку нагрузки 4-го уровня, включая режимы FNAT, DR, Tunnel, DNAT и т. д.;
  • режим SNAT для доступа в интернет из внутренней сети;
  • переадресацию NAT64 в режиме FNAT для быстрой адаптации IPv6 без изменений в приложении;
  • различные алгоритмы планирования, такие как RR, WLC, WRR, MH (Maglev Hashing), Conhash (Consistent Hashing) и др.;
  • облегчённый IP-стек в пользовательском пространстве (IPv4/IPv6, маршрутизация, ARP, соседство, ICMP и т.д.);
  • поддержку KNI, VLAN, Bonding, Tunneling для различных сред IDC;
  • аспект безопасности, поддержка TCP syn-proxy, Conn-Limit, black-list, white-list;
  • QoS: управление трафиком.

Функции модулей DPVS проиллюстрированы на следующем рисунке.

Быстрый старт

Тестовая среда

Этот быстрый старт протестирован со следующей средой.

  • Дистрибутив Linux: CentOS 7.2;
  • ядро: 3.10.0-327.el7.x86_64;
  • процессор: Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30 ГГц;
  • сетевая карта: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 03);
  • память: 64 ГБ с двумя узлами NUMA;
  • GCC: gcc версии 4.8.5 20150623 (Red Hat 4.8.5-4).

Другие среды также должны быть подходящими, если работает DPDK, пожалуйста, проверьте dpdk.org для получения дополнительной информации.

  • Пожалуйста, проверьте эту ссылку для сетевых карт, поддерживаемых DPDK: http://dpdk.org/doc/nics.
  • Обратите внимание, что для правильной работы DPVS с многоядерными процессорами элементы rte_flow должны поддерживать «ipv4, ipv6, tcp, udp», а действия rte_flow — «drop, queue» как минимум.

Примечания: чтобы dpvs работал правильно с многоядерными процессорами, элементы rte_flow должны поддерживать "ipv4, ipv6, tcp, udp", а действия rte_flow - "drop, queue" как минимум.

Клонирование DPVS

$ git clone https://github.com/iqiyi/dpvs.git
$ cd dpvs

Что ж, давайте начнём с DPDK.

Настройка DPDK

В настоящее время для DPVS рекомендуется версия dpdk-stable-20.11.1, и мы больше не будем поддерживать версии DPDK более ранние, чем dpdk-20.11. Если вы всё ещё используете более ранние версии DPDK, такие как dpdk-stable-17.11.2, dpdk-stable-17.11.6 и dpdk-stable-18.11.2, используйте более ранние выпуски dpvs, например, v1.8.10 (https://github.com/iqiyi/dpvs/releases/tag/v1.8.10).

Примечания: Вы можете пропустить этот раздел, если имеете опыт работы с DPDK, и обратиться к ссылке для получения подробной информации.

$ wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz   # скачать с сайта dpdk.org, если ссылка не работает.
$ tar xf dpdk-20.11.1.tar.xz

Патчи DPDK

Есть некоторые патчи для DPDK для поддержки дополнительных функций, необходимых для DPVS. Примените их, если необходимо. Например, есть патч для драйвера DPDK kni для аппаратного многоадресного трафика, примените его, если вы собираетесь запускать ospfd на устройстве kni.

Примечания: предполагается, что мы находимся в корневом каталоге DPVS и dpdk-стабильный-20.11.1 находится под ним, обратите внимание, что это не обязательно, просто для удобства.

$ cd <путь-к-dpvs>
$ cp patch/dpdk-stable-20.11.1/*.patch dpdk-stable-20.11.1/
$ cd dpdk-stable-20.11.1/
$ patch -p1 < 0001-kni-use-netlink-event-for-multicast-driver-part.patch
$ patch -p1 < 0002-pdump-change-dpdk-pdump-tool-for-dpvs.patch
$ ...

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

Сборка и установка DPDK

Используйте meson-ninja для сборки библиотек DPDK и экспортируйте среду. variable PKG_CONFIG_PATH for DPDK app (DPVS).

The dpdk.mk в DPVS проверяет наличие libdpdk:

$ cd dpdk-stable-20.11.1
$ mkdir dpdklib                 # user desired install folder
$ mkdir dpdkbuild               # user desired build folder
$ meson -Denable_kmods=true -Dprefix=dpdklib dpdkbuild
$ ninja -C dpdkbuild
$ cd dpdkbuild; ninja install
$ export PKG_CONFIG_PATH=$(pwd)/../dpdklib/lib64/pkgconfig/

Советы: можно использовать скрипт dpdk-build.sh для облегчения сборки DPDK. Запустите dpdk-build.sh -h, чтобы узнать, как использовать скрипт.

Далее необходимо настроить DPDK hugepage. Наша тестовая среда — это система NUMA. Для одноузловой системы см. ссылку: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html.

$ # для системы NUMA
$ echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
$ echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

$ mkdir /mnt/huge
$ mount -t hugetlbfs nodev /mnt/huge

Установите модули ядра и привяжите сетевой адаптер с помощью драйвера uio_pci_generic. Быстрый запуск использует только один сетевой адаптер, обычно мы используем два для кластера FNAT или даже четыре для режима объединения. Например, предположим, что сетевой адаптер, который мы будем использовать для запуска DPVS, — это eth0, при этом у нас всё ещё остаётся другой отдельный сетевой адаптер eth1 для отладки.

$ modprobe uio_pci_generic

$ cd dpdk-stable-20.11.1
$ insmod dpdkbuild/kernel/linux/kni/rte_kni.ko carrier=on

$ ./usertools/dpdk-devbind.py --status
$ ifconfig eth0 down          # предполагая, что eth0 — это 0000:06:00.0
$ ./usertools/dpdk-devbind.py -b uio_pci_generic 0000:06:00.0

Примечания:

  1. Альтернативой uio_pci_generic является igb_uio, который перемещён в отдельный репозиторий dpdk-kmods.
  2. Параметр модуля ядра carrier добавлен в rte_kni.ko начиная с DPDK v18.11, и его значение по умолчанию — «off». Необходимо загрузить rte_kni.ko с дополнительным параметром carrier=on, чтобы устройства KNI работали правильно.

dpdk-devbind.py -u можно использовать для отмены привязки драйвера и переключения обратно на драйвер Linux, такой как ixgbe. Вы также можете использовать lspci или ethtool -i eth0, чтобы проверить идентификатор шины PCI сетевого адаптера. Дополнительную информацию см. на сайте DPDK: http://www.dpdk.org.

Примечание: PMD Mellanox NIC построен на основе libibverbs с использованием Raw Ethernet Accelerated Verbs AP. Он не полагается на драйверы UIO/VFIO. Таким образом, сетевые адаптеры Mellanox не должны привязывать драйвер igb_uio. См. Mellanox DPDK для получения дополнительной информации.

Сборка DPVS

Это просто, просто установите PKG_CONFIG_PATH и соберите его.

$ export PKG_CONFIG_PATH=<путь-of-libdpdk.pc>  # обычно находится в dpdklib/lib64/pkgconfig/
$ cd <путь-of-dpvs>

$ make              # или "make -j" для ускорения
$ make install

Примечания:

  1. Могут потребоваться зависимости для сборки, такие как pkg-config(версия 0.29.2+),automake, libnl3, libnl-genl-3.0, openssl, popt и numactl. Вы можете установить недостающие зависимости с помощью менеджера пакетов системы, например, yum install popt-devel automake (CentOS) или apt install libpopt-dev autoconfig (Ubuntu).
  2. Ранние версии pkg-config (до v0.29.2) могут привести к сбою сборки dpvs. Если это так, пожалуйста, обновите этот инструмент.

Файлы вывода устанавливаются в dpvs/bin.

$ ls bin/
dpip  dpvs  ipvsadm  keepalived
  • dpvs — основная программа.
  • dpip — инструмент для установки IP-адреса, маршрута, VLAN, neigh и т. д.
  • ipvsadm и keepalived взяты из LVS и оба были изменены.

Запуск DPVS

Теперь dpvs.conf должен находиться в /etc/dpvs.conf, просто скопируйте его из conf/dpvs.conf.single-nic.sample.

$ cp conf/dpvs.conf.single-nic.sample /etc/dpvs.conf

и запустите DPVS:

$ cd <path-of-dpvs>/bin
$ ./dpvs &

Проверьте, запущен ли он?

$ ./dpip link show
1: dpdk0: socket 0 mtu 1500 rx-queue 8 tx-queue 8
    UP 10000 Mbps full-duplex fixed-nego promisc-off
    addr A0:36:9F:9D:61:F4 OF_RX_IP_CSUM OF_TX_IP_CSUM OF_TX_TCP_CSUM OF_TX_UDP_CSUM

Если вы видите это сообщение. Вот перевод текста на русский язык:

Отлично, DPVS работает с NIC dpdk0!

Не беспокойтесь, если увидите эту ошибку:

EAL: Error - exiting with code: 1
  Cause: ports in DPDK RTE (2) != ports in dpvs.conf(1)

Это означает, что количество сетевых карт DPVS не соответствует /etc/dpvs.conf. Пожалуйста, используйте dpdk-devbind, чтобы настроить номер сетевой карты или изменить dpvs.conf. Мы улучшим эту часть, чтобы сделать DPVS более «умным», чтобы избежать изменения файла конфигурации, когда количество сетевых карт не совпадает.

Какие конфигурационные элементы поддерживает dpvs.conf? Как их настроить? Что ж, DPVS поддерживает файл конфигурационных элементов conf/dpvs.conf.items, в котором перечислены все поддерживаемые записи конфигурации и соответствующие возможные значения. Кроме того, некоторые файлы примеров конфигураций, хранящиеся как ./conf/dpvs.*.sample, показывают конфигурации dpvs в некоторых конкретных случаях.

Тестирование балансировщика нагрузки Full-NAT (FNAT)

Топология теста выглядит следующим образом:

fnat-single-nic

Настройте VIP и локальный IP (LIP, необходимый для режима FNAT) на DPVS. Давайте поместим команды в setup.sh. Вы можете выполнить проверку с помощью ./ipvsadm -ln, ./dpip addr show.

$ cat setup.sh
VIP=192.168.100.100
LIP=192.168.100.200
RS=192.168.100.2

./dpip addr add ${VIP}/24 dev dpdk0
./ipvsadm -A -t ${VIP}:80 -s rr
./ipvsadm -a -t ${VIP}:80 -r ${RS} -b

./ipvsadm --add-laddr -z ${LIP} -t ${VIP}:80 -F dpdk0
$
$ ./setup.sh

Получите доступ к VIP от клиента, всё выглядит хорошо!

client $ curl 192.168.100.100
Your ip:port : 192.168.100.3:56890

Документация по обучению

Дополнительные примеры настройки можно найти в документации по обучению. В том числе:

  • Обратный прокси WAN-to-LAN FNAT.
  • Настройка режима прямого маршрута (DR).
  • Установка модели «Мастер/резервный» (keepalived).
  • Настройка кластерной модели OSPF/ECMP.
  • Режим SNAT для доступа в Интернет из внутренней сети.
  • Виртуальные устройства (Bonding, VLAN, kni, ipip/GRE).
  • Модуль UOA для получения реального IP-адреса и порта UDP-клиента в режиме FNAT.
  • ... и многое другое...

Мы также перечислили некоторые часто задаваемые вопросы в документе FAQ, который может помочь при возникновении проблем с DPVS.

Тест производительности

Наш тест показывает, что скорость пересылки (pps) у DPVS в несколько раз выше, чем у LVS, и такая же хорошая, как у Google's Maglev.

performance

Нажмите здесь для получения последних данных о производительности.

Лицензия

Пожалуйста, обратитесь к файлу License для подробностей.

Вклад

Пожалуйста, обратитесь к файлу CONTRIBUTING для деталей.

Сообщество

В настоящее время DPVS широко принят десятками участников сообщества, которые успешно использовали его и внесли большой вклад в развитие DPVS. Мы просто перечисляем некоторые из них в алфавитном порядке ниже.

CMSoft cmsoft
IQiYi iqiyi
NetEase netease
Shopee shopee
Xiaomi todo

Свяжитесь с нами

DPVS разрабатывается командой QLB iQiYi с апреля 2016 года. Он широко используется в IDC iQiYi для L4 балансировщиков нагрузки и SNAT-кластеров, и мы уже заменили почти все наши LVS-кластеры на DPVS. Мы открыли исходный код DPVS в октябре 2017 года и рады видеть, что больше людей могут принять участие в этом проекте. Добро пожаловать, попробуйте, сообщайте о проблемах и отправляйте запросы на вытягивание. И, пожалуйста, не стесняйтесь обращаться к нам через Github или Email.

  • github: https://github.com/iqiyi/dpvs
  • email: iig_cloud_qlb # qiyi.com (Пожалуйста, удалите пробелы и замените # на @).

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

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

Введение

**Архитектура DPVS** DPVS — это высокопроизводительный балансировщик нагрузки четвёртого уровня, основанный на DPDK. Развернуть Свернуть
GPL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-dpvs.git
git@api.gitlife.ru:oschina-mirror/mirrors-dpvs.git
oschina-mirror
mirrors-dpvs
mirrors-dpvs
master