Почему мой балансировщик нагрузки не перенаправляет на доступный ec2, когда процессор равен 100%? - PullRequest
1 голос
/ 10 января 2020

Я запускаю свое приложение nodejs в aws ecs.

Я создаю в ecs кластер. в кластере запущена служба, которая запускает задачу. Внутри задачи у меня есть nginx (portMapping: 0:80 - динамический c порт для ALB) и nodejs изображения.

Файлы Docker просты (ничего особенного):

dockerfile nginx:

FROM nginx:latest

WORKDIR /

RUN echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list

RUN apt-get -y update && \
    apt-get -y install apt-utils && \
    apt-get -y upgrade && \
    apt-get -y install nano && \
    apt-get -y clean

COPY ./nginx/nginx.conf  /etc/nginx/nginx.conf

Dockerfile nodejs приложение:

FROM node:latest

WORKDIR /usr/src/app

COPY ./package.json .

COPY ./app-prod-www.js .

RUN npm install

EXPOSE 3000

CMD [ "npm", "start" ]

и nginx .conf:

user  nginx;                                                                    

worker_processes 4;

events { worker_connections 1024; }

error_log  /var/log/nginx/error.log warn;                                       
pid        /var/run/nginx.pid;                                                  

http {                                                                          
    include       /etc/nginx/mime.types;                                        
    default_type  application/octet-stream;                                     

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   
                      '$status $body_bytes_sent "$http_referer" '               
                      '"$http_user_agent" "$http_x_forwarded_for"';             

    access_log  /var/log/nginx/access.log  main;                                

    sendfile        on;                                                         
    #tcp_nopush     on;                                                         

    keepalive_timeout  65;                                                      

    #gzip  on;                                                                  

    # include /etc/nginx/conf.d/*.conf;                                           
    # include /etc/nginx/sites-available/*.conf;                                           

    upstream prodwww {   
        least_conn;                                                                                  
        server prod-www:3000 weight=10 max_fails=3 fail_timeout=30s;
    }

    server {                                                                                                  
        listen       80;                                                                                      

        location / {                                                                                         
            proxy_pass http://prodwww;                                                                     
            proxy_http_version 1.1;                                                                          
            proxy_set_header Upgrade $http_upgrade;                                                          
            proxy_set_header Connection 'upgrade';                                                           
            proxy_set_header Host $host;                                                                     
            proxy_cache_bypass $http_upgrade;                                                                
        }                                                                                                      
    }                                                                                                         
}

Кластер имеет два экземпляра ec2.

Служба выполняет 4 задачи.

Я установил ALB, который должен перенаправить трафик c к этим экземплярам ec2.

Но когда у меня 100% ЦП в одном из контейнеров, ALB не перенаправляет трафик c на свободный компьютер ec2.

Я пишу код Фибоначчи, когда я получаю доступ к / тестовый маршрут. это приведет к 100% процессору. и приложение nodejs не может получать запросы до тех пор, пока оно не будет завершено (а Фибоначчи (100) займет много времени).

Так что после доступа к маршруту /test я вижу, что это занимает много времени завершить. тем временем я открываю новую вкладку в браузере и пытаюсь получить доступ к маршруту root (/), который должен обслуживать текст App Prod WWW.

Но я вижу, что он не отвечает. что означает, что ALB все еще перенаправляет меня на этот nodejs экземпляр приложения.

Почему это так? Если я пропущу информацию здесь, пожалуйста, дайте мне знать, и я обновлю свой вопрос.

Вот мое заявление:

const express = require('express');
const app = express();
const port = 3000;

console.log('app prod www nodejs started');

app.get('/', (req, res) => res.send(`App Prod WWW! ${process.pid}/${process.env.NAME}`));

app.get('/test', (req, res) => {
  console.log('in test');
  function fibonacci(n) {
    return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
  }

  const x = fibonacci(100);
  console.log('after x');
  res.json({ x });
});

app.get('/api', (req, res) => {
  console.log('in api');
  res.json({ ok: true });
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

1 Ответ

4 голосов
/ 10 января 2020

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

Балансировщик нагрузки не отслеживает использование ЦП целевыми объектами. До тех пор, пока периодические c проверки работоспособности для целевого экземпляра не будут выполнены, цель будет продолжать получать запросы.

...