Балансировка нагрузки Nginx

задняя часть алгоритм Nginx балансировки нагрузки

содержание

Эта статья была последний раз обновлена ​​2016.11.01

особенность

1.1 Применение

Как мощное программное обеспечение веб-сервера, Nginx обладает характеристиками высокой производительности, высокой параллелизма и низкого использования памяти. Кроме того, он также может предоставить мощную функцию обратного прокси. Около 20% виртуальных хостов в России используют Nginx в качестве обратного прокси-сервера, в Китае многие веб-сайты, такие как Tencent, Sina и NetEase, используют Nginx в качестве обратного прокси-сервера. Согласно статистике Netcraft, 11,48% самых загруженных веб-сайтов в мире используют Nginx в качестве своего сервера или прокси-сервера. Основываясь на функции обратного прокси, Nginx используется в качестве балансировщика нагрузки по следующим причинам:

  1. Высокое количество одновременных подключений
  2. низкое потребление памяти
  3. Файл конфигурации очень прост
  4. бюджетный
  5. Поддержка правил перезаписи
  6. Встроенная функция проверки работоспособности
  7. экономить пропускную способность
  8. Высокая стабильность

1.2 Архитектура

На приведенном выше рисунке представлена ​​общая схема архитектуры от официального сайта.

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

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

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

Модели разработки: epoll и kqueue.

Поддерживаемые механизмы событий: kqueue, epoll, rt signal, /dev/poll, порты событий, select и poll.

Поддерживаемые функции kqueue включают EV_CLEAR, EV_DISABLE, NOTE_LOWAT, EV_EOF, количество доступных данных, коды ошибок.

Поддержка sendfile, sendfile64 и sendfilev; файл AIO; DIRECTIO; поддержка Accept-фильтров и TCP_DEFER_ACCEP.

1.3 Производительность

Высокий параллелизм Nginx, официальный тест поддерживает 50 000 одновременных подключений. Фактическая производственная среда может достигать 20 000–30 000 одновременных подключений. 10 000 неактивных HTTP-соединений для поддержания активности занимают всего около 2,5 МБ памяти. При 30 000 одновременных подключений 10 процессов Nginx потребляют 150 МБ памяти. Команда Taobao tengine заявила, что в результате теста «на машине с 24 ГБ памяти она может обрабатывать до 2 миллионов одновременных запросов».

Две балансировки нагрузки

2.1 Поддержка протокола

Nginx работает на 7-м уровне сети и может сам выполнять стратегию шунтирования для http-приложения. Поддерживает балансировку нагрузки протоколов HTTP и HTTPS уровня 7. Для поддержки четырехуровневого протокола требуется сторонний плагин — ngx_tcp_proxy_module от yaoweibin реализует tcp upstream.

GitHub.com/Яо Вейбинь/Вы…

Кроме того, сам nginx постепенно улучшает поддержку других протоколов:

  • nginx 1.4.0 официально поддерживает как Websocket, так и SPDY.
  • Официальная поддержка SPDY 3.1 в nginx 1.6.0
  • nginx 1.10.0 официально поддерживает HTTP/2

В настоящее время последняя стабильная версия nginx — 1.10.2, а основная разрабатываемая версия — 1.11.5. Последняя версия Tengine наследует версию nginx 1.6.2.

2.2 Стратегия баланса

Стратегии балансировки нагрузки nginx можно разделить на две категории: встроенные стратегии и расширенные стратегии. Встроенные стратегии включают взвешенный циклический перебор и ip hash.По умолчанию эти две стратегии будут скомпилированы в ядро ​​nginx, достаточно указать параметры в конфигурации nginx. Существует множество стратегий расширения, таких как честный, общий хэш, согласованный хеш и т. д., которые по умолчанию не компилируются в ядро ​​nginx.

  1. взвешенная круговая система

    Принцип опроса очень прост.Во-первых, давайте представим основной процесс опроса. Ниже представлена ​​блок-схема обработки запроса:

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

  2. ip hash

    Хэш IP — это еще одна стратегия балансировки нагрузки, встроенная в nginx.Процесс аналогичен опросу, но алгоритм и конкретная стратегия изменились, как показано на следующем рисунке:

    Основная реализация алгоритма ip hash выглядит следующим образом:

     for(i = 0;i < 3;i++){
         hash = (hash * 113 + iphp->addr[i]) % 6271; 
     }
    
     p = hash % iphp->rrp.peers->number;     
    

    Как видно из кода, значение хэша связано как с ip, так и с количеством серверных машин. После тестирования вышеуказанный алгоритм может непрерывно генерировать 1045 различных значений, что является жестким ограничением алгоритма. В nginx для этого используется защитный механизм: когда после 20 хэшей не найдено ни одной доступной машины, алгоритм вырождается в опрос. Поэтому, по сути, алгоритм хеширования ip — это замаскированный алгоритм опроса.Если начальные значения хэшей двух ips совпадают, то запросы от этих двух ips всегда будут приземляться на один и тот же сервер, который сбалансирован Пол имеет глубокие скрытые опасности.

  3. fair

    Справедливая стратегия является стратегией расширения и по умолчанию не компилируется в ядро ​​nginx. Принцип заключается в оценке ситуации с нагрузкой по времени отклика внутреннего сервера и выборе машины с наименьшей нагрузкой для разгрузки. Эта стратегия очень адаптивна, но реальная сетевая среда часто не так проста, поэтому ее следует использовать с осторожностью.

  4. Общий хэш, последовательный хеш

    Эти две стратегии также являются стратегиями расширения, и есть некоторые различия в конкретной реализации.Общий хэш относительно прост и может быть хеширован с помощью встроенной переменной nginx в качестве ключа.Консистентный хеш использует встроенный согласованный хеш кольцо nginx и может поддерживать memcache.

  5. session_sticky

    Эта стратегия заключается в том, что все запросы в сеансе будут попадать на один и тот же узел. Его можно использовать в распределенной архитектуре, но при зависании узла информация о сеансе будет одновременно потеряна.Если схема синхронизации сеанса используется для синхронизации информации о сеансе на всех узлах, стоимость будет очень высокой.Используйте эту схему с осторожность. nginx не поддерживает эту стратегию по умолчанию, tengine поддерживает:T engine.taobao.org/document_can….

2.2 Пример конфигурации

  1. HTTP

     upstream upstream_test{  
         server 192.168.0.1:8080;
         server 192.168.0.2:8080;
    
         #ip_hash;
         keepalive 30;
    
         ## tengine config
         #check interval=300 rise=10 fall=10 timeout=100 type=http port=80;
         #check_http_send "GET / HTTP/1.0\r\n\r\n";
         #check_http_expect_alive http_2xx http_3xx;
    
         ## tengine config
         #session_sticky cookie=cookieTest mode=insert;
     }  
    
     location / {
    
         proxy_pass         http://upstream_test;
         proxy_set_header   Host             $host;
         proxy_set_header   X-Real-IP        $remote_addr;
         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    
     }
    

    Для более конкретной настройки nginx, пожалуйста, обратитесь к:GitHub.com/супер HJ1987…

  2. TCP - ngx_tcp_proxy_module

     tcp {
    
         upstream cluster {
    
             # simple round-robin
    
             server 192.168.0.1:8080;
    
             server 192.168.0.2:8080;
    
    
    
             check interval=3000 rise=2 fall=5 timeout=1000;
    
    
    
             #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
    
    
    
             #check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    
             #check_http_send "GET / HTTP/1.0\r\n\r\n";
    
             #check_http_expect_alive http_2xx http_3xx;
    
         }
    
    
    
         server {
    
             listen 8888;
    
             proxy_pass cluster;
    
         }
    
     }
    

Три динамической балансировки нагрузки

3.1 Самоконтроль

Встроенная функция проверки работоспособности внутренних серверов. Если сервер на бэкенде прокси-сервера Nginx выйдет из строя, запрос, который вернет ошибку, будет повторно отправлен на другой узел, что не повлияет на внешний доступ. Он не имеет независимого модуля проверки работоспособности, но использует бизнес-запросы в качестве проверки работоспособности, что сохраняет независимый поток проверки работоспособности, что является преимуществом. Недостатком является то, что при сложном бизнесе может возникнуть неправильное суждение, например, тайм-аут ответа бэкэнда, который может быть простоем бэкэнда, или может возникнуть проблема с самим бизнес-запросом, который не имеет ничего общего с бэкэндом.

3.2 Масштабируемость

Nginx представляет собой типичный дизайн микроядра, его ядро ​​очень простое и элегантное, и оно обладает очень высокой масштабируемостью. Как показано ниже:

Nginx — это чистая реализация языка C, и его расширяемость заключается в его модульной конструкции. На данный момент в Nginx уже есть множество сторонних модулей, которые значительно расширяют его функции. nginx_lua_module может встраивать язык Lua в конфигурацию Nginx, так что использование Lua значительно расширяет возможности программирования самого Nginx, и даже без других языков сценариев (таких как PHP или Python и т. д.) реализовать может только сам Nginx комплексная обработка бизнеса.

3.3 Изменение конфигурации

Архитектура конфигурации nginx показана на следующем рисунке:

Nginx поддерживает горячее развертывание и может работать почти 24/7 без перезапуска, даже если он работает в течение нескольких месяцев. Версия программного обеспечения может быть обновлена ​​при условии бесперебойной работы. Файл конфигурации Nginx очень прост, стиль так же прост для понимания, как и программа, и он может поддерживать синтаксис Perl. Используйте nginx –s reload для загрузки файлов конфигурации во время выполнения, что удобно для увеличения/уменьшения емкости во время выполнения. При перезагрузке конфигурации главный процесс отправляет команду текущему рабочему процессу, после получения которой рабочий процесс завершает работу после выполнения текущей задачи. В то же время главный процесс запустит новый рабочий процесс, который возьмет на себя работу.

Четыре преимущества и недостатки

4.1 Преимущества

  1. Может хорошо обрабатывать заголовки http
  2. Хорошая поддержка протокола http, а также https
  3. Достаточно сторонних плагинов для использования
  4. Поддержка горячего развертывания, плавная смена серверной части

4.2 Недостатки

  1. Отсутствие поддержки сеанса
  2. Поддержка четырехуровневого tcp недостаточно хороша.
  3. отправить запрос на запись в файловую систему, что приводит к ошибке 500
  4. Отсутствие активного мониторинга работоспособности внутреннего сервера
  5. Статистика интерфейса мониторинга по умолчанию неполная.

Пять тенгин

Tengine — это серверное программное обеспечение, разработанное Taobao на основе открытого исходного кода nginx, которое помимо наследования характеристик nginx предоставляет некоторые функции, доступные только в коммерческой версии nginx. В основном синхронизировано с обновлением nginx, последняя версия унаследовала стабильную версию nginx 1.6.2.

5.1 Особенности

Особенности тенгине включают, но не ограничиваются:

  1. Более удобный дисплей информации об эксплуатации и техническом обслуживании
  2. Механизм загрузки динамических модулей
  3. Автоматически устанавливать количество процессов и привязывать привязку ЦП в соответствии с количеством ЦП
  4. Более удобные параметры командной строки, такие как вывод списка скомпилированных модулей, поддерживаемых директив и т. д.
  5. Более мощные возможности балансировки нагрузки, включая согласованные хэш-модули и модули сохранения сеансов, также могут выполнять активные проверки работоспособности на внутренних серверах и автоматически подключаться к сети и отключаться в зависимости от состояния сервера.
  6. Поддержка динамического языка сценариев Lua. Функция расширения очень эффективна и проста
  7. Поддержка механизма входного фильтра. С помощью этого механизма брандмауэр веб-приложений писать удобнее.

5.2 Балансировка нагрузки

С точки зрения балансировки нагрузки, Tengine в основном имеет следующие характеристики, которые в основном компенсируют отсутствие nginx в балансировке нагрузки:

  1. Поддержка согласованного хеш-модуля
  2. модуль сохранения сеанса
  3. Проактивные проверки работоспособности на внутренних серверах.
  4. Добавлен механизм, позволяющий не кэшировать тело запроса на диск.