发明内容
本发明的目的是:提供一种分布式图片存储系统,能够提高图片处理速度,提升系统稳定性,实现海量图片数据的存储和访问。
基于以上情况,本发明基于分布式系统具有多个计算节点,具备保证系统的一致性、侦测故障节点、数据恢复、均衡负载、线性扩展等特点提出了一种分布式图片存储系统。
本发明分布式图片存储系统由三个子系统组成,包括:
一、图片上传提交子系统,图片上传提交子系统用于接收客户端提交的图片字节流,对原始图片进行信息提取、压缩、加数字水印等处理,这些处理均采用并行方式执行,最后将处理后的图片存储到图片存储子系统中。
二、图片存储子系统,图片存储子系统可基于分布式文件存储数据库构建,如基于Mongodb的GridFS构建,其是一种由多个节点和分片组成的分布式文件存储系统,其中每一个节点中包含多个分片,实现数据的分块存储,提供系统的高可用性。采用一致性Hash算法来协调多个节点运作,通过心跳机制来定位故障节点,通过选举算法选举主控节点,能在不终止服务的情况下动态的添加或移除节点,动态调节图片存储子系统的存储容量。
三、图片读取子系统,图片读取子系统利用Web服务器,如高性能web服务器Nginx向用户提供访问图片存储子系统中的图片服务,通过Nginx处理访问请求,解析请求参数,根据参数不同实现读压缩功能,给用户传输不同大小的图片,以实现根据用户的需求为用户提供不同压缩比的图片的目的。
为实现本发明之目的,采用以下技术方案予以实现:
本发明的技术方案如下:
分布式图片存储系统主要分为三个子系统:图片上传提交子系统、图片存储子系统和图片读取子系统。各个子系统均以分布式架构部署到不同的设备上,每个子系统也是集群的运作方式。
一、图片上传提交子系统
该系统接收客户端提交的图片字节流,对原始图片进行提取信息、压缩、数字水印等处理后,再与图片存储子系统交互,将图片存储在图片存储子系统上。系统采用高效的二进制传输协议Hessian,接收客户端传来的图片,在收到图片后还要对原始图片做一定的处理,包括提取图片信息,根据用户要求进行压缩,还可以在图片上添加水印,这些图片处理可通过基于开源框架Hadoop的MapReduce并行化进行。提交子系统的服务器通过Tomcat接收请求,然后启动MapReduce任务,任务执行完毕后返回到主线程,响应客户端。由于Hessian协议的语言无关性可以实现多语言客户端,Hessian协议有很多开源实现版本,包括Java、Python、C++、.Net、Php、Ruby等,所以提交子系统也可以同时支持多种语言的客户端。
对于图片处理(MapReduce任务),该子系统采用多次任务分片(Map),一次整合(Reduce)的方式处理图片。多次Map是指每一种图片处理都是一个Map任务,Map任务完成后将输出传给下一个Map任务进行处理,当判定图片处理已经完成时,启动Reduce任务提交到存储子系统中。如此设计可以实现图片的管道化处理,这些管道可以在不同的节点(如Hadoop节点)上进行,可以同时并发处理多个提交请求,提高系统的并发能力。
二、图片存储子系统
图片存储子系统承载着图片的物理存储和索引机制,在整个系统中处于非常重要的地位。该系统可基于分布式文件存储数据库如Mongodb和对象存储结构如GridsFS实现,采用分片架构如Sharding架构,在其基础上通过一致性Hash算法实现可以保证数据一致性的访问层。通过心跳机制检查故障节点,基于二进制日志提高数据恢复效率。
系统底层采用分布式文档存储数据库,如Mongodb集群架构,使用大对象存储结构如GridFs结构进行物理存储,对外采用访问控制代理模块,如mongoproxy,主要功能包括实现读写分离和连接池(预先生成的多个连接)。如图2所示,该子系统包括:
数据库分片(如Shards):一个shard为一组mongodb物理数据库集群,由多个分片shard共同组成一个副本集合,每个shard上的数据为某一范围的数据块,可以支持指定shard范围的查询。数据在shard中的存储方式是按块存储的,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成两块。当shard的数据过多时,数据块将被迁移到系统的其他shard中。另外,新的shard加入时,数据块也会迁移,即多个数据库分片分别存储某数据的一部分,组成该完整的数据,当增加数据库分片时,重新计算每个分片上应存储的所述数据的一部分,各数据库分片重新存储按计算结果得到的该数据的一部分。
备份块(如Replicaset):由多个存储数据相同、地位平等的mongodb物理数据库集群共同组成,用于存储备份数据块,如上述副本集合。
控制中心(如Mongos):可以有多个,相当于一个控制中心,负责数据请求的路由和协调操作,包括请求分发、数据整合等,使得mongodb集群像一个整体的系统。
用于提供配置接口、以访问控制中心的配置服务器(Configserver):该配置服务器用于存储每个shard、replicaset、节点和块数据的基本信息。每个configserver上都有一份所有块数据信息的拷贝,以保证每台configserver上的数据的一致性。
访问控制代理模块(如Mongoproxy):是一个提供实现读写分离、维护连接池的代理模块。读写分离是将客户的读请求和写请求进行分离,分别转发给不同的任务处理模块进行处理,在执行写请求时,mongod进程就不会再接受其他任务请求,提高系统性能。
三、图片读取子系统
图片读取子系统面向的是终端浏览图片的用户,通过Httpurl的方式提供图片浏览服务。url格式与参数如下:
http://{image_server}/imgname/{encoded_pic_id}.jpg?scale={x|m|s|size}
image_server:图片浏览请求处理Http服务器域名或ip;
ecode_pic_id:图片id加密后的字符串;
scale:图片尺寸x、m、s分别指大、中、小图片,同时支持大于0的数字,指定图片的一边(长边或短边)变为这个数字,另一边(短边或长边)则根据图片的原来长度宽比进行伸缩得到。
图片读取子系统介于最终浏览用户和存储子系统之间,主要功能是接受用户请求,从存储子系统中获取图片,然后响应给用户。这个过程还包括缓存交互和图片压缩等。
该系统的http请求处理基于web服务器,如Ngnix实现,Nginx收到Http请求之后,根据配置文件和负载均衡算法选择该子系统的具体模块(如过滤,重定向、反向代理、缓存、读取等)进行处理,处理模块执行处理之后,把结果输出给客户端。
该系统的缓存功能是基于分布式内存对象缓存系统,如memcached实现,memcached是一个开源的基于内存对象的分布式缓存系统。采用与web服务器如Ngninx集成的方式,web服务器Nginx在处理请求的过程中会先去memcached缓存中查找图片数据,如果没有命中才会去数据库中查询图片,这样的实现方式进一步提高了系统的响应速度。
一种分布式图片存储系统,包括图片上传提交子系统、图片存储子系统和图片读取子系统,其特征在于:
图片上传提交子系统用于接收客户端提交的图片字节流,对原始图片进行处理,再将处理后的图片存储在图片存储子系统上;
图片存储子系统包括分布式文件存储数据库,用于存储图片;
图片读取子系统用于接收客户端的图片处理请求,将该请求的图片处理结果返回给客户端。
所述的分布式图片存储系统,优选的:
该图片上传提交子系统包括服务器、信息提取模块、图片压缩模块、数字水印模块和应用接口模块;其中:
服务器用于通过应用接口模块接收客户端提交的图片二进制字节流,服务器将该二进制流复原为图片后将该复原后的图片保存到内存中,再将图片传输给信息提取模块处理,之后再由图片压缩模块处理,最后由数字水印模块处理。
所述的分布式图片存储系统,优选的:
信息提取模块用于提取图片信息;
图片压缩模块用于对图片进行压缩;
数字水印模块用于对图片添加水印。
所述的分布式图片存储系统,优选的:
所述信息提取模块、图片压缩模块、数字水印模块、应用接口模块均能够对多张图片进行并行处理。
所述的分布式图片存储系统,优选的:图片存储子系统包括以下部分:
(1)数据库分片,每个数据库分片为一组数据库集群,用于存储预定大小的数据块;
(2)数据库备份块,每个数据库备份块由多个存储数据相同、地位平等的数据库集群组成,用于存储备份数据块;
(3)配置服务器,用于提供配置接口,以访问控制中心;
(4)控制中心,用于负责路由和协调操作;
(5)访问控制代理模块,用于实现读写分离和连接池维护。
所述的分布式图片存储系统,优选的:
图片读取子系统包括图片请求处理模块、图片处理模块和图片缓存模块;
图片请求处理模块用于对收到的客户端请求进行负载均衡处理,之后交由图片处理模块处理,图片处理模块执行以下操作:重定向、反向代理、缓存读取,并把处理结果通过过滤模块过滤之后将结果返回给客户端;
图片读取子系统通过图片请求处理模块接收图片处理请求,在处理图片读请求的时候会先到图片缓存模块中查找是否存在请求的图片。
所述的分布式图片存储系统,优选的:读写分离是将客户端的读请求和写请求进行分离,分别转发给不同的进程,在执行写请求时,该进程就不会再接受其他请求。
所述的分布式图片存储系统,优选的,所述图片存储子系统通过以下方式对上传文件的完整性进行校验:客户端在上传图片文件时,通过访问控制代理模块与控制中心交互,控制中心在初始化的时候已经从配置服务器中获取了分片的基本信息,控制中心将用户请求根据路由规则路由到分片上,每个分片都返回其所存储数据是否已经存储成功的通知,然后控制中心整理返回的结果;如果返回的信息都是都存储成功,则标志着整个文件或图片存储成功,控制中心将上传存储结果整理为成功并返回给访问控制代理模块,如果有一个不成功,则控制中心将上传存储结果整理为不成功并返回给访问控制代理模块;最后通过访问控制代理模块返回给客户端,客户端即可获知图片上传存储是否成功的信息。
所述的分布式图片存储系统,优选的:数据库分片包括一组物理数据库集群,由多个数据块分片共同组成一个数据文件副本集合,每个分片存储该副本结合的一部分,数据在分片中的存储方式是按块存储的,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成两块。当数据库的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的shard加入时,数据块也会迁移,即当增加数据库分片时,重新计算每个分片上应存储的所述数据的一部分,各数据库分片重新存储按计算结果得到的该数据的一部分。
具体实施方式
如图1所示,分布式图片存储系统包括图片上传提交子系统、图片存储子系统和图片读取子系统。
1、图片上传提交子系统:如图2所示,该图片上传提交子系统包括服务器、信息提取模块、图片压缩模块、数字水印模块、应用接口模块。图片上传提交子系统以Hessian协议与客户端交互,因为Hessian协议底层实现是基于Http协议的,所以能够被广泛支持。服务器通过应用接口模块接收到客户端提交过来的图片二进制流后,先将二进制流复原为图片,将该复原后的图片保存到内存中,再将图片传输给信息提取模块处理,之后再由图片压缩模块处理,最后由数字水印模块处理。也可以根据客户端的请求选择以上处理模块之一或组合对图片进行处理。这些模块的处理执行在分布式系统架构上,如Hadoop集群之上,当多个用户同时提交图片时,多个服务器以及多个上述模块可以同时处理多个用户的图片上传接收、处理等任务,由此可以并发执行处理,提高了处理效率。处理之后的图片存储到图片存储子系统中。应用接口模块用于提供图片上传子系统与客户端之间的连接,客户端可以通过Rest风格的web接口访问该应用接口模块。
2、图片存储子系统:包括:分布式数据库集群(如Mongodb集群架构),采用对象存储结构如GridFs结构进行文件存储;访问控制代理模块。其中数据库集群采用Shard方式部署;数据文件存储模块则采用GridFs将数据文件分块进行分布式存储;访问控制代理模块,如专门对外进行访问控制的mongoproxy,进行读写分离和连接池(预先生成的多个连接)维护。
参见图3该系统主要包含以下几部分:
(1)数据库分片(shard),每个shard为一组数据库集群(如mongod)。通常由多个shard共同组成一个副本集合,该集合包含完整的图片数据存储数据块,每个shard上的数据为某一范围的数据块,可以支持指定shard范围的查询。数据在shard中的存储方式是按块存储的,数据块大小为200M,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成两块。当shard的数据过多时,数据块将被迁移到系统的其他shard中。另外,新的shard加入时,数据块也会迁移。
(2)数据库备份块(replicaSet),由多个存储的数据一样、地位平等的数据库集群mongod组成一个数据库备份块replicaSet。
(3)配置服务器(configserver),提供配置接口,以访问控制中心,配置信息存储在configserver中,其中存储着每个Shard、ReplicaSet节点以及其数据块的基本信息。每个configserver上都有一份所有块信息的拷贝,以保证每台configserver上的数据的一致性。
(4)控制中心(mongos,可以有多个,相当于一个控制中心),负责数据请求的路由和协调操作,控制中心通过统一Hash算法计算出请求数据存储在那些数据库节点当中,并将请求路由到这些节点进行操作,最后将操作结果整合返回给客户端,使得集群像一个整体的系统。
(5)访问控制代理模块(mongoproxy),主要实现读写分离和连接池维护功能。读写分离是将客户端的读请求和写请求进行分离,分别转发给不同的进程,在执行写请求时,该进程就不会再接受其他请求,提高系统性能。图片存储子系统可对上传文件完整性进行校验:具体过程为客户端通过访问控制代理模块与控制中心交互,控制中心在初始化的时候已经从配置服务器中获取了分片的基本信息,控制中心将用户请求根据路由规则路由到shard分片上,每个分片都返回其所存储数据是否已经存储成功的通知,然后控制中心整理返回的结果(如果返回的信息都是都存储成功,则标志着整个文件或图片存储成功,控制中心可以将上传存储结果整理为成功并返回给访问控制代理模块,如果有一个不成功,则控制中心将上传存储结果整理为不成功并返回给访问控制代理模块),最后通过访问控制代理模块返回给客户端,客户端即可获知存储是否成功的信息。连接池维护功能提供了一个完整数据库访问池,根据配置维护请求线程,动态增加和减少线程数量,减少资源浪费。
3、图片读取子系统:该子系统包括图片请求处理模块(可基于开源高性能Http服务器Nginx实现,也称为web服务器)、图片缓存模块(分布式缓存模块,如Memcached,以提高系统的响应速度)、处理模块和过滤模块。
图片请求处理模块是一个自定义的Nginx模块,使用handler类型的模块开发。该模块的主要功能对收到的Http请求进行负载均衡处理,将请求根据平均分配算法进行计算,决定是否由其本身处理该请求还是重定向请求到其他web服务器实现负载均衡,之后交由处理模块处理,处理模块执行包括重定向、反向代理、缓存、读取的操作,并把处理结果通过过滤模块过滤(如根据请求的图片格式、图片尺寸等)之后将结果返回给客户端。
图片缓存模块基于分布式缓存Memcached框架而实现。
图片读取子系统通过请求图片处理模块接收图片处理请求,在处理图片读请求的时候会先到图片缓存模块中查找是否存在请求处理的图片,如果命中则直接返回给用户,否则继续正常流程,也即通过分布式数据库在分布式存储系统中进行查询该图片。
通过本发明,能提高网站的访问速度和运行效率,并可动态增加图片服务器的数量满足日益增加的性能需求。本发明把图片数据和网站内容分开部署、在数据库中记录和维护图片服务器状态信息等方法实现图片和页面数据的分离。结果表明,该技术能提高网站的访问速度和运行效率,并可动态增加图片服务器的数量,满足日益增加的性能需求。