在2016杭州云栖大会第二日,韵达快运集团高级总监张磊在智慧物流专场分享了《大数据在物流行业应用突破——大规模云上调度实践》。他主要从韵达上云过程、云上资源调度实践、未来发展三个方面进行了分享,详细介绍了韵达上云的过程和经验,以及Docker技术的实践。
以下内容根据演讲PPT及现场分享整理。
韵达上云分享
进度
上图是韵达上物流云的整个进度。刚开始讨论是否上物流云的时候,还是很纠结的。整个的核心系统要从IDC机房整体搬上物流云的过程中会遇到哪些问题?如何保证业务不受影响?所以前期和菜鸟进行了多次的合作讨论和方案论证。项目立项完成之后,针对十六个核心的业务系统(订单、COD、仓储、客服、跨境等)进行了拆分,降低关联性。上云之后继续和菜鸟进行深度合作,解决上云之前遇到的一些问题(系统架构优化、云上数据推送、大数据分析、全链路日志监控等)。
混合云架构
上图左边部分是韵达自有的IDC机房的一些应用服务,主要为涉及财务结算的系统。中间部分是韵达核心系统上云之后的架构图。右边是跨境业务在香港机房的系统架构图。从图中可以看出,上云过程中做了很多系统改造工作,比如使用多可用域、跨多个物理机房做了相关的集群部署。
遇到的问题
典型的问题是数据迁移。怎么在线下把韵达大量的数据搬到云上又不能对线下的系统造成影响?最终讨论得到的解决方案是:在云上用了一台ECS服务器安装了MySQL的备库,对IDC机房做了一个主从的同步,使用了阿里云DTS工具从中间库向最终的目标RDS库进行数据同步。这个方案可同时实现存量数据迁移、增量数据同步到云上,数据同步的网络延迟毫秒级(DTS同步速度理论上可达到70Mbps)。
成本与效益
上云之后,投入成本大大降低,云上运维变得简单。
云上资源调度实践
考虑到降低ID成本,采用了Docker技术。Docker是集装箱演变过来的,集装箱可以对货物进行标准化的分装,不同集装箱之间可以做很好的隔离,Docker就是引用这种理念产生的。
什么是Docker?
- Docker基于容器技术的轻量级虚拟化解决方案;
- Docker是容器引擎,把Linux的cgroup、namespace等容器底层技术进行封装抽象,为用户提供了创建和管理容器的便捷界面(包括命令行和API);
- Docker 是一个开源项目,诞生于2013 年初,基于Google 公司推出的Go语言实现;
- 微软,红帽Linux,Oracle等主流IT厂商在各自产品增加对Docker的支持。
为什么要使用Docker?
- 作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势;
- 首先,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;
- 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Docker容器;
- 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可。
更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
对比传统虚拟机总结
上图从六个维度将Docker和传统虚拟机进行了对比。
传统型软件开发、测试、上线过程
从上图可以很明显的看到,从开始搭建开发环境到测试,再到上线,是一个很繁琐的过程。这个过程中存在以下不足之处:资源利用效率低;单物理机多应用无法有效隔离(进程空间,cpu资源,磁盘);运维部署不便;测试、版本管理复杂;迁移成本高;传统虚拟机,空间占用大,启动慢,管理复杂。
以Docker为单位的开发部署流程设计
采用Docker仓库,把需要的环境封装好,把相关的镜像上传到仓库里面。开发人员直接从仓库里获取相关的镜像来进行相关的开发测试。测试人员和运维人员同样可以从仓库获取相关镜像进行相关工作。整个过程十分便捷,而且占用的资源比较少。
Docker交付过程
开发人员编写好代码之后,进行环境定义,最终把定义好的文件打包封装成一个镜像上传到仓库中。当存在对多个Docker镜像进行管理的时候,可能会遇到一些问题,Docker官方提供了Docker-compose工具。这个工具多个具有依赖关系的镜像进行管理。
Docker踩过的“坑”
- dockerfile不要放到代码根目录下,docker编译dockerfile时,会把dockerfile同级目录所有文件传递给docker deamon,避免大量文件传递给docker deamon,导致内存爆掉;
- Dockerfile行数尽可能少,否则最终生成的镜像会很大;
- Dockerfile注意字符编码环境变量以及时区设置。
Docker相对虚拟机不足之处
- 安全性问题。docker目前并不能分辨具体执行指令的用户,只要一个用户拥有执行docker的权限,那么他就可以对docker的容器进行所有操作,不管该容器是否是由该用户创建。比如A和B都拥有执行docker的权限,由于docker的server端并不会具体判断dockerclient是由哪个用户发起的,A可以删除B创建的容器,存在一定的安全风险;
- docker目前还在版本的快速更新中,细节功能调整比较大。一些核心模块依赖于高版本内核,存在版本兼容问题。
未来与挑战
怎样自动化的完成后续交付和部署的工作?目前采用的方式是开发人员把代码上传到SVN上,通过第三方的开源工具、自动化的发布工具进行相关的管理工作。后续跟菜鸟多次探讨之后,可能会使用阿里云的持续交付平台来解决持续发布过程中遇到的一些问题。
未来计划做的一些工作:
- 优化:Docker本身的性能优化,比如,dockercontainer 在stdout/stderr有大量数据传输会导致内存泄露;
- 监控:服务级别的监控;
- 负载均衡:容器根据机器负载情况自动迁移;
- 统一管理页面:统一的根据服务来管理的WEB页面;
- 微服务:应用程序功能模块拆分,适应Docker的使用。