王 强 王瑞刚 周德永
目前,以虚拟化技术为基础的云计算领域正在火热的发展中,以Openstack为标志的Paas平台,为现代企业的生产实践提供稳定的基础设施平台,极大的节约成本,使人们感受到了云计算带来的便利[1]。Docker容器技术将作为云计算领域下一代的核心代表技术,Docker容器将软件与其依赖环境打包起来,以镜像方式交付,以容器方式运行,让软件运行在“标准环境”中,践行“构建一次,到处运行”的理念。这将给业界带来深远的影响,最终将形成容器的Caas标准。
Docker以其轻量灵活,易于迁移,资源利用率高的特点受到业界高度关注,越来越多企业将自己的传统应用迁移到Docker环境下(尤其电子商务应用系统)。同时,在进行业务扩展时(如京东6.18,淘宝双11等大型商务活动)系统面临的负载压力是空前巨大的。此时,正是发挥Docker轻量灵活、快速启动优势的时候,通过Docker容器的监控系统能够清楚的了解到当前系统的负载压力,快速通过弹性伸缩模块进行Docker容器系统扩容,迅速提升系统的处理能力,保证系统稳定运行,保障流畅的用户体验。当系统压力峰值过后,系统进行平缓的缩容,回收资源。通过Docker容器的弹性伸缩,既保证了系统的稳定,又充分利用了系统提供的现有资源。与传统通过虚拟机或物理服务器进行系统扩缩的方式相比,Docker系统弹性伸缩能够提供更好的用户体验,更快的系统扩展,更高的资源率。
Docker是2013年云计算领域的一个年轻的开源项目,是一种基于LXC的轻量级虚拟化技术,基于go语言开发,并遵循apache2.0的协议[2]。相比于传统的虚拟机,它以轻量,快捷,简单的明显特点赢得了开发者和运维者的青睐,在业界领域很快受到Google、RedHat,微软等知名公司的关注和技术支持。被普遍认为是下一代虚拟机。Docker技术能够受到如此欢迎,与它的技术架构息息相关。当前Docker技术采用的是传统的C/S的架构。Docker服务端以Docker Daemon的守护进程运行在宿主机上。随时响应本地或者远程客户端的请求。Docker的整体架构如图1所示。
图1 Docker架构
从图1可以看出,Docker daemon是Docker架构中的主要用户接口。首先,它提供了APIServer用来接收客户端的请求,其后根据不同的请求分发给不同的执行模块。在1.9版本之后,Docker通过对Docker daemon的解耦,将网络(Network)、数据卷(Volume)、镜像管理(Image),运行时环境(Runc)划分为独立模块,单独实现。当需要创建一个新的容器时,首先通过镜像管理模块从Docker Registry中下载,并通过存储驱动模块graphdriver将镜像文件存储在本地的文件系统中;当需要为容器创建网络时,network网络管理模块调用libnetwork来实现一个独立的网络环境;而libcontainer通过对cgroups和namespace的二次封装实现对Docker容器的资源隔离和限制,包括UTS,IPC,PID,Network,Mount,User等,提供相对安全且互相隔离的运行环境。
Docker容器是一种轻量级的虚拟化技术,虽然与传统虚拟机的实现原理不同,但二者实现的目的是相同的,都是实现对资源和系统环境的隔离[3]。Docker与虚拟机实现原理比较如图2所示。
图2 虚拟机与Docker实现原理
由图2比较可知,虚拟机的客户系统层和虚拟机管理程序层在Docker中被Docker Engine层所替代。虚拟机的客户系统即为虚拟机安装的操作系统,它是一个完整操作系统内核;虚拟机的虚拟化管理程序层可以简单理解为一个硬件虚拟化平台,它在宿主系统是以内核态的驱动形式存在的[4~5]。虚拟机实现资源隔离的方法是利用独立的操作系统,并利用虚拟化管理程序(Hypervisor)虚拟出CPU、内存、IO设备等实现的[6]。
对比虚拟机实现资源和环境隔离的方案,Docker就显得简练很多[7]。Docker Engine可以简单看成对Linux的NameSpace、Cgroup、镜像管理文件系统操作的封装[8]。Docker没有采用客户系统这种方式来实现环境隔离,而是以LXC为基础实现资源隔离与限制,即Docker利用namespace实现系统环境的隔离;利用cgroup实现资源限制;利用镜像实现根目录环境的隔离。通过Docker和虚拟机实现原理的比较,我们可以看到Docker的优势所在:
1)系统开销小,启动速度快,资源利用率高
由于Docker不需要虚拟化管理程序实现硬件资源虚拟化,运行在Docker容器中的程序直接使用的是实际物理机的硬件资源,共享底层操作系统,所以Docker容器的启动速度更快,可达到秒级启停,远快于虚拟机的分钟级启停;而且由于没有任何中间层资源的开销,在同等条件下可以运行更多的应用实例,可以充分地利用系统资源且性能接近物理机。
2)简单易用,快速部署
Docker容器以镜像为基础,快速部署运行服务,快速交付业务系统,明显缩短交付周期,方便开发运维的实施。
3)弹性伸缩
使用容器技术,当遇到高并发、高流量的大活动,容器做到根据业务的负载进行弹性扩容,以提供更好的服务。当访问量降低后,容器平台能够自动缩容,及时释放空闲资源。
4)服务高可用
Docker容器运行的业务通常由一组容器来提供服务,容器集群的管理平台可以保证恒定的应用容器副本数量。保证提供稳定可靠的服务。
传统的应用系统以物理机或虚拟机(VM)为底层的基础设施,当系统面临周期性或突发式业务高峰期时,要保证系统的稳定,服务的高可用,流畅的用户体验,传统的做法是对虚拟机或物理机做冗余备份,在业务高峰期时启用,提供服务,增强系统的处理能力;在业务量回归正常水平时,通过停机处理,回滚到系统正常的处理能力。这种传统的做法全程需要运维人员的手动操作,不仅周期时间长,而且经常出现难以预测的错误,极大地增加了运维成本;在Docker容器出现后,这种棘手的问题迎刃而解,由于Docker相比与虚拟机,在系统开销、启动速度上有明显的优势,而且也有非常好的资源隔离效果。所以通过对应用系统的Docker化迁移改造,采用微服务架构,将传统的单体应用拆分为具有原子性的更小粒度,以Docker容器作为运行微服务实例的载体。在系统面临突发式负载时,应用系统采用横向伸缩,快速启动多个业务容器,迅速提升系统的处理能力,保证应用系统的稳定、高可用以及流畅的用户体验。基于Docker容器实现的动态负载均衡弹性伸缩系统如图3所示。
图3 动态负载均衡弹性伸缩系统
由图3可知,本系统底层的Docker监控系统由Telegraf、Influxdb和Grafana组合实现。Telegraf作为最前端的数据采集工具,可以分布在不同的数据节点上,收集宿主机和应用容器的CPU、内存等资源使用量指标;Influxdb是一个时序数据库,将Telegraf采集的数据进行后端存储[9];Grafana是一个数据展示工具,通过配置数据源,读取存储在Influxdb中的数据并展示[10]。Etcd组件作为服务发现机制,提供当前系统可用的容器数量。Confd组件和Haproxy组件结合实现动态负载均衡,Confd是配置文件的动态生成工具。根据/etc/confd/conf.d/haproxy.toml和/etc/confd/templates/haproxy.cfg.tmpl文件会动态生成Haproxy的配置文件,并自动加载;Haproxy是一个C语言编写的应用程序代理软件,提供高可用和负载均衡服务,适用于大流量、高并发的web站点中[11],采用roundrobin负载均衡策略,根据每个server的权重进行轮训访问[12]。本系统的弹性伸缩模块主要由Docker.sh脚本文件实现,可以手动调用或自动调用。
在应用系统面临高并发、大流量的突发式请求时,监控系统会监测到应用容器的CPU、内存等资源使用量迅速上升,对应的策略就是通过设置告警阈值来触发弹性伸缩机制。以递增步长的节奏进行扩容;峰值过后,以固定步长的节奏进行缩容。由弹性伸缩模块启动或删除的应用容器,在Etcd中有对应的键值变化。Confd检测到这种变化后,就会动态生成Haproxy的配置文件并重新加载,之后就会将前端的用户请求分流到后端的应用容器上,提供具体的服务,实现应用系统的负载均衡。此动态负载均衡弹性伸缩系统依据应用容器的负载状态,来提供对应的处理能力,按需供给,在保证系统的稳定运行的前提下,将系统开销降低到最低。
1)应用容器资源限制
本次实验为了能够明显的看到docker容器的状态变化,在压力测试之前,可以对Docker容器进行资源限制,即创建固定资源的Docker容器,主要是对容器使用的cpu和内存进行限制,在启动Docker容器时修改—cpuser-cpus和—cpuset-mems参数。命令如下:
# docker run-dit--name--name test-webbench--cpuset-cpus 0-2--memory 128m-p 9999:80 tutum/lamp
2)模拟用户并发请求
webbench是linux环境下常用压力测试工具,可以设置在指定时间内完成对具体URL站点指定量的并发请求。-c参数表示客户端个数,-t参数表示持续时间,URL表示将要测试的站点。命令如下:
#webbench-c 5000-t 60 http://10.10.10.17:9999/
3)对应用容器CPU、内存、网络的监控
图4 Docker监控系统
由图6可以看出,当模拟大量用户请求时,应用容器的CPU、内存使用量急剧上升,网络流量增加。
4)配置动态负载均衡
(1)启动Etcd服务:
etcd--listen-peer-urls ‘http://127.0.0.1:2380’--advertise-client-urls ‘http://127.0.0.1:2379’--listen-client-urls ‘http://127.0.0.1:2379’-data-dir/data/default.etcd-name etcd1&
(2)安装haproxy:
apt-get install haproxy
(3)启动confd服务:
confd-interval 10-node http://127.0.0.1:2379
创建haproxy的模板,自动生成haproxy的配置文件
vim/etc/confd/conf.d/haproxy.toml
[template]
src=“haproxy.cfg.tmpl”#模板文件,基于它进行修改
dest=“/etc/haproxy/haproxy.cfg”#haproxy的默认配置路径
keys=[“/app/servers”,]#keys是在Etcd上订阅信息的前缀
reload_cmd=“/etc/init.d/haproxy reload”#更新配置后重启haproxy
vim/etc/confd/templates/haproxy.cfg.tmpl
listen web poll#listen部分:
bind 10.10.10.17:9999
mode http
balance roundrobin
option httplog
default_backend bk_web
backend bk_web#backend后端部分:
mode http
balance roundrobin
{{rang gets“/app/servers/*”}}
server{{base.Key}}{{.Value}}check inter 5000 fall 1 rise 2 weight 10{{end}}
backend bk_web static
mode http
balance roundrobin
server web1 10.10.10.17:80
listen status 10.10.10.17:9998#haproxy自带的监控
stats enable
stats uri/stats
stats auth admin:123456
stats realm(Haproxystatistic)
5)调用弹性伸缩模块
图5 弹性伸缩
当调用Docker.sh脚本进行扩容时,创建的容器信息以key/Value键值对存储在Etcd中做服务发现。当Confd检测到应用容器的数量有变化时,就会更新haproxy的配文件。
图6 confd生成的haproxy配置
6)动态负载均衡测试效果
当不断刷新用户请求时,Haproxy采用轮询机制,将请求分发到后端的server容器上。
图7 负载均衡测试(1)
图8 负载均衡测试(2)
图9 负载均衡测试(3)
通过Docker容器和传统虚拟机的比较,发现Docker容器启动速度快、系统开销小的特点非常适合用在集群弹性伸缩的场景中,替换虚拟机的笨重操作。本文通过Etcd、Confd和Haproxy组件,基于Docker容器构建的动态负载均衡弹性伸缩系统,既发挥了Docker容器的优势,也保证了系统的稳定、可靠运行。实验结果表明,当系统面临突发式请求时,系统通过响应式伸缩,实现负载均衡。基于Docker监控数据进行预处理分析,实施预测式弹性伸缩,实现智能运维,将是今后的研究方向之一。
[1]王晓琳.云计算理论及应用研究[J].硅谷,2012(9):24-25.
WANGXiaolin.Theory and application of cloud computing[J].Silicon Valley,2012(9):24-25.
[2]陈清金,陈存香,张岩.Docker技术实现分析[J].信息通信技术,2015,9(2):37-40.
CHEN QinJin,CHEN CunXiang,ZHANG Yan.Docker technology analysis[J].Information and Communications Technolog,2015,9(2):37-40.
[3]林沐.容延容断网络验证平台的设计与实现[D].成都:电子科技大学,2015:22-24.
LIN Mu.RongYan DTN network verification platform design and implementation[D].Chengdu:University of electronic science and technology,2015:22-24.
[4]严金瑶.基于虚拟化技术的云计算框架设计研究[D].南京:南京邮电大学,2013:15-17.
YAN Jinyao.Research on Cloud Computing Framework Design Based on Virtualization Technology[D].Nanjing:Nanjing university of posts and telecommunications,2013:15-17.
[5]俞烈彬,陈学兵.系统虚拟化技术研究[J].电子世界,2013(12):8-9.
YU Liebin,CHEN Xuebing.System Virtualization Technology Research[J].Electronics World,2013(12):8-9.
[6]林昆.基于Intel VT-d技术的虚拟机安全隔离研究[D].上海:上海交通大学,2011:11-13.
LIN Kun.Research on Virtual Isolation Based on Intel VT-d Technology[M].Shanghai:Shanghai Jiaotong University,2011:11-13.
[7]刘思尧,李强,李斌.基于Docker技术的容器隔离性研究[J].软件,2015(4):110-113.
LIU Siyao,LI Qiang,LI Bin.Study on container isolation based on Docker technology[J].Software,2015(4):110-113.
[8]shieh.大 数 据 平 台 Docker应 用 之 路[EB/OL].[2017-02-09].http://blog.csdn.net/xgjianstart/article/details/54943531.
shieh.Large data platform Docker application of the road[EB/OL].[2017-02-09].http://blog.csdn.net/xgjianstart/article/details/54943531.
[9]殷佳欣,陈驰.集群数据库系统多指标动态负载均衡方法的设计与实现[J].中国科学院研究生院学报,2012,29(1):94-100.
YIN Jiaxin,CHEN Chi.Design and Implementation of Multi-index Dynamic Load Balancing Method for Cluster Database System[J].Journal of the Graduate School of the Chinese Academy of Sciences,2012,29(1):94-100.
[10]李宗花,张磊.基于XML Schema的轻量级异构数据集成方法[J].计算机与现代化,2015(11):93-98.
LI Zonghua,ZHANGLei.Lightweight heterogeneous data integration method based on XML Schema[J].Computer and Modernization,2015(11):93-98.
[11]杨昌,王松,田林.基于HAProxy的负载均衡选课系统应用研究[J].楚雄师范学院学报,2013,28(6):22-28.
YANG Chang,WANG Song,TIAN Lin.Application of HAProxy-based Load Balancing Course Selection System[J].Journal of Chuxiong Teachers College,2013,28(6):22-28.
[12]刘胜楠,汪诗林.虚拟环境下Web服务动态负载均衡策略改进[J].计算机工程与科学,2015,37(9):1607-1613.
LIU Shengnan,WANG Shilin.Improvement of Web Ser-vice Dynamic Load Balancing Strategy in Virtual Environment[J].Computer Engineering and Science,2015,37(9):1607-1613.
[13]郑玲,江萌.基于Docker弹性调度架构的研究[J].电脑编程技巧与维护,2016(23):15-17.
ZHENG Ling,JIANG Meng.Based on the research of elastic scheduling architecture Docker Computer Programming Skills&Maintenance,2016(23):15-17.
[14]刘熙,胡志勇.基于Docker容器的Web集群设计与实现[J].电子设计工程,2016,24(8):117-119.
LIU Xi,HU Zhiyong.Design and implementation of Web cluster based on Docker container[J].Electronic Design Engineering,2016,24(8):117-119.
[15]张宁溪,朱晓民.基于Docker、Swarm、Consul与Nginx构建高可用和可扩展Web服务框架的方法[J].电信技术,2016(11):21-25.
ZHANG Ningxi,ZhU Xiaomin.Method for constructing high availability and extensible Web service framework based on Docker,Swarm,Consul and Nginx[J].Telecommunication technology,2016(11):21-25.
[16]肖俊.基于Docker的跨主机容器集群自动伸缩设计与实现[D].西安:西北大学,2015:12-15.
XIAO Jun.Based on the Docker across the cluster host container automatic telescopic design and implementation[D].Xi'an:Northwestern university,2015:12-15.
[17]苗立尧.基于Docker容器的混合式集群伸缩方法研究[D].西安:西安邮电大学,2016:23-25.
MIAO Liyao.Research on Hybrid Clustering Method Based on Docker Container[D].Xi'an:Xi'an University of Posts and Telecommunications,2016:23-25.
[18]谢晓燕,张静雯.一种基于Linux集群技术的负载均衡方法[J].西安邮电大学学报,2014(3):64-68.
XIEXiaoyan,ZHANGJingwen.A Load Balancing Method Based on Linux Cluster Technology[J].Journal of Xi'an University of Post and Telecom,2014(3):64-68.
[19]龚正,吴治辉,王伟,等.Kubernetes权威指南[M](第2版).北京:电子工业出版社,2016:27-33.
GONG Zheng,WU Zhihui,WANG Wei,et al.Kubernetes Authoritative Guide[M](2nd edition).Beijing:Electronic Industry Press,2016:27-33.
[20]浙江大学SEL实验室著.Docker容器与容器云[M](第2版).北京:人民邮电出版社,2016:53-57.
Zhejiang.University SEL laboratory.Docker Container&Container Cloud[M](2nd Edition).Beijing:People's Posts and Telecommunications Press,2016:53-57.