Балансировка нагрузки сетевых запросов между репликами сервисов в режиме docker swarm

Я не могу найти никаких документов по используемому алгоритму балансировки нагрузки между репликами службы докера в режиме роя.

Я создал образ mynodeapp на основе Dockerfile:

FROM node:latest                                                                                                                                                                        
RUN mkdir -p /usr/src/app                                                                                                                                                               
WORKDIR /usr/src/app                                                                                                                                                                    
COPY package.json /usr/src/app/                                                                                                                                                         
RUN npm install                                                                                                                                                                         
COPY . /usr/src/app                                                                                                                                                                     
EXPOSE 8080                                                                                                                                                                             
CMD [ "npm", "start" ]      

npm запускает следующее server.js:

const LATENCY = 5000;
var app = require('express')();

app.get('/', (req,res)=>{
        console.log('Sending response');
        setTimeout( function() {
                res.send('All ok');
        }, LATENCY );
});
app.listen( 8080 );

Код просто отправляет All ok после 5-секундной задержки. Кроме того, он выводит Sending response на консоль.

Теперь я запускаю режим роя докеров:

docker swarm init --advertise-addr:eth0

и запускаем сервис с двумя репликами:

docker service create mynodeapp --replicas 2 --publish 8080:8080

Результат

root@man1:~# docker service ls
ID            NAME             REPLICAS  IMAGE      COMMAND
233z44bz6sx0  amazing_hypatia  2/2       mynodeapp  



root@man1:~# docker ps
CONTAINER ID        PORTS               NAMES
1f36e0c9eb37        8080/tcp         amazing_hypatia.1.453u2upnyf2nvtwxouopv4olk

f0fb099a5154        8080/tcp            amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g

Теперь я открываю два терминала и смотрю логи обоих контейнеров:

 docker logs amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g -f

а также

docker logs  amazing_hypatia.2.8lbs461uhiv2qvh28433ayi0g -f

Когда я бегу

curl localhost:8080

Я получаю Sending response один раз с одного терминала и другой раз с другого терминала. Таким образом, похоже, что используется циклическая балансировка нагрузки.

Но что такое настоящий алгоритм балансировки нагрузки?


person rlib    schedule 13.01.2017    source источник


Ответы (1)


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


Из документации Docker по сети Swarm:

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

Комментарии об использовании самого быстрого ожидаемого ответа взяты из некоторых видео с dockercon 2016, которые я не могу сейчас открыть.

person BMitch    schedule 13.01.2017
comment
Можете ли вы предоставить несколько ссылок, подтверждающих ваш ответ? Я просто не могу найти ни одного источника, обсуждающего этот вопрос. - person rlib; 13.01.2017
comment
Обновлено ссылкой и цитатой из документации докеров по этому поводу. - person BMitch; 13.01.2017