docker 集群模式下服务副本之间的网络请求负载平衡
Load balancing of network requests between replicas of services in docker swarm mode
我找不到任何关于集群模式下 docker 服务副本之间负载平衡算法的文档。
我根据 Dockerfile 创建了一个镜像 mynodeapp
:
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 );
代码在 5 秒延迟后发送 All ok
。此外,它打印 Sending response
到控制台。
现在,我开始docker集群模式:
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
,另一次从另一个终端收到。所以它 似乎使用了循环法 负载平衡。
但什么是真正的负载均衡算法?
算法目前很简单round-robin。有人建议启用最快的预期响应时间算法,以解决请求路由到另一个 docker 主机的问题,服务也在本地 运行,但这尚未实现。
来自docker's swarm networking docs:
The swarm load balancer automatically routes the HTTP request to the
service’s VIP to an active task. It distributes subsequent requests to
other tasks using round-robin selection.
关于使用最快预期响应的评论来自一些 dockercon 2016 视频,我现在无法打开这些视频。
我找不到任何关于集群模式下 docker 服务副本之间负载平衡算法的文档。
我根据 Dockerfile 创建了一个镜像 mynodeapp
:
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 );
代码在 5 秒延迟后发送 All ok
。此外,它打印 Sending response
到控制台。
现在,我开始docker集群模式:
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
,另一次从另一个终端收到。所以它 似乎使用了循环法 负载平衡。
但什么是真正的负载均衡算法?
算法目前很简单round-robin。有人建议启用最快的预期响应时间算法,以解决请求路由到另一个 docker 主机的问题,服务也在本地 运行,但这尚未实现。
来自docker's swarm networking docs:
The swarm load balancer automatically routes the HTTP request to the service’s VIP to an active task. It distributes subsequent requests to other tasks using round-robin selection.
关于使用最快预期响应的评论来自一些 dockercon 2016 视频,我现在无法打开这些视频。