Як я можу розгорнути масштабований надійний кластер haproxy на Amazon EC2?


25

Нам потрібна дещо вдосконалена функціональність, ніж надає ELB (в основному огляд L7), але не очевидно, як поводитися з такими речами, як серцебиття та висока доступність, як-то на зразок гапрокси, використовуючи EC2. Існує велика ймовірність, що нам знадобиться 3 або більше хапрокси-вузлів у кластері, тому просте серцебиття між двома вузлами не працюватиме.

Здається, що шаром серцебиття перед гапрокси-вузлами було б шляхом, можливо, використовуючи IPVS, але обробка змін конфігурації змінюється як кластер EC2 (або через навмисні зміни, як розширення, або ненавмисне, як втрата Вузол EC2) здається нетривіальним.

Переважно розчин охоплює щонайменше дві зони доступності.

У відповідь на питання: ні, сеанси не липкі. І так, нам знадобиться SSL, але теоретично це може вирішуватися іншим налаштуванням цілком - ми можемо направляти SSL-трафік в інше місце, ніж не-SSL-трафік.


Я досліджую, як робити канаркові розгортання з повільно зростаючим відсотком трафіку, переходячи до нової версії програмного забезпечення, і мені дуже цікаво, де ви опинилися з цим. Чи закінчили ви спробувати будь-яку із пропозицій Джеспера?
Iain

Відповіді:


14

Гаразд, я ніколи не будував рішення для врівноваження навантаження AWS з трафіком на рівнях SmugMug, але просто думаючи про теорію та послуги AWS, приходить на думку кілька ідей.

У початковому запитанні відсутні кілька речей, які, як правило, впливають на конструкцію балансування навантаження:

  1. Клейкі сеанси чи ні? Дуже бажано не використовувати клейкий сеанс, а просто дозволити всім балансирам навантажень (LB) використовувати круговий запуск (RR) або випадковий вибір. Вибір RR або випадкових резервних копій простий, масштабований і забезпечує рівномірний розподіл навантаження за будь-яких обставин.
  2. SSL чи ні? Використовується чи ні SSL та над яким відсотком запитів, як правило, впливає на конструкцію балансування навантаження. Часто бажано припинити SSL якомога раніше, щоб спростити обробку сертифікатів і не допустити завантаження процесора SSL від серверів веб-додатків.

Я відповідаю з точки зору того, як підтримувати рівень шару балансування навантаження високодоступним. Збереження серверів додатків HA просто робиться за допомогою перевірок здоров’я, вбудованих у ваші балансири навантаження L7.

Добре, кілька ідей, які повинні працювати:

1) "Шлях AWS":

  • Перший шар, на самому фронті, використовує ELB в режимі L4 (TCP / IP).
  • Другий рівень, використовуйте екземпляри EC2 з вашим балансиром навантаження L7 (Nginx, HAProxy, Apache тощо).

Переваги / ідея: балансири навантаження L7 можуть бути досить простими ECI AMI, усі вони клоновані з одного AMI та використовують ту саму конфігурацію. Таким чином, інструменти Amazon справляються з усіма потребами HA: ELB контролює балансири навантаження L7. Якщо L7 LB вмирає або стає невідповідним, ELB & Cloudwatch разом нерестово створюють новий екземпляр і вносять його в пул ELB.

2) "Кругла робота DNS з моніторинговим способом:"

  • Використовуйте базовий круглень DNS для отримання грубозернистого розподілу навантаження на пару IP-адрес. Скажімо, ви публікуєте 3 IP-адреси свого сайту.
  • Кожен з цих 3 IP-адрес - це AWS-еластична IP-адреса (EIA), пов'язана з екземпляром EC2, з балансором навантаження L7 на ваш вибір.
  • Якщо EC2 L7 LB помирає, сумісний користувальницький агент (браузер) повинен просто використовувати один з інших IP-адрес замість цього.
  • Налаштування зовнішнього сервера моніторингу. Контролюйте кожен із 3 ЕІП. Якщо хтось не реагує, використовуйте інструменти командного рядка AWS та деякі сценарії для переміщення EIP до іншого екземпляра EC2.

Переваги / ідея: Сумісні користувацькі агенти повинні автоматично переходити на іншу IP-адресу, якщо хтось не відповідає. Таким чином, у разі відмови лише одна третина ваших користувачів має бути порушена, і більшість із них нічого не повинні помітити, оскільки їх UA мовчки переходить на інший IP. І ваше зовнішнє вікно моніторингу помітить, що EIP не відповідає, і виправить ситуацію протягом декількох хвилин.

3) DNS RR до пар серверів HA:

В основному це власне припущення Дона про просто серцебиття між парою серверів, але спрощене для декількох IP-адрес.

  • Використовуючи DNS RR, опублікуйте ряд IP-адрес для послуги. Слідуючи наведеному вище прикладу, скажімо, що ви публікуєте 3 IP-адреси.
  • Кожен із цих IP-адрес надходить на пару серверів EC2, тож загалом 6 екземплярів EC2.
  • Кожна з цих пар використовує Heartbeat або інше рішення HA разом з інструментами AWS, щоб підтримувати 1 IP-адресу в прямому ефірі в активній / пасивній конфігурації.
  • У кожному екземплярі EC2 встановлено ваш балансир навантаження L7 на вибір.

Переваги / ідея: У повністю віртуалізованому середовищі AWS міркувати про послуги L4 та режими переходу з режиму відключення насправді не так просто. Спростивши до однієї пари однакових серверів, підтримуючи лише 1 IP-адресу, стає простішим міркувати та перевіряти.

Висновок: Знову ж таки, я насправді нічого не пробував у виробництві. Щойно з мого відчуття кишечника, варіант один із ELB у режимі L4 та екземпляри EC2, що керуються самоврядуваннями, як LB LB, здається, найбільше узгоджуються з духом платформи AWS, і де Amazon, швидше за все, інвестує та розширюватиметься згодом. Це, мабуть, мій перший вибір.


1
Тож я люблю підхід №1, саме в цьому напрямку я схилявся, але все ж є цікаві моменти - не останнє з яких полягає в тому, що ELB не дуже добре справляється з цілим AZ (те, що у нас вже відбулося ). Легке, але похмуре, «рішення» полягає в тому, щоб хапрокси за ELB були налаштовані на перетин AZ (можливо, із резервним кластером в іншому AZ), тож якщо в кожному AZ принаймні один гапрокси є, ми маємо добре. Але це лише імітує, а не усуває проблему. Якісь ідеї навколо цієї проблеми?
Дон Макаскілл

@Don MacAskill: Я знаю, що в AWS було кілька масштабних простоїв у сервісному обслуговуванні, але зробити кращу, ніж надійність AZ на AWS, важко. Перехід до багатофункціональної роботи фронтенду легко може стати першим кроком до багатоазіатської роботи всієї стеки, і це цілий чайник змій ...
Jesper M

@Don MacAskill: Одним із варіантів буде геоінформаційна роздільна здатність DNS, як-от DynDNS Dynect -> ELB + L7 LB всередині одного AZ, а інший ELB + L7 в гарячому режимі очікування в іншому AZ. (Крім того, що геоінформований, Dynect також має деякі перевірки стану здоров’я.) DynDNS має чудовий досвід роботи в режимі безперервного часу, але навіть так, додавання геоінформованих DNS є ще одним SPOF. Чи краще для Dynect + врівноваження навантаження в 2 АЗ є довготривалим режимом роботи, ніж лише один AWS AZ, мені не ясно. Дивіться це, щоб отримати огляд того, що я маю на увазі, чи не базується
Jesper M

@Don MacAskill: Ще одне останнє - пам’ятайте, що один екземпляр ELB може охоплювати кілька AZ. Він не може охоплювати регіони EC2 . Але якщо прийнятне використання ELB для L7 LB у двох АЗ в межах одного регіону є прийнятним, це було б, безумовно, найпростішим ... Ви писали: "ELB не справляється з цілим AZ не дуже добре", можливо, ви вже знаєте більше Я згоден.
Jesper M

Так, якщо ELB охоплює декілька AZ і має певний збій, коли він не може потрапити до жодного із задніх вузлів в AZ (вони перевантажені, вниз, повертаються 503s, що завгодно), кінцеві користувачі бачать ці помилки - це не означає " t повторний маршрут до інших AZ. Я сподіваюся, що це заплановано, але це вже вкусило нас один раз.
Дон Макаскілл

2

Якщо ви не робите клейких сеансів або використовуєте стиль tomcat / apache (додайте ідентифікатор вузла до sessionid, на відміну від зберігання стану в LB), тоді я б використовував ELB перед групою гапроксі. ELB має вбудовану перевірку здоров'я, тож ви зможете відстежувати хапроксі та виносити будь-які з пулу з басейну. Багато менше, ніж налаштувати, ніж відмовити серцебиття.

Щодо поширення змін, я не маю великої відповіді. Лялька чудово підходить для початкової конфігурації та впровадження змін, але для додавання / видалення вузлів ви прагнете швидшої реакції, ніж 30-хвилинний інтервал опитування.


1
Це хороше рішення (і гарне запитання!) Ви можете використовувати SNS Amazon для поширення змін конфігурації. Вам потрібна система сповіщень для додавання / видалення вузлів з конфігурації haproxy.
Рафік Маньяр

Іншим варіантом керування серверними програмами (тими, на які пересилає haproxy) є кожен сервер резервного сервера надсилати періодичну реєстрацію (30 секунд або близько того) всі гапроксі, або сервер конфігурації. Якщо хтось помирає, він швидко стає незареєстрованим (і хапрокси все одно повинен помітити); якщо з'явиться новий, він автоматично вводиться в обертання. Мабуть, це робить Netflix.
Бен Дженкс

1

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


Так, лялька на EC2 робить управління кластером досить простим. Просто створіть мікропримірник і використовуйте це як ваш ляльковий майстер.
Том О'Коннор

1
У наших центрах обробки даних ми використовуємо лялькових, але ще не пробували EC2. Чи мається на увазі лялька EC2 якось таким, що він може знаходити вузли, використовуючи екземпляри ec2-опису чи щось подібне, і автоматично налаштовувати / переналаштовувати на основі цього висновку? А як би ви поводилися з тим, щоб ляльковиця раптово відходила?
Дон Макаскілл

Чому воно піде раптово?
Том О'Коннор

Це не відомо EC2, але ви можете налаштувати його так, що нові вузли будуть позначені для підписання під час їх запуску та використовувати зовнішній сценарій вузлів для їх опису. Я написав python, щоб це зробити за допомогою SimpleDB (зовнішні вузли) та SQS (черга запитів підпису нових вузлів); ubuntu Dev написав сценарії за допомогою S3: ubuntumathiaz.wordpress.com/2010/04/07/…
Бен Дженкс

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