docker多主机网络方案
本文探讨Docker多主机网络的性能。
在过去的博文里,我测试过 Docker的网络 。 MySQL服务器团队 提供了他们自己的结果,和我的观察是一致的。
本文里一系列的测试,想更多关注使用多主机的Docker网络。因为当我们搭建高可用(HA)环境(比如,使用Percona XtraDB Cluster)时,就会期望实例运行在不同的主机上。
本文测试的另一个原因是Docker最近发布了1.12版本,支持Swarm Mode。Swarm Mode本身很有意思——在这个版本里,Docker决定在编排部署领域更深入,从而和Kubernetes以及Apache Mesos竞争。我认为Swarm Mode还很粗糙(毕竟是第一个版本),但是我确信Docker会在接下来的几个版本里继续优化这个特性。
Swarm Mode还假定用户在不同的物理主机上运行服务,并且服务通过Docker的网络通信。我想了解在多主机上使用Docker网络时性能如何。
网络性能对于像Percona XtraDB Cluster 和MySQL Group Replication(刚刚发布了另一个 Lab版本 )这样的集群来说尤为重要。
在我的环境里,使用了两台物理服务器,之间通过10GB网络连接。这两台服务器各有56个核的Intel CPU。
Sysbench环境:数据在内存里,仅仅使用主键查找。网络测试中网络往返很严重,但是能够更清楚得看到对性能的影响。
如下是Docker网络的可选方案:
- 没有Docker容器(在下面的结果里标记成“direct”)
- Docker容器使用“host”网络(标记为“host”)
- Docker容器使用“bridge”网络,这里服务端口通过端口转发来暴露(标记为“bridge”)
- Docker容器使用“overlay”网络,客户端和服务器都在通过overlay网络连接的容器里启动(结果里标记为“overlay”)。对于“overlay”网络,可以使用第三方插件,使用不同的网络实现,最知名的是:
- Calico network https://github.com/projectcalico/calico-containers
- Weave network https://github.com/weaveworks/weave
对于多主机网络搭建,只有“overlay”(以及插件实现)可用。我使用“direct”,“host”和“bridge”作为参考以及比对,来衡量overlay实现的额外消耗。
我观察到的结果如下:
观察

- “Bridge”网络会增加额外消耗,大概12%,这和我之前的benchmark是一致的。但是我想知道这是Docker的额外消耗,还是Linux bridge网络实现的额外消耗。Docker应该使用的是我在《 在相同主机上使用Linux Network命名空间运行Percona XtraDB Cluster节点 》一文里讲述的搭建方式,我怀疑Linux网络命名空间和bridge也会带来额外消耗。需要更多的测试来验证这一点。
- 原生的“Overlay”Docker网络受性能问题困扰。我用ksoftirq在一个CPU内核使用100%时观察到了问题,并且看到了类似的报告。似乎Docker“overlay”里的网络中断并没有适当分布到多个CPU里。“direct”和“bridge”配置里没有这样的问题。我认为这是Docker“overlay”网络的问题(期望这个问题最终能够解决)。
- Weave网络结果非常糟糕。我看到了很多CPU分配给“weave”容器,因此我认为其实现有很严重的扩展性问题。
- Calico插件在多主机容器场景下性能最佳,甚至比“bridge-bridge”网络更好。
结论
如果你需要使用Docker“overlay”网络——如果想要部署多主机环境,或者使用Docker Swarm Mode,这是必须的——我推荐考虑使用Calico的Docker网络插件。原生的Docker“overlay”网络可以用来做原型设计或者快速测试,但是目前其在高端硬件上的性能有问题。
docker多主机网络方案的更多相关文章
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- Docker跨主机网络——overlay
前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...
- Docker系列04—跨主机网络方案(overlay/weave)
在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...
- Docker 跨主机网络 overlay(十六)
目录 一.跨主机网络概述 二.准备 overlay 环境 1.环境描述 2.创建 consul 3.修改 docker 配置文件 4.准备就绪 三.创建 overlay 网络 1.在 host1 中创 ...
- Docker多主机网络 OpenvSwitch
一.Open vSwitch Open vSwitch(以下简称为OVS),英文全称:OpenVirtual Switch,顾名思义,Open vSwitch就是开放虚拟交换.我们可以把他理解成 ...
- Docker 多主机网络总结(非常全)
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- Docker多主机网络
网络术语概念 二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发.它解决了局域网中网段 ...
- docker 跨主机网络:overlay 简介
简介 docker 在早前的时候没有考虑跨主机的容器通信,这个特性直到 docker 1.9 才出现.在此之前,如果希望位于不同主机的容器能够通信,一般有几种方法: 使用端口映射:直接把容器的服务端口 ...
- Docker 单主机网络
PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 当容器逐步向容器集群,容器云技术演进的时候,一个不得不面对的问题就是各 ...
随机推荐
- d指针在Qt上的应用及实现
Qt为了使其动态库最大程度上实现二进制兼容,引入了d指针的概念.那么为什么d指针能实现二进制兼容呢?为了回答这个问题,首先弄清楚什么是二进制兼容?所谓二进制兼容动态库,指的是一个在老版本库下运行的程序 ...
- JS 实现图片直接下载
< a href = "picName.jpg" id = pic1 onclick = "savepic();return false;" ...
- WCF学习心得----(三)服务承载
WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决.所以在这一章节中,有一个承 ...
- Android仿人人客户端(v5.7.1)——新鲜事之完整篇
转载请标明出处: http://blog.csdn.net/android_ls/article/details/9228083 声明:仿人人项目,所用所有图片资源都来源于其它Androi ...
- VS2012下基于Glut 矩阵变换示例程序2:
在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...
- [ios2]tableView去除空行的singleLine
http://www.winddisk.com/2013/03/29/tableview%E5%8E%BB%E9%99%A4%E7%A9%BA%E8%A1%8C%E7%9A%84singleline/ ...
- jq向webApi提交post json数据
在页面想webApi post json数据的时候,发现webapi不能直接以json的方式接受数据(注:我是没有发现一个很好的方式来post json数据的);但是可以以数据结构的方式传递: 如下: ...
- python_login输入三次错误密码锁定密码_密码不允许为空
#!/usr/bin/env python #_*_coding:utf-8_*_ #by anthor zhangxiaoyu 2017-01-10 import getpass import os ...
- BAE部署Django项目流程整理
1.首先在BAE上创建一个应用名称并付费2.把应用文件夹git到本地,此时文件夹会多出三个文件app.conf,favicon.ico,index.py3.在应用文件夹内创建本地项目:myblog,并 ...
- angularJS 自定义元素和属性
创造自定义元素和属性的方法是:directive('string',function(){ return{}; }); ①函数接收两个参数:一个字符串(指令的名字),一个函数: ②回调函数必须返回一个 ...