基于Docker的私有云系统的设计
2016-05-23蔡云龙
蔡云龙
摘要:随着移动设备的兴起,数据与日剧增,每天都会产生大量的数据。云计算为中小型企业或者个人提供数据的存储与计算服务,节省了存储计算成本。但是云计算带来便利同时也存在一定的风险,用户一般将数据存储在公有云中,而公有云系统中多个用户共享计算资源,用户无法确切地知道可控的资源运行在何处,存储在公有云中的数据,有极大地风险被非法使用。本文在分析云安全风险的基础上,提出一种基于Docker技术的私有云设计方案并进行验证。
关键词:云计算;公有云;风险;Docker
引言
未来几年是个人云计算的时代,每个人每天都在使用着大数据,是大数据中的一员。比如一个家庭拍摄的各种图片、视频和各种传感器数据,在一两年很快就会达到TB级,而且这样的增长速度会越来越快。随着物联网进程的加快,每个人每天将产生大量的个人隐私数据,这些数据可能包括健康数据、家电数据和个人移动位置信息等等,人们会对这些数据的安全性更加关注,而公有云的劣势将无限放大。研究开发私有云系统将会从本质上对这个问题进行一定的缓解。私有云相比于传统的公有云有以下几点好处:
第一点,防止数据被窃取。公有云存储服务往往是和用户的某些平台账号绑定在一起的,或者与用户的某个邮箱绑定在一起的,一旦平台账号或邮箱被黑客获取,所有的数据就一览无余了。再加之网络上社工库泛滥,很多用户喜欢在各种网络服务上使用相同的密码,往往是某一个账号失窃,所有数据全部暴露。
第二点,防止数据被主动泄漏。用户将数据托管在第三方的云平台上,无法保证云服务提供商不把用户数据提供给其他人使用。
第三点,防止数据遗失。2009年底微软的SIDEKICK事件,导致邮件服务器中断一周,而用户数据却未曾备份而丢失。还有2010年,阿里云服务器磁盘错误,导致TeamCola数据丢失等等。
从以上几点可以看到,构建家庭私有云是非常必要的。能够保证自己的私人数据与其他互联网账号无关,不被搜索引擎索引,不被别人监视。用户部署的私有云能够保证服务器运行并做好数据备份。如果仅在家庭或公司内部使用可以部署在内网,安全系数更高。
在私有云的环境下(如图1所示),用户的云端服务器再也不是云服务商所提供,而是用户拥有自己的服务器,用户可以使用手持终端与自己的私有云服务器随时随地通信。这种情况下,除了私有云服务器本身不可抗外力的因素,服务器与数据是百分之百安全的,用户只需要利用APP登录自己的云端服务器就可以实现私人数据的存储与重要数据的同步。
1.Docker与SeafiIe的介绍
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app)。几乎没有性能开销,可以很容易地在机器和数据中心运行。最重要的是,他们不依赖于任何语言、框架或包装系统。Docker能简化我们的云存储搭建过程,还能使其更安全地运行,更方便的维护。
Docker共享一个操作系统,使用容器的概念抽象起来,可以将Docker理解成一种沙盒(Sandbox),每个Docker容器内运行一个应用,不同容器之间互相隔离,每个容器拥有自己的lP地址,并且可以在网络中被识别。因此Docker容器是一个可访问网络的独立设备,这在概念上类似于虚拟机,使得Docker容器与传统的chroot的概念不同。Docker技术可以使容器跨越物理机器的障碍,不同主机之间的容器可以建立通信机制,可以实现用户应用数据更好的备份,可以简化分布式系统构建的过程,如图2所示。Docker作为一种操作系统层次上的虚拟化方式,不需要额外的虚拟机管理应用和虚拟机操作系统,Docker可以直接复用本地物理主机的操作系统,因此更加轻量级,可以大大减少对硬件配置的要求。比起传统的虚拟机技术有很多新的特性,表1是Docker与传统的虚拟机技术在特性上的比较。
Docker提供了一种灵活的分层技术,你可以使用所需的组件来配置自己的容器。有一个叫作层的容器组件,一层就是一个容器镜像。一般从基础层开始,基础层通常就是你想在容器中使用的操作系统的类型(容器管理器只提供您所需的操作系统的部分,并非主机操作系统)。如果想在容器中运行其他脚本文件,需要构建容器的配置和增加层。这样使得程序的开发使用是十分灵活的。例如在图2中,一个应用程序或服务容器需要PHP 5.5框架,就需要配置相应的容器。另一个应用程序或者服务需要PHP5.6框架,同样仅需利用PHP 5.6配置对应的容器即可。它不像虚拟机那样,改变当前运行的版本时需要进行大量的配置和安装步骤。利用容器,仅需在容器配置文件过程中重新定义下该层即可。
Seafile是2013年国内一个团队开发的开源云存储系统,提供了丰富的文件同步和管理功能,还有更好的数据隐私保护以及群组协作功能。在本文中,利用Seafile实现用户对数据的上传、下载、同步功能。除此之外,Seafile还有完善的隐私保护,用你的密码来加密文件,实现共享,可靠的文件储存,完整的快照、恢复说明,支持实时数据备份。提供操作历史、镜像恢复功能,可恢复在指定时间内被删除的文件,减少误操作的影响,日志功能齐全,便于审计,免费并易于部署,界面友好。
2.私有云系统构建
分析本系统可知,主要是数据的存储和管理,所以由两层组成:数据存储层和服务提供层。
2.1分布式存储环境建立
本项目中,以Docker容器为计算存储节点,构建分布式环境,采用的分布式文件系统为MooseFS。MooseFS是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备、字符设备、管道和套接字),符号链接,硬链接。在图3中可以看到,数据存储层使用的是MooseFS文件系统,主要由Master、Metalogger和Chunkserver这些部分组成。master负责在整个系统中管理数据。是整个系统的维护者。Metalogger做master数据备份的节点。chunkserver是mrs系统中的数据存储者,真正的用户数据按照算法被分成chunk,并分发到各个chunkserver上,这样就保证了数据的安全性,本项目中低层存储部署的方案如图3所示。
这里需要注意的一点是,MooseFS的客户端程序也就是加载MooseFS磁盘系统的命令是使用fuse编写的,因此要想挂载MooseFS的服务器,必要的前提条件就是先安装fuse,这样编译MooseFS的时候才能顺利通过。接下来,来看看此分布式文件的读写过程。
读取数据的时候分为六步,如图4所示(图中粗线为数据流方向,细线为控制消息方向)。首先应用程序向客户端发起访问请求,提交访问表(filename,byte range);然后客户端将访问表转换成可以识别的形式(filename,chunk index),然后发给master节点;接下来master节点返回给客户端数据块句柄以及数据块的位置;客户端按照master节点提供的信息,发送数据块句柄以及数据读取范围到相应的chunkserver上;chunkserver将所请求的数据发回给客户端;最后客户端将数据拷贝到应用程序中。
写入数据到MooseFS中比较复杂一些,共分为九步,如图6所示。因为分布式系统中存在三个备份,在读取数据的时候只需要从这三个其中之一读取即可,但是写入数据的时候,必须往这三个备份里面都写入数据。首先,应用程序发起写入数据的请求,将文件名与数据发送给客户端;接下来客户端将请求表(文件名,数据)转换成块句柄(文件名,块索引),然后发送给master节点;master节点将块句柄和三个备份的位置全部返回给客户端:然后客户端将数据写到所有待写Chunkserver的内部buffer中;客户端发送写指令到主备份Chunkserver,主备份Chunkserver按照一定的顺序依次从buffer中把数据写入到数据块中,主备份Chunkserver写入操作完成后,由主备份Chunkserver发送同样写操作指令给次备份Chunkserver执行写任务,次备份Chunkserver写入数据完成后,向主备份Chunkserver报告写入状态,然后主备份Chunkserver向客户端返回写入状态。如果以上任意一个Chunkserver写入失败,客户端会建议新的节点进行再次写入。
2.2用户接口通信模块设计
与用户交互的接口主要使用Seafile完成。Seafile服务端主要由HEpserver、Seahub、Seafile、Ccnet和Task Deamon这几大模块组成。这几个模块的功能是:Ccnet主要负责通信,是内部的RPC服务进程,连接其他几个组件;Seahub主要提供网页页面,供用户管理自己在服务器上的数据和账户信息;Httpserver主要负责网页端的文件上传与下载;Seafile是整个架构的核心,其功能是实现对原始文件的上传、下载和同步,是整个框架进行数据处理的实际执行者;Task Deamon主要处理后台邮件收发等任务。在模块的实现方面,Ccnet、Seafile和HttpServer这三个模块,主要使用C语言编写,架构上主要采用libevent事件循环与线程池处理异步任务。Seahub使用python Django框架实现,主要通过一个轻量级的python http服务器Gunicorn来提供网站支持服务,Seahub是作为Gunicorn一个进程来运行。Task Deamon主要采用python实现。Seafile的架构如图6所示。
3.整体系统搭建与测试
本项目从小型化、易使用的角度出发,针对的环境主要是家庭,综合考虑之下,使用的硬件为Wandboard Quad作为私有云的运行环境,Wandboard Quad是一块ARM开发板,其配置如图7所示。
采用Wandboard Quad的原因主要是由于它支持SATA接口,这样就可以将大容量廉价的硬盘接入开发板中做私有云系统的存储设备。系统整体的测试架构如图7所示。利用Docker容器技术将计算资源有效整合,扩充出五个节点,然后在此基础上利用MooseFS文件系统实现对单机资源的有效利用,实现对分块区域的高效使用,而且此系统也可与其他系统进行动态扩展,可以实现高的容错。然后在结合Seafile云存储系统实现对松散资源的集中管理,加密存储,从某种意义上解决了传统存储存在空间、加密和共享上的瓶颈。实现了私有云存储系统,保证了数据的隐私性,且易于扩展。
在测试中,在Wandboard Quad开发板上移植Ubuntu系统镜像,然后编译Linux内核使得内核版本在Linux3.8以上,再编译Uboot,设置系统启动参数。本项目中为了便于调试,采用tftp的方式进行Linux系统的启动,系统的内核镜像从上位机交叉开发环境/tftpboot/Wandboard目录下获取内核镜像。首次启动开发板,进入Uboot环境需要设置参数,其
setenv ethact sms0
setenv ethaddr 00:10:75:2A:AE:EO
setenv gatewayip 10.234.56.1
setenv netmask 255.255.255.O
setenv serverip 10.234.56.32
setenv usbethaddr 00:10:75:2A:AE:EO
setenv ipaddr 10.234.56.120
setenv bootargs console=$(console),$(baud rate)$(optargs)root=/dev/ram video=$(video)
usb start
tftp 0x40008000 Wandboard/zlmage
bootm
经过上面的一系列工作完成后。Ubuntu系统就可以成功在Wandboard Quad开发板上运行,然后再进行网络环境的配置,接下来继续移植Docker到Wandboard Quad开发板,接下来再完成MooseFS分布式系统的构建,分布式系统的Master节点担任seafile服务器的角色。用户访问私有云的时候,docker通过内部的端口映射,直接可以将用户的请求发送到内部的master节点上,然后由master节点完成数据的存储访问任务。
4.总结
本文以最新的容器化技术Docker为基础搭建私有云存储系统,致力于解决家庭环境中,数据存储的问题。以小型化、易部署为目标,在Wandboard Quad开发板上搭建验证。本系统可以实现家庭用户对数据存储的需求,而且便携,占用的面积较少,而且采用Docker技术,系统的可集成度很高,当用户需要添加某个应用时,可以直接创建一个Docker容器,直接运行,不用考虑兼容性的问题,极大地简化了部署服务的周期,并且,为了数据的可靠性,防止单点硬件故障,用户可以使用两块Wandboard Quad板进行部署,或者多块,利用MooseFS分布式系统的容错性,可以实现多数据的高可靠性地存储。