чому немає прикладів горизонтально масштабованих програмних балансирів навантаження, що врівноважують ssl?


9

У мене є маса запитань щодо ssl, локальних сеансів та балансування навантаження, які, здається, пов'язані між собою, тому я заздалегідь вибачаюся за тривалість цього питання.

У мене є веб-сайт, який використовує файлові сеанси. Природа сайту полягає в тому, що більшість з них є http, але деякі розділи - ssl. Наразі через сеанси на основі файлів необхідно, щоб будь-які запити ssl потрапляли на той же сервер, що і будь-які попередні http-запити.

Через часові обмеження, я хочу зробити найпростішу можливу річ, щоб завантажити баланс збільшеного http та ssl трафіку.

Здається, є два варіанти алгоритмів балансування навантажень:

  • на основі ip
  • на основі печива

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

Алгоритм на основі файлів cookie здається кращим, але неможливість перевірити файл cookie при шифруванні ssl, здавалося б, представляє власні проблеми.

Я гуглив приклади того, як завантажувати баланс ssl, і я не можу знайти явних прикладів налаштувань, які можуть робити балансування завантаження на основі файлів cookie.

Більшість ясних прикладів, які я бачив, мають декодер ssl (зазвичай апаратний, apache_mod_ssl або nginx), що сидить між клієнтом браузера та балансиром завантаження. Приклади, як правило, мають щось подібне (змінено з http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):

      192.168.1.1 192.168.1.11-192.168.1.14
 ------- + ----------- + ----- + ----- + ----- +
        | | | | |       
     + - + - + + - + - + + - + - + + - + - + + - + - +    
     | LB1 | | А | | Б | | C | | Д |    
     + ----- + + --- + + --- + + --- + + --- +    
     apache 4 дешевих веб-серверів
     mod_ssl
     гапрокси 

Частина декодування ssl у наведеному вище прикладі здається потенційним вузьким місцем, яке не горизонтально масштабується.

Я переглянув haproxy, і, здається, є опція 'mode tcp', яка дозволила б щось подібне, що дозволило б мати кілька декодерів ssl:

              гапрокси
                 |
            -------------
            | |
ssl-декодер-1 ssl-декодер2
            | |
        -------------------
        | | |  
      web1 web2 web3

Однак у такому налаштуванні, схоже, ви втратите клієнтський ip, оскільки haproxy не декодує ssl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -для

Я також переглянув nginx, і також не бачу явних прикладів горизонтально масштабованих ssl-декодерів. Здається, є багато прикладів людей, які мають nginx як потенційне вузьке місце. І, принаймні, це посилання, начебто, говорить про те, що nginx навіть не має можливості установки, подібної до гапрокси, де ви втратите ip, сказавши, що nginx "не підтримує прозоро передачу TCP-з'єднань до бекенду" Як передати Apache SSL трафік через nginx проксі? .

Запитання:

  • Чому, здається, не буде більше прикладів налаштувань, що додають більше декодерів ssl для боротьби зі збільшенням трафіку?
  • Це тому, що крок декодування ssl є лише теоретичним вузьким місцем, і практично кажучи, одного декодера по суті буде достатньо, за винятком сайтів зі смішним трафіком?
  • Іншим можливим рішенням, яке спадає на думку, можливо, хтось із такими підвищеними потребами ssl також має централізований сесійний магазин, тому не має значення, який веб-сервер клієнт звертається за послідовними запитами. Тоді ви можете включити mod_ssl або еквівалент на кожному веб-сервері.
  • Згадане вище рішення haproxy, здається, працює (окрім проблеми з клієнтською IP-адресою), але хто-небудь стикався з клейким рішенням, що базується на завантаженні програмного забезпечення на основі файлів cookie, яке би працювало, збільшуючи кількість декодерів, зберігаючи IP-адресу клієнта, або це, можливо, технічно не можливо (оскільки вам потрібно розшифрувати запит, щоб отримати клієнтський IP, і в цьому випадку у нас є вузьке місце декодера).

Якщо припустити, що все, що я сказав, є правдою, це, здається, є моїми варіантами:

  • використовувати хеш-версію ip (погано для користувачів, які потенційно легітимно змінюють ips, а також для сценаріїв додавання та видалення серверів)
  • використовувати nginx або mod_ssl як першу програму, що торкається запиту ssl, це буде потенційним вузьким місцем декодування ssl
  • використовуйте haproxy як першу програму, що торкається запиту ssl, отримуючи горизонтальну масштабованість ssl, але живіть без ips, що заносяться на рівні веб-сервера для запитів ssl (можливо, тимчасово в порядку)
  • у довгостроковій перспективі рухайтеся до мобільного або централізованого магазину сесій, роблячи липкі сесії непотрібними

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

Відповіді:


8

"Найпростіша річ", з усією серйозністю, - це переїзд до централізованого магазину сесій. Вам доведеться налаштувати всю цю сантехніку з балансирами навантаження, haproxy, SSL та всім іншим, коли кожен шматочок коду обробки сеансу, який я коли-небудь бачив, змушує підключати різні двигуни зберігання майже тривіально. трохи коду і дуже, дуже мало зайвої складності вирішує всі ваші проблеми.


8

Жіноча справа в спільному магазині сесій, що робить речі набагато простішими навколо. На додаток до його відповіді, я можу трохи розширити навантаження, що врівноважує частини запитання:

Чому, здається, не буде більше прикладів налаштувань, що додають більше декодерів ssl для боротьби зі збільшенням трафіку?

Сучасні багатоядерні ПК можуть робити кілька тисяч транзакцій SSL в секунду. І якщо це стане вузьким місцем, то спеціалізований прилад від F5 , Citrix, Cisco тощо може бути ще швидшим. Таким чином, більшість сайтів ніколи не переростають хорошим рішенням для врівноваження SSL та навантаження на один пристрій.

Якщо припустити, що все, що я сказав, є правдою, це, здається, є моїми варіантами:

Існують варіанти масштабування розшифровки SSL по горизонталі, якщо вам це знадобиться.

Загальний підхід полягає у використанні DNS Round Robin для високо доступних пар прискорювачів SSL, тобто публікації декількох IP-адрес для домену, кожна IP-адреса вказує на пару прискорювачів SSL.

У цьому випадку ви можете потурбуватися про вичерпання часу DNS TTL в середині користувальницького сеансу, натиснувши його на інший сервер додатків. Це не повинно бути звичайним явищем, але це може статися. Загальнодоступний магазин сеансів є загальним рішенням, але його можна обробляти іншими способами.

В якості одного прикладу ви можете відокремити розшифровку SSL від балансування сервера додатків. Обробка SSL більш інтенсивна в процесорі, ніж основне врівноваження навантаження, тому один балансир навантаження повинен мати можливість наситити пару прискорювачів SSL. Подобається це:

Internet --> DNS round robin to multiple SSL accelerators --> plain HTTP to a single HTTP load balancer --> plain HTTP to multiple application servers

Як згадувалося на початку, спільний сесійний магазин спрощує багато речей, і майже напевно є кращим довгостроковим рішенням, ніж додавання великої складності в ваш балансуючий шар SSL / завантаження.


+1 для круглої робіни DNS. Наприклад, для цього використовується еластичне врівноваження AWS.
Олексій

3

Приємно відповідати на такі питання на два роки, коли продукти еволюціонували. Зараз haproxy підтримує протокол PROXY, який дозволяє йому передавати IP-адресу клієнта наступному стрибку навіть у чистому режимі TCP. Він також підтримує вбудований SSL, а також клейкість SSL, якщо ви хочете використовувати його в якості першого шару перед фермою SSL (можливо, зробленої з haproxy-серверів). Тож здається, що ваш запит був трохи раніше часу і що реалізація наздогнала :-)


1

Я погоджуюся з Умбелом та Джеспером тут. Найпростіший / найкращий маршрут - це виправити код. Звичайно, як у сисадмінів, у нас часто немає такого варіанту, але навіть у такому випадку є достатньо хитрощів, які ви можете виконати, щоб отримати порівняно дешеве сучасне обладнання для масштабування досить далеко, навіть не по-справжньому горизонтально.

Я просто хотів опублікувати, щоб прокоментувати, де ви стурбовані втратою клієнта-ip. У будь-яке з головних рішень L7 / проксі ви можете вставити в запит заголовок X-Forwarded-For (або що завгодно). Потім на сервері сервера, що отримує запит, ви можете змінити формат файлу журналу для того, щоб записати це значення у тому самому просторі у файлі, який він використовував для реєстрації клієнта слой 3 ip. Таким чином, будь-яке програмне забезпечення для розбору журналу не бачить різниці (як і у вас, коли йдеться про хвости).

Всьому є компроміси, і ми ще недостатньо чули про ваше налаштування, щоб знати, але з тріою, що не можеш помилитися, ha-proxy, nginx та лаком там, ймовірно, хороша ідея, щоб перемістити балансування вантажу. до інструменту проксі-шару. Це вирішить вашу проблему ssl, а також надасть вам безліч нових варіантів, таких як кешування, зміна вмісту та маніпулювання заголовком.


1

Деякі випадкові думки;)

Спочатку зніміть людину, яка вирішила використовувати дані сеансу на основі файлів. Немає можливості, щоб читання / запис даних з файлової системи буде швидше, ніж просто повернення до джерела, щоб витягнути потрібні вам дані. Йдеться про НАРОДНІЙ спосіб пройти.

Я особисто ніколи не бачив ситуації, коли зберігати дані на сеансі було краще, ніж просто перетягувати їх безпосередньо з бази даних за необхідності. При цьому я бачив, коли використання пам’ятної пам’яті або подібних стратегій кешування може допомогти масштабуванню сайту мільйонам користувачів, але це навіть не в тому ж парку балів, як використання сеансів.

По-друге, ви щойно знайшли причину номер один, щоб взагалі не використовувати сеанси: балансування завантаження. FYI - Клейкий не означає Застряга. Навіть із увімкненими сеансами Sticky, ви запускаєте цілком реальну можливість перенесення користувача на інший сервер посеред використання вашого додатка. Це станеться у найнепридатніший час. Липкий просто означає, що балансир навантаження намагатиметься відштовхнути користувача на сервер, на якому він почав, але це аж ніяк не гарантія.

Цей момент зазвичай призводить людей до зберігання сеансу назад у базі даних ... Я вважаю, що це повний провал . Щоб сеанс працював, його потрібно завантажувати та писати на кожний запит на сторінку. Коли вона зберігається в базі даних (необхідній для збалансованих серверів), для цього потрібні два запити сервера: перший для отримання даних, другий для запису будь-яких оновлень.

Несправність полягає в тому, що люди зазвичай використовують сеанси, тому їм не доведеться повертатися до бази даних, щоб витягувати такі речі, як ім’я користувачів ... Але якщо сторінка має запитувати базу даних, щоб завантажити сеанс, то ... ну, Ви повинні мати можливість бачити логічну проблему тут.

Тільки гірше з сеансами ... тому що процесор сторінки повинен записувати дані сеансу назад в базу даних в кінці життєвого циклу сторінки .. у випадку, якщо щось змінилося. Що означає замість одного запиту витягнути ім’я цього користувача, у вас з’являється два. Для кожного завантаження сторінки. Далі це означає серіалізацію та десеріалізацію даних, що мають власний вплив на продуктивність.

Моя думка: сеанс - це зло, і вам зазвичай краще без нього. Сайти з низьким трафіком, які працюють лише на одному веб-сервері, не потребують підвищення продуктивності; і сайти з високим трафіком, які працюють на веб-фермі, обмежені в масштабі завдяки цьому.


0

Замість того, щоб використовувати Haproxy на передній панелі, ви можете використовувати круговий DNS DNS для грубого балансування між декількома декодерами SSL, а потім передати його хапрокси для правильного балансування навантаження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.